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