1 #ifndef REDISMODULE_H
2 #define REDISMODULE_H
3 
4 #include <sys/types.h>
5 #include <stdint.h>
6 #include <stdio.h>
7 
8 /* ---------------- Defines common between core and modules --------------- */
9 
10 /* Error status return values. */
11 #define REDISMODULE_OK 0
12 #define REDISMODULE_ERR 1
13 
14 /* API versions. */
15 #define REDISMODULE_APIVER_1 1
16 
17 /* API flags and constants */
18 #define REDISMODULE_READ (1<<0)
19 #define REDISMODULE_WRITE (1<<1)
20 
21 /* RedisModule_OpenKey extra flags for the 'mode' argument.
22  * Avoid touching the LRU/LFU of the key when opened. */
23 #define REDISMODULE_OPEN_KEY_NOTOUCH (1<<16)
24 
25 #define REDISMODULE_LIST_HEAD 0
26 #define REDISMODULE_LIST_TAIL 1
27 
28 /* Key types. */
29 #define REDISMODULE_KEYTYPE_EMPTY 0
30 #define REDISMODULE_KEYTYPE_STRING 1
31 #define REDISMODULE_KEYTYPE_LIST 2
32 #define REDISMODULE_KEYTYPE_HASH 3
33 #define REDISMODULE_KEYTYPE_SET 4
34 #define REDISMODULE_KEYTYPE_ZSET 5
35 #define REDISMODULE_KEYTYPE_MODULE 6
36 #define REDISMODULE_KEYTYPE_STREAM 7
37 
38 /* Reply types. */
39 #define REDISMODULE_REPLY_UNKNOWN -1
40 #define REDISMODULE_REPLY_STRING 0
41 #define REDISMODULE_REPLY_ERROR 1
42 #define REDISMODULE_REPLY_INTEGER 2
43 #define REDISMODULE_REPLY_ARRAY 3
44 #define REDISMODULE_REPLY_NULL 4
45 
46 /* Postponed array length. */
47 #define REDISMODULE_POSTPONED_ARRAY_LEN -1
48 
49 /* Expire */
50 #define REDISMODULE_NO_EXPIRE -1
51 
52 /* Sorted set API flags. */
53 #define REDISMODULE_ZADD_XX      (1<<0)
54 #define REDISMODULE_ZADD_NX      (1<<1)
55 #define REDISMODULE_ZADD_ADDED   (1<<2)
56 #define REDISMODULE_ZADD_UPDATED (1<<3)
57 #define REDISMODULE_ZADD_NOP     (1<<4)
58 
59 /* Hash API flags. */
60 #define REDISMODULE_HASH_NONE       0
61 #define REDISMODULE_HASH_NX         (1<<0)
62 #define REDISMODULE_HASH_XX         (1<<1)
63 #define REDISMODULE_HASH_CFIELDS    (1<<2)
64 #define REDISMODULE_HASH_EXISTS     (1<<3)
65 
66 /* Context Flags: Info about the current context returned by
67  * RM_GetContextFlags(). */
68 
69 /* The command is running in the context of a Lua script */
70 #define REDISMODULE_CTX_FLAGS_LUA (1<<0)
71 /* The command is running inside a Redis transaction */
72 #define REDISMODULE_CTX_FLAGS_MULTI (1<<1)
73 /* The instance is a master */
74 #define REDISMODULE_CTX_FLAGS_MASTER (1<<2)
75 /* The instance is a slave */
76 #define REDISMODULE_CTX_FLAGS_SLAVE (1<<3)
77 /* The instance is read-only (usually meaning it's a slave as well) */
78 #define REDISMODULE_CTX_FLAGS_READONLY (1<<4)
79 /* The instance is running in cluster mode */
80 #define REDISMODULE_CTX_FLAGS_CLUSTER (1<<5)
81 /* The instance has AOF enabled */
82 #define REDISMODULE_CTX_FLAGS_AOF (1<<6)
83 /* The instance has RDB enabled */
84 #define REDISMODULE_CTX_FLAGS_RDB (1<<7)
85 /* The instance has Maxmemory set */
86 #define REDISMODULE_CTX_FLAGS_MAXMEMORY (1<<8)
87 /* Maxmemory is set and has an eviction policy that may delete keys */
88 #define REDISMODULE_CTX_FLAGS_EVICT (1<<9)
89 /* Redis is out of memory according to the maxmemory flag. */
90 #define REDISMODULE_CTX_FLAGS_OOM (1<<10)
91 /* Less than 25% of memory available according to maxmemory. */
92 #define REDISMODULE_CTX_FLAGS_OOM_WARNING (1<<11)
93 /* The command was sent over the replication link. */
94 #define REDISMODULE_CTX_FLAGS_REPLICATED (1<<12)
95 /* Redis is currently loading either from AOF or RDB. */
96 #define REDISMODULE_CTX_FLAGS_LOADING (1<<13)
97 /* The replica has no link with its master, note that
98  * there is the inverse flag as well:
99  *
100  *  REDISMODULE_CTX_FLAGS_REPLICA_IS_ONLINE
101  *
102  * The two flags are exclusive, one or the other can be set. */
103 #define REDISMODULE_CTX_FLAGS_REPLICA_IS_STALE (1<<14)
104 /* The replica is trying to connect with the master.
105  * (REPL_STATE_CONNECT and REPL_STATE_CONNECTING states) */
106 #define REDISMODULE_CTX_FLAGS_REPLICA_IS_CONNECTING (1<<15)
107 /* THe replica is receiving an RDB file from its master. */
108 #define REDISMODULE_CTX_FLAGS_REPLICA_IS_TRANSFERRING (1<<16)
109 /* The replica is online, receiving updates from its master. */
110 #define REDISMODULE_CTX_FLAGS_REPLICA_IS_ONLINE (1<<17)
111 /* There is currently some background process active. */
112 #define REDISMODULE_CTX_FLAGS_ACTIVE_CHILD (1<<18)
113 /* The next EXEC will fail due to dirty CAS (touched keys). */
114 #define REDISMODULE_CTX_FLAGS_MULTI_DIRTY (1<<19)
115 /* Redis is currently running inside background child process. */
116 #define REDISMODULE_CTX_FLAGS_IS_CHILD (1<<20)
117 
118 /* Next context flag, must be updated when adding new flags above!
119 This flag should not be used directly by the module.
120  * Use RedisModule_GetContextFlagsAll instead. */
121 #define _REDISMODULE_CTX_FLAGS_NEXT (1<<21)
122 
123 /* Keyspace changes notification classes. Every class is associated with a
124  * character for configuration purposes.
125  * NOTE: These have to be in sync with NOTIFY_* in server.h */
126 #define REDISMODULE_NOTIFY_KEYSPACE (1<<0)    /* K */
127 #define REDISMODULE_NOTIFY_KEYEVENT (1<<1)    /* E */
128 #define REDISMODULE_NOTIFY_GENERIC (1<<2)     /* g */
129 #define REDISMODULE_NOTIFY_STRING (1<<3)      /* $ */
130 #define REDISMODULE_NOTIFY_LIST (1<<4)        /* l */
131 #define REDISMODULE_NOTIFY_SET (1<<5)         /* s */
132 #define REDISMODULE_NOTIFY_HASH (1<<6)        /* h */
133 #define REDISMODULE_NOTIFY_ZSET (1<<7)        /* z */
134 #define REDISMODULE_NOTIFY_EXPIRED (1<<8)     /* x */
135 #define REDISMODULE_NOTIFY_EVICTED (1<<9)     /* e */
136 #define REDISMODULE_NOTIFY_STREAM (1<<10)     /* t */
137 #define REDISMODULE_NOTIFY_KEY_MISS (1<<11)   /* m (Note: This one is excluded from REDISMODULE_NOTIFY_ALL on purpose) */
138 #define REDISMODULE_NOTIFY_LOADED (1<<12)     /* module only key space notification, indicate a key loaded from rdb */
139 
140 /* Next notification flag, must be updated when adding new flags above!
141 This flag should not be used directly by the module.
142  * Use RedisModule_GetKeyspaceNotificationFlagsAll instead. */
143 #define _REDISMODULE_NOTIFY_NEXT (1<<13)
144 
145 #define REDISMODULE_NOTIFY_ALL (REDISMODULE_NOTIFY_GENERIC | REDISMODULE_NOTIFY_STRING | REDISMODULE_NOTIFY_LIST | REDISMODULE_NOTIFY_SET | REDISMODULE_NOTIFY_HASH | REDISMODULE_NOTIFY_ZSET | REDISMODULE_NOTIFY_EXPIRED | REDISMODULE_NOTIFY_EVICTED | REDISMODULE_NOTIFY_STREAM)      /* A */
146 
147 /* A special pointer that we can use between the core and the module to signal
148  * field deletion, and that is impossible to be a valid pointer. */
149 #define REDISMODULE_HASH_DELETE ((RedisModuleString*)(long)1)
150 
151 /* Error messages. */
152 #define REDISMODULE_ERRORMSG_WRONGTYPE "WRONGTYPE Operation against a key holding the wrong kind of value"
153 
154 #define REDISMODULE_POSITIVE_INFINITE (1.0/0.0)
155 #define REDISMODULE_NEGATIVE_INFINITE (-1.0/0.0)
156 
157 /* Cluster API defines. */
158 #define REDISMODULE_NODE_ID_LEN 40
159 #define REDISMODULE_NODE_MYSELF     (1<<0)
160 #define REDISMODULE_NODE_MASTER     (1<<1)
161 #define REDISMODULE_NODE_SLAVE      (1<<2)
162 #define REDISMODULE_NODE_PFAIL      (1<<3)
163 #define REDISMODULE_NODE_FAIL       (1<<4)
164 #define REDISMODULE_NODE_NOFAILOVER (1<<5)
165 
166 #define REDISMODULE_CLUSTER_FLAG_NONE 0
167 #define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1)
168 #define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2)
169 
170 #define REDISMODULE_NOT_USED(V) ((void) V)
171 
172 /* Bit flags for aux_save_triggers and the aux_load and aux_save callbacks */
173 #define REDISMODULE_AUX_BEFORE_RDB (1<<0)
174 #define REDISMODULE_AUX_AFTER_RDB (1<<1)
175 
176 /* This type represents a timer handle, and is returned when a timer is
177  * registered and used in order to invalidate a timer. It's just a 64 bit
178  * number, because this is how each timer is represented inside the radix tree
179  * of timers that are going to expire, sorted by expire time. */
180 typedef uint64_t RedisModuleTimerID;
181 
182 /* CommandFilter Flags */
183 
184 /* Do filter RedisModule_Call() commands initiated by module itself. */
185 #define REDISMODULE_CMDFILTER_NOSELF    (1<<0)
186 
187 /* Declare that the module can handle errors with RedisModule_SetModuleOptions. */
188 #define REDISMODULE_OPTIONS_HANDLE_IO_ERRORS    (1<<0)
189 /* When set, Redis will not call RedisModule_SignalModifiedKey(), implicitly in
190  * RedisModule_CloseKey, and the module needs to do that when manually when keys
191  * are modified from the user's sperspective, to invalidate WATCH. */
192 #define REDISMODULE_OPTION_NO_IMPLICIT_SIGNAL_MODIFIED (1<<1)
193 
194 /* Server events definitions.
195  * Those flags should not be used directly by the module, instead
196  * the module should use RedisModuleEvent_* variables */
197 #define REDISMODULE_EVENT_REPLICATION_ROLE_CHANGED 0
198 #define REDISMODULE_EVENT_PERSISTENCE 1
199 #define REDISMODULE_EVENT_FLUSHDB 2
200 #define REDISMODULE_EVENT_LOADING 3
201 #define REDISMODULE_EVENT_CLIENT_CHANGE 4
202 #define REDISMODULE_EVENT_SHUTDOWN 5
203 #define REDISMODULE_EVENT_REPLICA_CHANGE 6
204 #define REDISMODULE_EVENT_MASTER_LINK_CHANGE 7
205 #define REDISMODULE_EVENT_CRON_LOOP 8
206 #define REDISMODULE_EVENT_MODULE_CHANGE 9
207 #define REDISMODULE_EVENT_LOADING_PROGRESS 10
208 #define REDISMODULE_EVENT_SWAPDB 11
209 
210 /* Next event flag, should be updated if a new event added. */
211 #define _REDISMODULE_EVENT_NEXT 12
212 
213 typedef struct RedisModuleEvent {
214     uint64_t id;        /* REDISMODULE_EVENT_... defines. */
215     uint64_t dataver;   /* Version of the structure we pass as 'data'. */
216 } RedisModuleEvent;
217 
218 struct RedisModuleCtx;
219 typedef void (*RedisModuleEventCallback)(struct RedisModuleCtx *ctx, RedisModuleEvent eid, uint64_t subevent, void *data);
220 
221 static const RedisModuleEvent
222     RedisModuleEvent_ReplicationRoleChanged = {
223         REDISMODULE_EVENT_REPLICATION_ROLE_CHANGED,
224         1
225     },
226     RedisModuleEvent_Persistence = {
227         REDISMODULE_EVENT_PERSISTENCE,
228         1
229     },
230     RedisModuleEvent_FlushDB = {
231         REDISMODULE_EVENT_FLUSHDB,
232         1
233     },
234     RedisModuleEvent_Loading = {
235         REDISMODULE_EVENT_LOADING,
236         1
237     },
238     RedisModuleEvent_ClientChange = {
239         REDISMODULE_EVENT_CLIENT_CHANGE,
240         1
241     },
242     RedisModuleEvent_Shutdown = {
243         REDISMODULE_EVENT_SHUTDOWN,
244         1
245     },
246     RedisModuleEvent_ReplicaChange = {
247         REDISMODULE_EVENT_REPLICA_CHANGE,
248         1
249     },
250     RedisModuleEvent_CronLoop = {
251         REDISMODULE_EVENT_CRON_LOOP,
252         1
253     },
254     RedisModuleEvent_MasterLinkChange = {
255         REDISMODULE_EVENT_MASTER_LINK_CHANGE,
256         1
257     },
258     RedisModuleEvent_ModuleChange = {
259         REDISMODULE_EVENT_MODULE_CHANGE,
260         1
261     },
262     RedisModuleEvent_LoadingProgress = {
263         REDISMODULE_EVENT_LOADING_PROGRESS,
264         1
265     },
266     RedisModuleEvent_SwapDB = {
267         REDISMODULE_EVENT_SWAPDB,
268         1
269     };
270 
271 /* Those are values that are used for the 'subevent' callback argument. */
272 #define REDISMODULE_SUBEVENT_PERSISTENCE_RDB_START 0
273 #define REDISMODULE_SUBEVENT_PERSISTENCE_AOF_START 1
274 #define REDISMODULE_SUBEVENT_PERSISTENCE_SYNC_RDB_START 2
275 #define REDISMODULE_SUBEVENT_PERSISTENCE_ENDED 3
276 #define REDISMODULE_SUBEVENT_PERSISTENCE_FAILED 4
277 #define _REDISMODULE_SUBEVENT_PERSISTENCE_NEXT 5
278 
279 #define REDISMODULE_SUBEVENT_LOADING_RDB_START 0
280 #define REDISMODULE_SUBEVENT_LOADING_AOF_START 1
281 #define REDISMODULE_SUBEVENT_LOADING_REPL_START 2
282 #define REDISMODULE_SUBEVENT_LOADING_ENDED 3
283 #define REDISMODULE_SUBEVENT_LOADING_FAILED 4
284 #define _REDISMODULE_SUBEVENT_LOADING_NEXT 5
285 
286 #define REDISMODULE_SUBEVENT_CLIENT_CHANGE_CONNECTED 0
287 #define REDISMODULE_SUBEVENT_CLIENT_CHANGE_DISCONNECTED 1
288 #define _REDISMODULE_SUBEVENT_CLIENT_CHANGE_NEXT 2
289 
290 #define REDISMODULE_SUBEVENT_MASTER_LINK_UP 0
291 #define REDISMODULE_SUBEVENT_MASTER_LINK_DOWN 1
292 #define _REDISMODULE_SUBEVENT_MASTER_NEXT 2
293 
294 #define REDISMODULE_SUBEVENT_REPLICA_CHANGE_ONLINE 0
295 #define REDISMODULE_SUBEVENT_REPLICA_CHANGE_OFFLINE 1
296 #define _REDISMODULE_SUBEVENT_REPLICA_CHANGE_NEXT 2
297 
298 #define REDISMODULE_EVENT_REPLROLECHANGED_NOW_MASTER 0
299 #define REDISMODULE_EVENT_REPLROLECHANGED_NOW_REPLICA 1
300 #define _REDISMODULE_EVENT_REPLROLECHANGED_NEXT 2
301 
302 #define REDISMODULE_SUBEVENT_FLUSHDB_START 0
303 #define REDISMODULE_SUBEVENT_FLUSHDB_END 1
304 #define _REDISMODULE_SUBEVENT_FLUSHDB_NEXT 2
305 
306 #define REDISMODULE_SUBEVENT_MODULE_LOADED 0
307 #define REDISMODULE_SUBEVENT_MODULE_UNLOADED 1
308 #define _REDISMODULE_SUBEVENT_MODULE_NEXT 2
309 
310 
311 #define REDISMODULE_SUBEVENT_LOADING_PROGRESS_RDB 0
312 #define REDISMODULE_SUBEVENT_LOADING_PROGRESS_AOF 1
313 #define _REDISMODULE_SUBEVENT_LOADING_PROGRESS_NEXT 2
314 
315 #define _REDISMODULE_SUBEVENT_SHUTDOWN_NEXT 0
316 #define _REDISMODULE_SUBEVENT_CRON_LOOP_NEXT 0
317 #define _REDISMODULE_SUBEVENT_SWAPDB_NEXT 0
318 
319 /* RedisModuleClientInfo flags. */
320 #define REDISMODULE_CLIENTINFO_FLAG_SSL (1<<0)
321 #define REDISMODULE_CLIENTINFO_FLAG_PUBSUB (1<<1)
322 #define REDISMODULE_CLIENTINFO_FLAG_BLOCKED (1<<2)
323 #define REDISMODULE_CLIENTINFO_FLAG_TRACKING (1<<3)
324 #define REDISMODULE_CLIENTINFO_FLAG_UNIXSOCKET (1<<4)
325 #define REDISMODULE_CLIENTINFO_FLAG_MULTI (1<<5)
326 
327 /* Here we take all the structures that the module pass to the core
328  * and the other way around. Notably the list here contains the structures
329  * used by the hooks API RedisModule_RegisterToServerEvent().
330  *
331  * The structures always start with a 'version' field. This is useful
332  * when we want to pass a reference to the structure to the core APIs,
333  * for the APIs to fill the structure. In that case, the structure 'version'
334  * field is initialized before passing it to the core, so that the core is
335  * able to cast the pointer to the appropriate structure version. In this
336  * way we obtain ABI compatibility.
337  *
338  * Here we'll list all the structure versions in case they evolve over time,
339  * however using a define, we'll make sure to use the last version as the
340  * public name for the module to use. */
341 
342 #define REDISMODULE_CLIENTINFO_VERSION 1
343 typedef struct RedisModuleClientInfo {
344     uint64_t version;       /* Version of this structure for ABI compat. */
345     uint64_t flags;         /* REDISMODULE_CLIENTINFO_FLAG_* */
346     uint64_t id;            /* Client ID. */
347     char addr[46];          /* IPv4 or IPv6 address. */
348     uint16_t port;          /* TCP port. */
349     uint16_t db;            /* Selected DB. */
350 } RedisModuleClientInfoV1;
351 
352 #define RedisModuleClientInfo RedisModuleClientInfoV1
353 
354 #define REDISMODULE_REPLICATIONINFO_VERSION 1
355 typedef struct RedisModuleReplicationInfo {
356     uint64_t version;       /* Not used since this structure is never passed
357                                from the module to the core right now. Here
358                                for future compatibility. */
359     int master;             /* true if master, false if replica */
360     char *masterhost;       /* master instance hostname for NOW_REPLICA */
361     int masterport;         /* master instance port for NOW_REPLICA */
362     char *replid1;          /* Main replication ID */
363     char *replid2;          /* Secondary replication ID */
364     uint64_t repl1_offset;  /* Main replication offset */
365     uint64_t repl2_offset;  /* Offset of replid2 validity */
366 } RedisModuleReplicationInfoV1;
367 
368 #define RedisModuleReplicationInfo RedisModuleReplicationInfoV1
369 
370 #define REDISMODULE_FLUSHINFO_VERSION 1
371 typedef struct RedisModuleFlushInfo {
372     uint64_t version;       /* Not used since this structure is never passed
373                                from the module to the core right now. Here
374                                for future compatibility. */
375     int32_t sync;           /* Synchronous or threaded flush?. */
376     int32_t dbnum;          /* Flushed database number, -1 for ALL. */
377 } RedisModuleFlushInfoV1;
378 
379 #define RedisModuleFlushInfo RedisModuleFlushInfoV1
380 
381 #define REDISMODULE_MODULE_CHANGE_VERSION 1
382 typedef struct RedisModuleModuleChange {
383     uint64_t version;       /* Not used since this structure is never passed
384                                from the module to the core right now. Here
385                                for future compatibility. */
386     const char* module_name;/* Name of module loaded or unloaded. */
387     int32_t module_version; /* Module version. */
388 } RedisModuleModuleChangeV1;
389 
390 #define RedisModuleModuleChange RedisModuleModuleChangeV1
391 
392 #define REDISMODULE_CRON_LOOP_VERSION 1
393 typedef struct RedisModuleCronLoopInfo {
394     uint64_t version;       /* Not used since this structure is never passed
395                                from the module to the core right now. Here
396                                for future compatibility. */
397     int32_t hz;             /* Approximate number of events per second. */
398 } RedisModuleCronLoopV1;
399 
400 #define RedisModuleCronLoop RedisModuleCronLoopV1
401 
402 #define REDISMODULE_LOADING_PROGRESS_VERSION 1
403 typedef struct RedisModuleLoadingProgressInfo {
404     uint64_t version;       /* Not used since this structure is never passed
405                                from the module to the core right now. Here
406                                for future compatibility. */
407     int32_t hz;             /* Approximate number of events per second. */
408     int32_t progress;       /* Approximate progress between 0 and 1024, or -1
409                              * if unknown. */
410 } RedisModuleLoadingProgressV1;
411 
412 #define RedisModuleLoadingProgress RedisModuleLoadingProgressV1
413 
414 #define REDISMODULE_SWAPDBINFO_VERSION 1
415 typedef struct RedisModuleSwapDbInfo {
416     uint64_t version;       /* Not used since this structure is never passed
417                                from the module to the core right now. Here
418                                for future compatibility. */
419     int32_t dbnum_first;    /* Swap Db first dbnum */
420     int32_t dbnum_second;   /* Swap Db second dbnum */
421 } RedisModuleSwapDbInfoV1;
422 
423 #define RedisModuleSwapDbInfo RedisModuleSwapDbInfoV1
424 
425 /* ------------------------- End of common defines ------------------------ */
426 
427 #ifndef REDISMODULE_CORE
428 
429 typedef long long mstime_t;
430 
431 /* Macro definitions specific to individual compilers */
432 #ifndef REDISMODULE_ATTR_UNUSED
433 #    ifdef __GNUC__
434 #        define REDISMODULE_ATTR_UNUSED __attribute__((unused))
435 #    else
436 #        define REDISMODULE_ATTR_UNUSED
437 #    endif
438 #endif
439 
440 #ifndef REDISMODULE_ATTR_PRINTF
441 #    ifdef __GNUC__
442 #        define REDISMODULE_ATTR_PRINTF(idx,cnt) __attribute__((format(printf,idx,cnt)))
443 #    else
444 #        define REDISMODULE_ATTR_PRINTF(idx,cnt)
445 #    endif
446 #endif
447 
448 #ifndef REDISMODULE_ATTR_COMMON
449 #    if defined(__GNUC__) && !defined(__clang__)
450 #        define REDISMODULE_ATTR_COMMON __attribute__((__common__))
451 #    else
452 #        define REDISMODULE_ATTR_COMMON
453 #    endif
454 #endif
455 
456 /* Incomplete structures for compiler checks but opaque access. */
457 typedef struct RedisModuleCtx RedisModuleCtx;
458 typedef struct RedisModuleKey RedisModuleKey;
459 typedef struct RedisModuleString RedisModuleString;
460 typedef struct RedisModuleCallReply RedisModuleCallReply;
461 typedef struct RedisModuleIO RedisModuleIO;
462 typedef struct RedisModuleType RedisModuleType;
463 typedef struct RedisModuleDigest RedisModuleDigest;
464 typedef struct RedisModuleBlockedClient RedisModuleBlockedClient;
465 typedef struct RedisModuleClusterInfo RedisModuleClusterInfo;
466 typedef struct RedisModuleDict RedisModuleDict;
467 typedef struct RedisModuleDictIter RedisModuleDictIter;
468 typedef struct RedisModuleCommandFilterCtx RedisModuleCommandFilterCtx;
469 typedef struct RedisModuleCommandFilter RedisModuleCommandFilter;
470 typedef struct RedisModuleInfoCtx RedisModuleInfoCtx;
471 typedef struct RedisModuleServerInfoData RedisModuleServerInfoData;
472 typedef struct RedisModuleScanCursor RedisModuleScanCursor;
473 typedef struct RedisModuleUser RedisModuleUser;
474 
475 typedef int (*RedisModuleCmdFunc)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
476 typedef void (*RedisModuleDisconnectFunc)(RedisModuleCtx *ctx, RedisModuleBlockedClient *bc);
477 typedef int (*RedisModuleNotificationFunc)(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key);
478 typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver);
479 typedef void (*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value);
480 typedef int (*RedisModuleTypeAuxLoadFunc)(RedisModuleIO *rdb, int encver, int when);
481 typedef void (*RedisModuleTypeAuxSaveFunc)(RedisModuleIO *rdb, int when);
482 typedef void (*RedisModuleTypeRewriteFunc)(RedisModuleIO *aof, RedisModuleString *key, void *value);
483 typedef size_t (*RedisModuleTypeMemUsageFunc)(const void *value);
484 typedef void (*RedisModuleTypeDigestFunc)(RedisModuleDigest *digest, void *value);
485 typedef void (*RedisModuleTypeFreeFunc)(void *value);
486 typedef void (*RedisModuleClusterMessageReceiver)(RedisModuleCtx *ctx, const char *sender_id, uint8_t type, const unsigned char *payload, uint32_t len);
487 typedef void (*RedisModuleTimerProc)(RedisModuleCtx *ctx, void *data);
488 typedef void (*RedisModuleCommandFilterFunc) (RedisModuleCommandFilterCtx *filter);
489 typedef void (*RedisModuleForkDoneHandler) (int exitcode, int bysignal, void *user_data);
490 typedef void (*RedisModuleInfoFunc)(RedisModuleInfoCtx *ctx, int for_crash_report);
491 typedef void (*RedisModuleScanCB)(RedisModuleCtx *ctx, RedisModuleString *keyname, RedisModuleKey *key, void *privdata);
492 typedef void (*RedisModuleScanKeyCB)(RedisModuleKey *key, RedisModuleString *field, RedisModuleString *value, void *privdata);
493 typedef void (*RedisModuleUserChangedFunc) (uint64_t client_id, void *privdata);
494 
495 #define REDISMODULE_TYPE_METHOD_VERSION 2
496 typedef struct RedisModuleTypeMethods {
497     uint64_t version;
498     RedisModuleTypeLoadFunc rdb_load;
499     RedisModuleTypeSaveFunc rdb_save;
500     RedisModuleTypeRewriteFunc aof_rewrite;
501     RedisModuleTypeMemUsageFunc mem_usage;
502     RedisModuleTypeDigestFunc digest;
503     RedisModuleTypeFreeFunc free;
504     RedisModuleTypeAuxLoadFunc aux_load;
505     RedisModuleTypeAuxSaveFunc aux_save;
506     int aux_save_triggers;
507 } RedisModuleTypeMethods;
508 
509 #define REDISMODULE_GET_API(name) \
510     RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))
511 
512 /* Default API declaration prefix (not 'extern' for backwards compatibility) */
513 #ifndef REDISMODULE_API
514 #define REDISMODULE_API
515 #endif
516 
517 /* Default API declaration suffix (compiler attributes) */
518 #ifndef REDISMODULE_ATTR
519 #define REDISMODULE_ATTR REDISMODULE_ATTR_COMMON
520 #endif
521 
522 REDISMODULE_API void * (*RedisModule_Alloc)(size_t bytes) REDISMODULE_ATTR;
523 REDISMODULE_API void * (*RedisModule_Realloc)(void *ptr, size_t bytes) REDISMODULE_ATTR;
524 REDISMODULE_API void (*RedisModule_Free)(void *ptr) REDISMODULE_ATTR;
525 REDISMODULE_API void * (*RedisModule_Calloc)(size_t nmemb, size_t size) REDISMODULE_ATTR;
526 REDISMODULE_API char * (*RedisModule_Strdup)(const char *str) REDISMODULE_ATTR;
527 REDISMODULE_API int (*RedisModule_GetApi)(const char *, void *) REDISMODULE_ATTR;
528 REDISMODULE_API int (*RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep) REDISMODULE_ATTR;
529 REDISMODULE_API void (*RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name, int ver, int apiver) REDISMODULE_ATTR;
530 REDISMODULE_API int (*RedisModule_IsModuleNameBusy)(const char *name) REDISMODULE_ATTR;
531 REDISMODULE_API int (*RedisModule_WrongArity)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
532 REDISMODULE_API int (*RedisModule_ReplyWithLongLong)(RedisModuleCtx *ctx, long long ll) REDISMODULE_ATTR;
533 REDISMODULE_API int (*RedisModule_GetSelectedDb)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
534 REDISMODULE_API int (*RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid) REDISMODULE_ATTR;
535 REDISMODULE_API void * (*RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode) REDISMODULE_ATTR;
536 REDISMODULE_API void (*RedisModule_CloseKey)(RedisModuleKey *kp) REDISMODULE_ATTR;
537 REDISMODULE_API int (*RedisModule_KeyType)(RedisModuleKey *kp) REDISMODULE_ATTR;
538 REDISMODULE_API size_t (*RedisModule_ValueLength)(RedisModuleKey *kp) REDISMODULE_ATTR;
539 REDISMODULE_API int (*RedisModule_ListPush)(RedisModuleKey *kp, int where, RedisModuleString *ele) REDISMODULE_ATTR;
540 REDISMODULE_API RedisModuleString * (*RedisModule_ListPop)(RedisModuleKey *key, int where) REDISMODULE_ATTR;
541 REDISMODULE_API RedisModuleCallReply * (*RedisModule_Call)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...) REDISMODULE_ATTR;
542 REDISMODULE_API const char * (*RedisModule_CallReplyProto)(RedisModuleCallReply *reply, size_t *len) REDISMODULE_ATTR;
543 REDISMODULE_API void (*RedisModule_FreeCallReply)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
544 REDISMODULE_API int (*RedisModule_CallReplyType)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
545 REDISMODULE_API long long (*RedisModule_CallReplyInteger)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
546 REDISMODULE_API size_t (*RedisModule_CallReplyLength)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
547 REDISMODULE_API RedisModuleCallReply * (*RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx) REDISMODULE_ATTR;
548 REDISMODULE_API RedisModuleString * (*RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len) REDISMODULE_ATTR;
549 REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, long long ll) REDISMODULE_ATTR;
550 REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromDouble)(RedisModuleCtx *ctx, double d) REDISMODULE_ATTR;
551 REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromLongDouble)(RedisModuleCtx *ctx, long double ld, int humanfriendly) REDISMODULE_ATTR;
552 REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str) REDISMODULE_ATTR;
553 REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...) REDISMODULE_ATTR_PRINTF(2,3) REDISMODULE_ATTR;
554 REDISMODULE_API void (*RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
555 REDISMODULE_API const char * (*RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len) REDISMODULE_ATTR;
556 REDISMODULE_API int (*RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err) REDISMODULE_ATTR;
557 REDISMODULE_API int (*RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg) REDISMODULE_ATTR;
558 REDISMODULE_API int (*RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
559 REDISMODULE_API int (*RedisModule_ReplyWithNullArray)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
560 REDISMODULE_API int (*RedisModule_ReplyWithEmptyArray)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
561 REDISMODULE_API void (*RedisModule_ReplySetArrayLength)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
562 REDISMODULE_API int (*RedisModule_ReplyWithStringBuffer)(RedisModuleCtx *ctx, const char *buf, size_t len) REDISMODULE_ATTR;
563 REDISMODULE_API int (*RedisModule_ReplyWithCString)(RedisModuleCtx *ctx, const char *buf) REDISMODULE_ATTR;
564 REDISMODULE_API int (*RedisModule_ReplyWithString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
565 REDISMODULE_API int (*RedisModule_ReplyWithEmptyString)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
566 REDISMODULE_API int (*RedisModule_ReplyWithVerbatimString)(RedisModuleCtx *ctx, const char *buf, size_t len) REDISMODULE_ATTR;
567 REDISMODULE_API int (*RedisModule_ReplyWithNull)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
568 REDISMODULE_API int (*RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, double d) REDISMODULE_ATTR;
569 REDISMODULE_API int (*RedisModule_ReplyWithLongDouble)(RedisModuleCtx *ctx, long double d) REDISMODULE_ATTR;
570 REDISMODULE_API int (*RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx, RedisModuleCallReply *reply) REDISMODULE_ATTR;
571 REDISMODULE_API int (*RedisModule_StringToLongLong)(const RedisModuleString *str, long long *ll) REDISMODULE_ATTR;
572 REDISMODULE_API int (*RedisModule_StringToDouble)(const RedisModuleString *str, double *d) REDISMODULE_ATTR;
573 REDISMODULE_API int (*RedisModule_StringToLongDouble)(const RedisModuleString *str, long double *d) REDISMODULE_ATTR;
574 REDISMODULE_API void (*RedisModule_AutoMemory)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
575 REDISMODULE_API int (*RedisModule_Replicate)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...) REDISMODULE_ATTR;
576 REDISMODULE_API int (*RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
577 REDISMODULE_API const char * (*RedisModule_CallReplyStringPtr)(RedisModuleCallReply *reply, size_t *len) REDISMODULE_ATTR;
578 REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromCallReply)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
579 REDISMODULE_API int (*RedisModule_DeleteKey)(RedisModuleKey *key) REDISMODULE_ATTR;
580 REDISMODULE_API int (*RedisModule_UnlinkKey)(RedisModuleKey *key) REDISMODULE_ATTR;
581 REDISMODULE_API int (*RedisModule_StringSet)(RedisModuleKey *key, RedisModuleString *str) REDISMODULE_ATTR;
582 REDISMODULE_API char * (*RedisModule_StringDMA)(RedisModuleKey *key, size_t *len, int mode) REDISMODULE_ATTR;
583 REDISMODULE_API int (*RedisModule_StringTruncate)(RedisModuleKey *key, size_t newlen) REDISMODULE_ATTR;
584 REDISMODULE_API mstime_t (*RedisModule_GetExpire)(RedisModuleKey *key) REDISMODULE_ATTR;
585 REDISMODULE_API int (*RedisModule_SetExpire)(RedisModuleKey *key, mstime_t expire) REDISMODULE_ATTR;
586 REDISMODULE_API void (*RedisModule_ResetDataset)(int restart_aof, int async) REDISMODULE_ATTR;
587 REDISMODULE_API unsigned long long (*RedisModule_DbSize)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
588 REDISMODULE_API RedisModuleString * (*RedisModule_RandomKey)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
589 REDISMODULE_API int (*RedisModule_ZsetAdd)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr) REDISMODULE_ATTR;
590 REDISMODULE_API int (*RedisModule_ZsetIncrby)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr, double *newscore) REDISMODULE_ATTR;
591 REDISMODULE_API int (*RedisModule_ZsetScore)(RedisModuleKey *key, RedisModuleString *ele, double *score) REDISMODULE_ATTR;
592 REDISMODULE_API int (*RedisModule_ZsetRem)(RedisModuleKey *key, RedisModuleString *ele, int *deleted) REDISMODULE_ATTR;
593 REDISMODULE_API void (*RedisModule_ZsetRangeStop)(RedisModuleKey *key) REDISMODULE_ATTR;
594 REDISMODULE_API int (*RedisModule_ZsetFirstInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex) REDISMODULE_ATTR;
595 REDISMODULE_API int (*RedisModule_ZsetLastInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex) REDISMODULE_ATTR;
596 REDISMODULE_API int (*RedisModule_ZsetFirstInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max) REDISMODULE_ATTR;
597 REDISMODULE_API int (*RedisModule_ZsetLastInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max) REDISMODULE_ATTR;
598 REDISMODULE_API RedisModuleString * (*RedisModule_ZsetRangeCurrentElement)(RedisModuleKey *key, double *score) REDISMODULE_ATTR;
599 REDISMODULE_API int (*RedisModule_ZsetRangeNext)(RedisModuleKey *key) REDISMODULE_ATTR;
600 REDISMODULE_API int (*RedisModule_ZsetRangePrev)(RedisModuleKey *key) REDISMODULE_ATTR;
601 REDISMODULE_API int (*RedisModule_ZsetRangeEndReached)(RedisModuleKey *key) REDISMODULE_ATTR;
602 REDISMODULE_API int (*RedisModule_HashSet)(RedisModuleKey *key, int flags, ...) REDISMODULE_ATTR;
603 REDISMODULE_API int (*RedisModule_HashGet)(RedisModuleKey *key, int flags, ...) REDISMODULE_ATTR;
604 REDISMODULE_API int (*RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
605 REDISMODULE_API void (*RedisModule_KeyAtPos)(RedisModuleCtx *ctx, int pos) REDISMODULE_ATTR;
606 REDISMODULE_API unsigned long long (*RedisModule_GetClientId)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
607 REDISMODULE_API int (*RedisModule_GetClientInfoById)(void *ci, uint64_t id) REDISMODULE_ATTR;
608 REDISMODULE_API int (*RedisModule_PublishMessage)(RedisModuleCtx *ctx, RedisModuleString *channel, RedisModuleString *message) REDISMODULE_ATTR;
609 REDISMODULE_API int (*RedisModule_GetContextFlags)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
610 REDISMODULE_API int (*RedisModule_AvoidReplicaTraffic)() REDISMODULE_ATTR;
611 REDISMODULE_API void * (*RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes) REDISMODULE_ATTR;
612 REDISMODULE_API RedisModuleType * (*RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods) REDISMODULE_ATTR;
613 REDISMODULE_API int (*RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value) REDISMODULE_ATTR;
614 REDISMODULE_API int (*RedisModule_ModuleTypeReplaceValue)(RedisModuleKey *key, RedisModuleType *mt, void *new_value, void **old_value) REDISMODULE_ATTR;
615 REDISMODULE_API RedisModuleType * (*RedisModule_ModuleTypeGetType)(RedisModuleKey *key) REDISMODULE_ATTR;
616 REDISMODULE_API void * (*RedisModule_ModuleTypeGetValue)(RedisModuleKey *key) REDISMODULE_ATTR;
617 REDISMODULE_API int (*RedisModule_IsIOError)(RedisModuleIO *io) REDISMODULE_ATTR;
618 REDISMODULE_API void (*RedisModule_SetModuleOptions)(RedisModuleCtx *ctx, int options) REDISMODULE_ATTR;
619 REDISMODULE_API int (*RedisModule_SignalModifiedKey)(RedisModuleCtx *ctx, RedisModuleString *keyname) REDISMODULE_ATTR;
620 REDISMODULE_API void (*RedisModule_SaveUnsigned)(RedisModuleIO *io, uint64_t value) REDISMODULE_ATTR;
621 REDISMODULE_API uint64_t (*RedisModule_LoadUnsigned)(RedisModuleIO *io) REDISMODULE_ATTR;
622 REDISMODULE_API void (*RedisModule_SaveSigned)(RedisModuleIO *io, int64_t value) REDISMODULE_ATTR;
623 REDISMODULE_API int64_t (*RedisModule_LoadSigned)(RedisModuleIO *io) REDISMODULE_ATTR;
624 REDISMODULE_API void (*RedisModule_EmitAOF)(RedisModuleIO *io, const char *cmdname, const char *fmt, ...) REDISMODULE_ATTR;
625 REDISMODULE_API void (*RedisModule_SaveString)(RedisModuleIO *io, RedisModuleString *s) REDISMODULE_ATTR;
626 REDISMODULE_API void (*RedisModule_SaveStringBuffer)(RedisModuleIO *io, const char *str, size_t len) REDISMODULE_ATTR;
627 REDISMODULE_API RedisModuleString * (*RedisModule_LoadString)(RedisModuleIO *io) REDISMODULE_ATTR;
628 REDISMODULE_API char * (*RedisModule_LoadStringBuffer)(RedisModuleIO *io, size_t *lenptr) REDISMODULE_ATTR;
629 REDISMODULE_API void (*RedisModule_SaveDouble)(RedisModuleIO *io, double value) REDISMODULE_ATTR;
630 REDISMODULE_API double (*RedisModule_LoadDouble)(RedisModuleIO *io) REDISMODULE_ATTR;
631 REDISMODULE_API void (*RedisModule_SaveFloat)(RedisModuleIO *io, float value) REDISMODULE_ATTR;
632 REDISMODULE_API float (*RedisModule_LoadFloat)(RedisModuleIO *io) REDISMODULE_ATTR;
633 REDISMODULE_API void (*RedisModule_SaveLongDouble)(RedisModuleIO *io, long double value) REDISMODULE_ATTR;
634 REDISMODULE_API long double (*RedisModule_LoadLongDouble)(RedisModuleIO *io) REDISMODULE_ATTR;
635 REDISMODULE_API void * (*RedisModule_LoadDataTypeFromString)(const RedisModuleString *str, const RedisModuleType *mt) REDISMODULE_ATTR;
636 REDISMODULE_API RedisModuleString * (*RedisModule_SaveDataTypeToString)(RedisModuleCtx *ctx, void *data, const RedisModuleType *mt) REDISMODULE_ATTR;
637 REDISMODULE_API void (*RedisModule_Log)(RedisModuleCtx *ctx, const char *level, const char *fmt, ...) REDISMODULE_ATTR REDISMODULE_ATTR_PRINTF(3,4);
638 REDISMODULE_API void (*RedisModule_LogIOError)(RedisModuleIO *io, const char *levelstr, const char *fmt, ...) REDISMODULE_ATTR REDISMODULE_ATTR_PRINTF(3,4);
639 REDISMODULE_API void (*RedisModule__Assert)(const char *estr, const char *file, int line) REDISMODULE_ATTR;
640 REDISMODULE_API void (*RedisModule_LatencyAddSample)(const char *event, mstime_t latency) REDISMODULE_ATTR;
641 REDISMODULE_API int (*RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, RedisModuleString *str, const char *buf, size_t len) REDISMODULE_ATTR;
642 REDISMODULE_API void (*RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
643 REDISMODULE_API RedisModuleString * (*RedisModule_HoldString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
644 REDISMODULE_API int (*RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b) REDISMODULE_ATTR;
645 REDISMODULE_API RedisModuleCtx * (*RedisModule_GetContextFromIO)(RedisModuleIO *io) REDISMODULE_ATTR;
646 REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromIO)(RedisModuleIO *io) REDISMODULE_ATTR;
647 REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromModuleKey)(RedisModuleKey *key) REDISMODULE_ATTR;
648 REDISMODULE_API long long (*RedisModule_Milliseconds)(void) REDISMODULE_ATTR;
649 REDISMODULE_API void (*RedisModule_DigestAddStringBuffer)(RedisModuleDigest *md, unsigned char *ele, size_t len) REDISMODULE_ATTR;
650 REDISMODULE_API void (*RedisModule_DigestAddLongLong)(RedisModuleDigest *md, long long ele) REDISMODULE_ATTR;
651 REDISMODULE_API void (*RedisModule_DigestEndSequence)(RedisModuleDigest *md) REDISMODULE_ATTR;
652 REDISMODULE_API RedisModuleDict * (*RedisModule_CreateDict)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
653 REDISMODULE_API void (*RedisModule_FreeDict)(RedisModuleCtx *ctx, RedisModuleDict *d) REDISMODULE_ATTR;
654 REDISMODULE_API uint64_t (*RedisModule_DictSize)(RedisModuleDict *d) REDISMODULE_ATTR;
655 REDISMODULE_API int (*RedisModule_DictSetC)(RedisModuleDict *d, void *key, size_t keylen, void *ptr) REDISMODULE_ATTR;
656 REDISMODULE_API int (*RedisModule_DictReplaceC)(RedisModuleDict *d, void *key, size_t keylen, void *ptr) REDISMODULE_ATTR;
657 REDISMODULE_API int (*RedisModule_DictSet)(RedisModuleDict *d, RedisModuleString *key, void *ptr) REDISMODULE_ATTR;
658 REDISMODULE_API int (*RedisModule_DictReplace)(RedisModuleDict *d, RedisModuleString *key, void *ptr) REDISMODULE_ATTR;
659 REDISMODULE_API void * (*RedisModule_DictGetC)(RedisModuleDict *d, void *key, size_t keylen, int *nokey) REDISMODULE_ATTR;
660 REDISMODULE_API void * (*RedisModule_DictGet)(RedisModuleDict *d, RedisModuleString *key, int *nokey) REDISMODULE_ATTR;
661 REDISMODULE_API int (*RedisModule_DictDelC)(RedisModuleDict *d, void *key, size_t keylen, void *oldval) REDISMODULE_ATTR;
662 REDISMODULE_API int (*RedisModule_DictDel)(RedisModuleDict *d, RedisModuleString *key, void *oldval) REDISMODULE_ATTR;
663 REDISMODULE_API RedisModuleDictIter * (*RedisModule_DictIteratorStartC)(RedisModuleDict *d, const char *op, void *key, size_t keylen) REDISMODULE_ATTR;
664 REDISMODULE_API RedisModuleDictIter * (*RedisModule_DictIteratorStart)(RedisModuleDict *d, const char *op, RedisModuleString *key) REDISMODULE_ATTR;
665 REDISMODULE_API void (*RedisModule_DictIteratorStop)(RedisModuleDictIter *di) REDISMODULE_ATTR;
666 REDISMODULE_API int (*RedisModule_DictIteratorReseekC)(RedisModuleDictIter *di, const char *op, void *key, size_t keylen) REDISMODULE_ATTR;
667 REDISMODULE_API int (*RedisModule_DictIteratorReseek)(RedisModuleDictIter *di, const char *op, RedisModuleString *key) REDISMODULE_ATTR;
668 REDISMODULE_API void * (*RedisModule_DictNextC)(RedisModuleDictIter *di, size_t *keylen, void **dataptr) REDISMODULE_ATTR;
669 REDISMODULE_API void * (*RedisModule_DictPrevC)(RedisModuleDictIter *di, size_t *keylen, void **dataptr) REDISMODULE_ATTR;
670 REDISMODULE_API RedisModuleString * (*RedisModule_DictNext)(RedisModuleCtx *ctx, RedisModuleDictIter *di, void **dataptr) REDISMODULE_ATTR;
671 REDISMODULE_API RedisModuleString * (*RedisModule_DictPrev)(RedisModuleCtx *ctx, RedisModuleDictIter *di, void **dataptr) REDISMODULE_ATTR;
672 REDISMODULE_API int (*RedisModule_DictCompareC)(RedisModuleDictIter *di, const char *op, void *key, size_t keylen) REDISMODULE_ATTR;
673 REDISMODULE_API int (*RedisModule_DictCompare)(RedisModuleDictIter *di, const char *op, RedisModuleString *key) REDISMODULE_ATTR;
674 REDISMODULE_API int (*RedisModule_RegisterInfoFunc)(RedisModuleCtx *ctx, RedisModuleInfoFunc cb) REDISMODULE_ATTR;
675 REDISMODULE_API int (*RedisModule_InfoAddSection)(RedisModuleInfoCtx *ctx, char *name) REDISMODULE_ATTR;
676 REDISMODULE_API int (*RedisModule_InfoBeginDictField)(RedisModuleInfoCtx *ctx, char *name) REDISMODULE_ATTR;
677 REDISMODULE_API int (*RedisModule_InfoEndDictField)(RedisModuleInfoCtx *ctx) REDISMODULE_ATTR;
678 REDISMODULE_API int (*RedisModule_InfoAddFieldString)(RedisModuleInfoCtx *ctx, char *field, RedisModuleString *value) REDISMODULE_ATTR;
679 REDISMODULE_API int (*RedisModule_InfoAddFieldCString)(RedisModuleInfoCtx *ctx, char *field, char *value) REDISMODULE_ATTR;
680 REDISMODULE_API int (*RedisModule_InfoAddFieldDouble)(RedisModuleInfoCtx *ctx, char *field, double value) REDISMODULE_ATTR;
681 REDISMODULE_API int (*RedisModule_InfoAddFieldLongLong)(RedisModuleInfoCtx *ctx, char *field, long long value) REDISMODULE_ATTR;
682 REDISMODULE_API int (*RedisModule_InfoAddFieldULongLong)(RedisModuleInfoCtx *ctx, char *field, unsigned long long value) REDISMODULE_ATTR;
683 REDISMODULE_API RedisModuleServerInfoData * (*RedisModule_GetServerInfo)(RedisModuleCtx *ctx, const char *section) REDISMODULE_ATTR;
684 REDISMODULE_API void (*RedisModule_FreeServerInfo)(RedisModuleCtx *ctx, RedisModuleServerInfoData *data) REDISMODULE_ATTR;
685 REDISMODULE_API RedisModuleString * (*RedisModule_ServerInfoGetField)(RedisModuleCtx *ctx, RedisModuleServerInfoData *data, const char* field) REDISMODULE_ATTR;
686 REDISMODULE_API const char * (*RedisModule_ServerInfoGetFieldC)(RedisModuleServerInfoData *data, const char* field) REDISMODULE_ATTR;
687 REDISMODULE_API long long (*RedisModule_ServerInfoGetFieldSigned)(RedisModuleServerInfoData *data, const char* field, int *out_err) REDISMODULE_ATTR;
688 REDISMODULE_API unsigned long long (*RedisModule_ServerInfoGetFieldUnsigned)(RedisModuleServerInfoData *data, const char* field, int *out_err) REDISMODULE_ATTR;
689 REDISMODULE_API double (*RedisModule_ServerInfoGetFieldDouble)(RedisModuleServerInfoData *data, const char* field, int *out_err) REDISMODULE_ATTR;
690 REDISMODULE_API int (*RedisModule_SubscribeToServerEvent)(RedisModuleCtx *ctx, RedisModuleEvent event, RedisModuleEventCallback callback) REDISMODULE_ATTR;
691 REDISMODULE_API int (*RedisModule_SetLRU)(RedisModuleKey *key, mstime_t lru_idle) REDISMODULE_ATTR;
692 REDISMODULE_API int (*RedisModule_GetLRU)(RedisModuleKey *key, mstime_t *lru_idle) REDISMODULE_ATTR;
693 REDISMODULE_API int (*RedisModule_SetLFU)(RedisModuleKey *key, long long lfu_freq) REDISMODULE_ATTR;
694 REDISMODULE_API int (*RedisModule_GetLFU)(RedisModuleKey *key, long long *lfu_freq) REDISMODULE_ATTR;
695 REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_BlockClientOnKeys)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(RedisModuleCtx*,void*), long long timeout_ms, RedisModuleString **keys, int numkeys, void *privdata) REDISMODULE_ATTR;
696 REDISMODULE_API void (*RedisModule_SignalKeyAsReady)(RedisModuleCtx *ctx, RedisModuleString *key) REDISMODULE_ATTR;
697 REDISMODULE_API RedisModuleString * (*RedisModule_GetBlockedClientReadyKey)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
698 REDISMODULE_API RedisModuleScanCursor * (*RedisModule_ScanCursorCreate)() REDISMODULE_ATTR;
699 REDISMODULE_API void (*RedisModule_ScanCursorRestart)(RedisModuleScanCursor *cursor) REDISMODULE_ATTR;
700 REDISMODULE_API void (*RedisModule_ScanCursorDestroy)(RedisModuleScanCursor *cursor) REDISMODULE_ATTR;
701 REDISMODULE_API int (*RedisModule_Scan)(RedisModuleCtx *ctx, RedisModuleScanCursor *cursor, RedisModuleScanCB fn, void *privdata) REDISMODULE_ATTR;
702 REDISMODULE_API int (*RedisModule_ScanKey)(RedisModuleKey *key, RedisModuleScanCursor *cursor, RedisModuleScanKeyCB fn, void *privdata) REDISMODULE_ATTR;
703 REDISMODULE_API int (*RedisModule_GetContextFlagsAll)() REDISMODULE_ATTR;
704 REDISMODULE_API int (*RedisModule_GetKeyspaceNotificationFlagsAll)() REDISMODULE_ATTR;
705 REDISMODULE_API int (*RedisModule_IsSubEventSupported)(RedisModuleEvent event, uint64_t subevent) REDISMODULE_ATTR;
706 REDISMODULE_API int (*RedisModule_GetServerVersion)() REDISMODULE_ATTR;
707 
708 /* Experimental APIs */
709 #ifdef REDISMODULE_EXPERIMENTAL_API
710 #define REDISMODULE_EXPERIMENTAL_API_VERSION 3
711 REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_BlockClient)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(RedisModuleCtx*,void*), long long timeout_ms) REDISMODULE_ATTR;
712 REDISMODULE_API int (*RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata) REDISMODULE_ATTR;
713 REDISMODULE_API int (*RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
714 REDISMODULE_API int (*RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
715 REDISMODULE_API void * (*RedisModule_GetBlockedClientPrivateData)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
716 REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_GetBlockedClientHandle)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
717 REDISMODULE_API int (*RedisModule_AbortBlock)(RedisModuleBlockedClient *bc) REDISMODULE_ATTR;
718 REDISMODULE_API RedisModuleCtx * (*RedisModule_GetThreadSafeContext)(RedisModuleBlockedClient *bc) REDISMODULE_ATTR;
719 REDISMODULE_API RedisModuleCtx * (*RedisModule_GetDetachedThreadSafeContext)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
720 REDISMODULE_API void (*RedisModule_FreeThreadSafeContext)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
721 REDISMODULE_API void (*RedisModule_ThreadSafeContextLock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
722 REDISMODULE_API int (*RedisModule_ThreadSafeContextTryLock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
723 REDISMODULE_API void (*RedisModule_ThreadSafeContextUnlock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
724 REDISMODULE_API int (*RedisModule_SubscribeToKeyspaceEvents)(RedisModuleCtx *ctx, int types, RedisModuleNotificationFunc cb) REDISMODULE_ATTR;
725 REDISMODULE_API int (*RedisModule_NotifyKeyspaceEvent)(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key) REDISMODULE_ATTR;
726 REDISMODULE_API int (*RedisModule_GetNotifyKeyspaceEvents)() REDISMODULE_ATTR;
727 REDISMODULE_API int (*RedisModule_BlockedClientDisconnected)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
728 REDISMODULE_API void (*RedisModule_RegisterClusterMessageReceiver)(RedisModuleCtx *ctx, uint8_t type, RedisModuleClusterMessageReceiver callback) REDISMODULE_ATTR;
729 REDISMODULE_API int (*RedisModule_SendClusterMessage)(RedisModuleCtx *ctx, char *target_id, uint8_t type, unsigned char *msg, uint32_t len) REDISMODULE_ATTR;
730 REDISMODULE_API int (*RedisModule_GetClusterNodeInfo)(RedisModuleCtx *ctx, const char *id, char *ip, char *master_id, int *port, int *flags) REDISMODULE_ATTR;
731 REDISMODULE_API char ** (*RedisModule_GetClusterNodesList)(RedisModuleCtx *ctx, size_t *numnodes) REDISMODULE_ATTR;
732 REDISMODULE_API void (*RedisModule_FreeClusterNodesList)(char **ids) REDISMODULE_ATTR;
733 REDISMODULE_API RedisModuleTimerID (*RedisModule_CreateTimer)(RedisModuleCtx *ctx, mstime_t period, RedisModuleTimerProc callback, void *data) REDISMODULE_ATTR;
734 REDISMODULE_API int (*RedisModule_StopTimer)(RedisModuleCtx *ctx, RedisModuleTimerID id, void **data) REDISMODULE_ATTR;
735 REDISMODULE_API int (*RedisModule_GetTimerInfo)(RedisModuleCtx *ctx, RedisModuleTimerID id, uint64_t *remaining, void **data) REDISMODULE_ATTR;
736 REDISMODULE_API const char * (*RedisModule_GetMyClusterID)(void) REDISMODULE_ATTR;
737 REDISMODULE_API size_t (*RedisModule_GetClusterSize)(void) REDISMODULE_ATTR;
738 REDISMODULE_API void (*RedisModule_GetRandomBytes)(unsigned char *dst, size_t len) REDISMODULE_ATTR;
739 REDISMODULE_API void (*RedisModule_GetRandomHexChars)(char *dst, size_t len) REDISMODULE_ATTR;
740 REDISMODULE_API void (*RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback) REDISMODULE_ATTR;
741 REDISMODULE_API void (*RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags) REDISMODULE_ATTR;
742 REDISMODULE_API int (*RedisModule_ExportSharedAPI)(RedisModuleCtx *ctx, const char *apiname, void *func) REDISMODULE_ATTR;
743 REDISMODULE_API void * (*RedisModule_GetSharedAPI)(RedisModuleCtx *ctx, const char *apiname) REDISMODULE_ATTR;
744 REDISMODULE_API RedisModuleCommandFilter * (*RedisModule_RegisterCommandFilter)(RedisModuleCtx *ctx, RedisModuleCommandFilterFunc cb, int flags) REDISMODULE_ATTR;
745 REDISMODULE_API int (*RedisModule_UnregisterCommandFilter)(RedisModuleCtx *ctx, RedisModuleCommandFilter *filter) REDISMODULE_ATTR;
746 REDISMODULE_API int (*RedisModule_CommandFilterArgsCount)(RedisModuleCommandFilterCtx *fctx) REDISMODULE_ATTR;
747 REDISMODULE_API const RedisModuleString * (*RedisModule_CommandFilterArgGet)(RedisModuleCommandFilterCtx *fctx, int pos) REDISMODULE_ATTR;
748 REDISMODULE_API int (*RedisModule_CommandFilterArgInsert)(RedisModuleCommandFilterCtx *fctx, int pos, RedisModuleString *arg) REDISMODULE_ATTR;
749 REDISMODULE_API int (*RedisModule_CommandFilterArgReplace)(RedisModuleCommandFilterCtx *fctx, int pos, RedisModuleString *arg) REDISMODULE_ATTR;
750 REDISMODULE_API int (*RedisModule_CommandFilterArgDelete)(RedisModuleCommandFilterCtx *fctx, int pos) REDISMODULE_ATTR;
751 REDISMODULE_API int (*RedisModule_Fork)(RedisModuleForkDoneHandler cb, void *user_data) REDISMODULE_ATTR;
752 REDISMODULE_API int (*RedisModule_ExitFromChild)(int retcode) REDISMODULE_ATTR;
753 REDISMODULE_API int (*RedisModule_KillForkChild)(int child_pid) REDISMODULE_ATTR;
754 REDISMODULE_API float (*RedisModule_GetUsedMemoryRatio)() REDISMODULE_ATTR;
755 REDISMODULE_API size_t (*RedisModule_MallocSize)(void* ptr) REDISMODULE_ATTR;
756 REDISMODULE_API RedisModuleUser * (*RedisModule_CreateModuleUser)(const char *name) REDISMODULE_ATTR;
757 REDISMODULE_API void (*RedisModule_FreeModuleUser)(RedisModuleUser *user) REDISMODULE_ATTR;
758 REDISMODULE_API int (*RedisModule_SetModuleUserACL)(RedisModuleUser *user, const char* acl) REDISMODULE_ATTR;
759 REDISMODULE_API int (*RedisModule_AuthenticateClientWithACLUser)(RedisModuleCtx *ctx, const char *name, size_t len, RedisModuleUserChangedFunc callback, void *privdata, uint64_t *client_id) REDISMODULE_ATTR;
760 REDISMODULE_API int (*RedisModule_AuthenticateClientWithUser)(RedisModuleCtx *ctx, RedisModuleUser *user, RedisModuleUserChangedFunc callback, void *privdata, uint64_t *client_id) REDISMODULE_ATTR;
761 REDISMODULE_API int (*RedisModule_DeauthenticateAndCloseClient)(RedisModuleCtx *ctx, uint64_t client_id) REDISMODULE_ATTR;
762 REDISMODULE_API RedisModuleString * (*RedisModule_GetClientCertificate)(RedisModuleCtx *ctx, uint64_t id) REDISMODULE_ATTR;
763 REDISMODULE_API int *(*RedisModule_GetCommandKeys)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, int *num_keys) REDISMODULE_ATTR;
764 #endif
765 
766 #define RedisModule_IsAOFClient(id) ((id) == CLIENT_ID_AOF)
767 
768 /* This is included inline inside each Redis module. */
769 static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) REDISMODULE_ATTR_UNUSED;
RedisModule_Init(RedisModuleCtx * ctx,const char * name,int ver,int apiver)770 static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
771     void *getapifuncptr = ((void**)ctx)[0];
772     RedisModule_GetApi = (int (*)(const char *, void *)) (unsigned long)getapifuncptr;
773     REDISMODULE_GET_API(Alloc);
774     REDISMODULE_GET_API(Calloc);
775     REDISMODULE_GET_API(Free);
776     REDISMODULE_GET_API(Realloc);
777     REDISMODULE_GET_API(Strdup);
778     REDISMODULE_GET_API(CreateCommand);
779     REDISMODULE_GET_API(SetModuleAttribs);
780     REDISMODULE_GET_API(IsModuleNameBusy);
781     REDISMODULE_GET_API(WrongArity);
782     REDISMODULE_GET_API(ReplyWithLongLong);
783     REDISMODULE_GET_API(ReplyWithError);
784     REDISMODULE_GET_API(ReplyWithSimpleString);
785     REDISMODULE_GET_API(ReplyWithArray);
786     REDISMODULE_GET_API(ReplyWithNullArray);
787     REDISMODULE_GET_API(ReplyWithEmptyArray);
788     REDISMODULE_GET_API(ReplySetArrayLength);
789     REDISMODULE_GET_API(ReplyWithStringBuffer);
790     REDISMODULE_GET_API(ReplyWithCString);
791     REDISMODULE_GET_API(ReplyWithString);
792     REDISMODULE_GET_API(ReplyWithEmptyString);
793     REDISMODULE_GET_API(ReplyWithVerbatimString);
794     REDISMODULE_GET_API(ReplyWithNull);
795     REDISMODULE_GET_API(ReplyWithCallReply);
796     REDISMODULE_GET_API(ReplyWithDouble);
797     REDISMODULE_GET_API(ReplyWithLongDouble);
798     REDISMODULE_GET_API(GetSelectedDb);
799     REDISMODULE_GET_API(SelectDb);
800     REDISMODULE_GET_API(OpenKey);
801     REDISMODULE_GET_API(CloseKey);
802     REDISMODULE_GET_API(KeyType);
803     REDISMODULE_GET_API(ValueLength);
804     REDISMODULE_GET_API(ListPush);
805     REDISMODULE_GET_API(ListPop);
806     REDISMODULE_GET_API(StringToLongLong);
807     REDISMODULE_GET_API(StringToDouble);
808     REDISMODULE_GET_API(StringToLongDouble);
809     REDISMODULE_GET_API(Call);
810     REDISMODULE_GET_API(CallReplyProto);
811     REDISMODULE_GET_API(FreeCallReply);
812     REDISMODULE_GET_API(CallReplyInteger);
813     REDISMODULE_GET_API(CallReplyType);
814     REDISMODULE_GET_API(CallReplyLength);
815     REDISMODULE_GET_API(CallReplyArrayElement);
816     REDISMODULE_GET_API(CallReplyStringPtr);
817     REDISMODULE_GET_API(CreateStringFromCallReply);
818     REDISMODULE_GET_API(CreateString);
819     REDISMODULE_GET_API(CreateStringFromLongLong);
820     REDISMODULE_GET_API(CreateStringFromDouble);
821     REDISMODULE_GET_API(CreateStringFromLongDouble);
822     REDISMODULE_GET_API(CreateStringFromString);
823     REDISMODULE_GET_API(CreateStringPrintf);
824     REDISMODULE_GET_API(FreeString);
825     REDISMODULE_GET_API(StringPtrLen);
826     REDISMODULE_GET_API(AutoMemory);
827     REDISMODULE_GET_API(Replicate);
828     REDISMODULE_GET_API(ReplicateVerbatim);
829     REDISMODULE_GET_API(DeleteKey);
830     REDISMODULE_GET_API(UnlinkKey);
831     REDISMODULE_GET_API(StringSet);
832     REDISMODULE_GET_API(StringDMA);
833     REDISMODULE_GET_API(StringTruncate);
834     REDISMODULE_GET_API(GetExpire);
835     REDISMODULE_GET_API(SetExpire);
836     REDISMODULE_GET_API(ResetDataset);
837     REDISMODULE_GET_API(DbSize);
838     REDISMODULE_GET_API(RandomKey);
839     REDISMODULE_GET_API(ZsetAdd);
840     REDISMODULE_GET_API(ZsetIncrby);
841     REDISMODULE_GET_API(ZsetScore);
842     REDISMODULE_GET_API(ZsetRem);
843     REDISMODULE_GET_API(ZsetRangeStop);
844     REDISMODULE_GET_API(ZsetFirstInScoreRange);
845     REDISMODULE_GET_API(ZsetLastInScoreRange);
846     REDISMODULE_GET_API(ZsetFirstInLexRange);
847     REDISMODULE_GET_API(ZsetLastInLexRange);
848     REDISMODULE_GET_API(ZsetRangeCurrentElement);
849     REDISMODULE_GET_API(ZsetRangeNext);
850     REDISMODULE_GET_API(ZsetRangePrev);
851     REDISMODULE_GET_API(ZsetRangeEndReached);
852     REDISMODULE_GET_API(HashSet);
853     REDISMODULE_GET_API(HashGet);
854     REDISMODULE_GET_API(IsKeysPositionRequest);
855     REDISMODULE_GET_API(KeyAtPos);
856     REDISMODULE_GET_API(GetClientId);
857     REDISMODULE_GET_API(GetContextFlags);
858     REDISMODULE_GET_API(AvoidReplicaTraffic);
859     REDISMODULE_GET_API(PoolAlloc);
860     REDISMODULE_GET_API(CreateDataType);
861     REDISMODULE_GET_API(ModuleTypeSetValue);
862     REDISMODULE_GET_API(ModuleTypeReplaceValue);
863     REDISMODULE_GET_API(ModuleTypeGetType);
864     REDISMODULE_GET_API(ModuleTypeGetValue);
865     REDISMODULE_GET_API(IsIOError);
866     REDISMODULE_GET_API(SetModuleOptions);
867     REDISMODULE_GET_API(SignalModifiedKey);
868     REDISMODULE_GET_API(SaveUnsigned);
869     REDISMODULE_GET_API(LoadUnsigned);
870     REDISMODULE_GET_API(SaveSigned);
871     REDISMODULE_GET_API(LoadSigned);
872     REDISMODULE_GET_API(SaveString);
873     REDISMODULE_GET_API(SaveStringBuffer);
874     REDISMODULE_GET_API(LoadString);
875     REDISMODULE_GET_API(LoadStringBuffer);
876     REDISMODULE_GET_API(SaveDouble);
877     REDISMODULE_GET_API(LoadDouble);
878     REDISMODULE_GET_API(SaveFloat);
879     REDISMODULE_GET_API(LoadFloat);
880     REDISMODULE_GET_API(SaveLongDouble);
881     REDISMODULE_GET_API(LoadLongDouble);
882     REDISMODULE_GET_API(SaveDataTypeToString);
883     REDISMODULE_GET_API(LoadDataTypeFromString);
884     REDISMODULE_GET_API(EmitAOF);
885     REDISMODULE_GET_API(Log);
886     REDISMODULE_GET_API(LogIOError);
887     REDISMODULE_GET_API(_Assert);
888     REDISMODULE_GET_API(LatencyAddSample);
889     REDISMODULE_GET_API(StringAppendBuffer);
890     REDISMODULE_GET_API(RetainString);
891     REDISMODULE_GET_API(HoldString);
892     REDISMODULE_GET_API(StringCompare);
893     REDISMODULE_GET_API(GetContextFromIO);
894     REDISMODULE_GET_API(GetKeyNameFromIO);
895     REDISMODULE_GET_API(GetKeyNameFromModuleKey);
896     REDISMODULE_GET_API(Milliseconds);
897     REDISMODULE_GET_API(DigestAddStringBuffer);
898     REDISMODULE_GET_API(DigestAddLongLong);
899     REDISMODULE_GET_API(DigestEndSequence);
900     REDISMODULE_GET_API(CreateDict);
901     REDISMODULE_GET_API(FreeDict);
902     REDISMODULE_GET_API(DictSize);
903     REDISMODULE_GET_API(DictSetC);
904     REDISMODULE_GET_API(DictReplaceC);
905     REDISMODULE_GET_API(DictSet);
906     REDISMODULE_GET_API(DictReplace);
907     REDISMODULE_GET_API(DictGetC);
908     REDISMODULE_GET_API(DictGet);
909     REDISMODULE_GET_API(DictDelC);
910     REDISMODULE_GET_API(DictDel);
911     REDISMODULE_GET_API(DictIteratorStartC);
912     REDISMODULE_GET_API(DictIteratorStart);
913     REDISMODULE_GET_API(DictIteratorStop);
914     REDISMODULE_GET_API(DictIteratorReseekC);
915     REDISMODULE_GET_API(DictIteratorReseek);
916     REDISMODULE_GET_API(DictNextC);
917     REDISMODULE_GET_API(DictPrevC);
918     REDISMODULE_GET_API(DictNext);
919     REDISMODULE_GET_API(DictPrev);
920     REDISMODULE_GET_API(DictCompare);
921     REDISMODULE_GET_API(DictCompareC);
922     REDISMODULE_GET_API(RegisterInfoFunc);
923     REDISMODULE_GET_API(InfoAddSection);
924     REDISMODULE_GET_API(InfoBeginDictField);
925     REDISMODULE_GET_API(InfoEndDictField);
926     REDISMODULE_GET_API(InfoAddFieldString);
927     REDISMODULE_GET_API(InfoAddFieldCString);
928     REDISMODULE_GET_API(InfoAddFieldDouble);
929     REDISMODULE_GET_API(InfoAddFieldLongLong);
930     REDISMODULE_GET_API(InfoAddFieldULongLong);
931     REDISMODULE_GET_API(GetServerInfo);
932     REDISMODULE_GET_API(FreeServerInfo);
933     REDISMODULE_GET_API(ServerInfoGetField);
934     REDISMODULE_GET_API(ServerInfoGetFieldC);
935     REDISMODULE_GET_API(ServerInfoGetFieldSigned);
936     REDISMODULE_GET_API(ServerInfoGetFieldUnsigned);
937     REDISMODULE_GET_API(ServerInfoGetFieldDouble);
938     REDISMODULE_GET_API(GetClientInfoById);
939     REDISMODULE_GET_API(PublishMessage);
940     REDISMODULE_GET_API(SubscribeToServerEvent);
941     REDISMODULE_GET_API(SetLRU);
942     REDISMODULE_GET_API(GetLRU);
943     REDISMODULE_GET_API(SetLFU);
944     REDISMODULE_GET_API(GetLFU);
945     REDISMODULE_GET_API(BlockClientOnKeys);
946     REDISMODULE_GET_API(SignalKeyAsReady);
947     REDISMODULE_GET_API(GetBlockedClientReadyKey);
948     REDISMODULE_GET_API(ScanCursorCreate);
949     REDISMODULE_GET_API(ScanCursorRestart);
950     REDISMODULE_GET_API(ScanCursorDestroy);
951     REDISMODULE_GET_API(Scan);
952     REDISMODULE_GET_API(ScanKey);
953     REDISMODULE_GET_API(GetContextFlagsAll);
954     REDISMODULE_GET_API(GetKeyspaceNotificationFlagsAll);
955     REDISMODULE_GET_API(IsSubEventSupported);
956     REDISMODULE_GET_API(GetServerVersion);
957 
958 #ifdef REDISMODULE_EXPERIMENTAL_API
959     REDISMODULE_GET_API(GetThreadSafeContext);
960     REDISMODULE_GET_API(GetDetachedThreadSafeContext);
961     REDISMODULE_GET_API(FreeThreadSafeContext);
962     REDISMODULE_GET_API(ThreadSafeContextLock);
963     REDISMODULE_GET_API(ThreadSafeContextTryLock);
964     REDISMODULE_GET_API(ThreadSafeContextUnlock);
965     REDISMODULE_GET_API(BlockClient);
966     REDISMODULE_GET_API(UnblockClient);
967     REDISMODULE_GET_API(IsBlockedReplyRequest);
968     REDISMODULE_GET_API(IsBlockedTimeoutRequest);
969     REDISMODULE_GET_API(GetBlockedClientPrivateData);
970     REDISMODULE_GET_API(GetBlockedClientHandle);
971     REDISMODULE_GET_API(AbortBlock);
972     REDISMODULE_GET_API(SetDisconnectCallback);
973     REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
974     REDISMODULE_GET_API(NotifyKeyspaceEvent);
975     REDISMODULE_GET_API(GetNotifyKeyspaceEvents);
976     REDISMODULE_GET_API(BlockedClientDisconnected);
977     REDISMODULE_GET_API(RegisterClusterMessageReceiver);
978     REDISMODULE_GET_API(SendClusterMessage);
979     REDISMODULE_GET_API(GetClusterNodeInfo);
980     REDISMODULE_GET_API(GetClusterNodesList);
981     REDISMODULE_GET_API(FreeClusterNodesList);
982     REDISMODULE_GET_API(CreateTimer);
983     REDISMODULE_GET_API(StopTimer);
984     REDISMODULE_GET_API(GetTimerInfo);
985     REDISMODULE_GET_API(GetMyClusterID);
986     REDISMODULE_GET_API(GetClusterSize);
987     REDISMODULE_GET_API(GetRandomBytes);
988     REDISMODULE_GET_API(GetRandomHexChars);
989     REDISMODULE_GET_API(SetClusterFlags);
990     REDISMODULE_GET_API(ExportSharedAPI);
991     REDISMODULE_GET_API(GetSharedAPI);
992     REDISMODULE_GET_API(RegisterCommandFilter);
993     REDISMODULE_GET_API(UnregisterCommandFilter);
994     REDISMODULE_GET_API(CommandFilterArgsCount);
995     REDISMODULE_GET_API(CommandFilterArgGet);
996     REDISMODULE_GET_API(CommandFilterArgInsert);
997     REDISMODULE_GET_API(CommandFilterArgReplace);
998     REDISMODULE_GET_API(CommandFilterArgDelete);
999     REDISMODULE_GET_API(Fork);
1000     REDISMODULE_GET_API(ExitFromChild);
1001     REDISMODULE_GET_API(KillForkChild);
1002     REDISMODULE_GET_API(GetUsedMemoryRatio);
1003     REDISMODULE_GET_API(MallocSize);
1004     REDISMODULE_GET_API(CreateModuleUser);
1005     REDISMODULE_GET_API(FreeModuleUser);
1006     REDISMODULE_GET_API(SetModuleUserACL);
1007     REDISMODULE_GET_API(DeauthenticateAndCloseClient);
1008     REDISMODULE_GET_API(AuthenticateClientWithACLUser);
1009     REDISMODULE_GET_API(AuthenticateClientWithUser);
1010     REDISMODULE_GET_API(GetClientCertificate);
1011     REDISMODULE_GET_API(GetCommandKeys);
1012 #endif
1013 
1014     if (RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR;
1015     RedisModule_SetModuleAttribs(ctx,name,ver,apiver);
1016     return REDISMODULE_OK;
1017 }
1018 
1019 #define RedisModule_Assert(_e) ((_e)?(void)0 : (RedisModule__Assert(#_e,__FILE__,__LINE__),exit(1)))
1020 
1021 #define RMAPI_FUNC_SUPPORTED(func) (func != NULL)
1022 
1023 #else
1024 
1025 /* Things only defined for the modules core, not exported to modules
1026  * including this file. */
1027 #define RedisModuleString robj
1028 
1029 #endif /* REDISMODULE_CORE */
1030 #endif /* REDISMODULE_H */
1031