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#define REDISMODULE_CONFIG_DEFAULT 0 /* This is the default for a module config. */
84#define REDISMODULE_CONFIG_IMMUTABLE (1ULL<<0) /* Can this value only be set at startup? */
85#define REDISMODULE_CONFIG_SENSITIVE (1ULL<<1) /* Does this value contain sensitive information */
86#define REDISMODULE_CONFIG_HIDDEN (1ULL<<4) /* This config is hidden in `config get <pattern>` (used for tests/debugging) */
87#define REDISMODULE_CONFIG_PROTECTED (1ULL<<5) /* Becomes immutable if enable-protected-configs is enabled. */
88#define REDISMODULE_CONFIG_DENY_LOADING (1ULL<<6) /* This config is forbidden during loading. */
89
90#define REDISMODULE_CONFIG_MEMORY (1ULL<<7) /* Indicates if this value can be set as a memory value */
91#define REDISMODULE_CONFIG_BITFLAGS (1ULL<<8) /* Indicates if this value can be set as a multiple enum values */
92
93/* StreamID type. */
94typedef struct RedisModuleStreamID {
95 uint64_t ms;
96 uint64_t seq;
97} RedisModuleStreamID;
98
99/* StreamAdd() flags. */
100#define REDISMODULE_STREAM_ADD_AUTOID (1<<0)
101/* StreamIteratorStart() flags. */
102#define REDISMODULE_STREAM_ITERATOR_EXCLUSIVE (1<<0)
103#define REDISMODULE_STREAM_ITERATOR_REVERSE (1<<1)
104/* StreamIteratorTrim*() flags. */
105#define REDISMODULE_STREAM_TRIM_APPROX (1<<0)
106
107/* Context Flags: Info about the current context returned by
108 * RM_GetContextFlags(). */
109
110/* The command is running in the context of a Lua script */
111#define REDISMODULE_CTX_FLAGS_LUA (1<<0)
112/* The command is running inside a Redis transaction */
113#define REDISMODULE_CTX_FLAGS_MULTI (1<<1)
114/* The instance is a master */
115#define REDISMODULE_CTX_FLAGS_MASTER (1<<2)
116/* The instance is a slave */
117#define REDISMODULE_CTX_FLAGS_SLAVE (1<<3)
118/* The instance is read-only (usually meaning it's a slave as well) */
119#define REDISMODULE_CTX_FLAGS_READONLY (1<<4)
120/* The instance is running in cluster mode */
121#define REDISMODULE_CTX_FLAGS_CLUSTER (1<<5)
122/* The instance has AOF enabled */
123#define REDISMODULE_CTX_FLAGS_AOF (1<<6)
124/* The instance has RDB enabled */
125#define REDISMODULE_CTX_FLAGS_RDB (1<<7)
126/* The instance has Maxmemory set */
127#define REDISMODULE_CTX_FLAGS_MAXMEMORY (1<<8)
128/* Maxmemory is set and has an eviction policy that may delete keys */
129#define REDISMODULE_CTX_FLAGS_EVICT (1<<9)
130/* Redis is out of memory according to the maxmemory flag. */
131#define REDISMODULE_CTX_FLAGS_OOM (1<<10)
132/* Less than 25% of memory available according to maxmemory. */
133#define REDISMODULE_CTX_FLAGS_OOM_WARNING (1<<11)
134/* The command was sent over the replication link. */
135#define REDISMODULE_CTX_FLAGS_REPLICATED (1<<12)
136/* Redis is currently loading either from AOF or RDB. */
137#define REDISMODULE_CTX_FLAGS_LOADING (1<<13)
138/* The replica has no link with its master, note that
139 * there is the inverse flag as well:
140 *
141 * REDISMODULE_CTX_FLAGS_REPLICA_IS_ONLINE
142 *
143 * The two flags are exclusive, one or the other can be set. */
144#define REDISMODULE_CTX_FLAGS_REPLICA_IS_STALE (1<<14)
145/* The replica is trying to connect with the master.
146 * (REPL_STATE_CONNECT and REPL_STATE_CONNECTING states) */
147#define REDISMODULE_CTX_FLAGS_REPLICA_IS_CONNECTING (1<<15)
148/* THe replica is receiving an RDB file from its master. */
149#define REDISMODULE_CTX_FLAGS_REPLICA_IS_TRANSFERRING (1<<16)
150/* The replica is online, receiving updates from its master. */
151#define REDISMODULE_CTX_FLAGS_REPLICA_IS_ONLINE (1<<17)
152/* There is currently some background process active. */
153#define REDISMODULE_CTX_FLAGS_ACTIVE_CHILD (1<<18)
154/* The next EXEC will fail due to dirty CAS (touched keys). */
155#define REDISMODULE_CTX_FLAGS_MULTI_DIRTY (1<<19)
156/* Redis is currently running inside background child process. */
157#define REDISMODULE_CTX_FLAGS_IS_CHILD (1<<20)
158/* The current client does not allow blocking, either called from
159 * within multi, lua, or from another module using RM_Call */
160#define REDISMODULE_CTX_FLAGS_DENY_BLOCKING (1<<21)
161/* The current client uses RESP3 protocol */
162#define REDISMODULE_CTX_FLAGS_RESP3 (1<<22)
163/* Redis is currently async loading database for diskless replication. */
164#define REDISMODULE_CTX_FLAGS_ASYNC_LOADING (1<<23)
165
166/* Next context flag, must be updated when adding new flags above!
167This flag should not be used directly by the module.
168 * Use RedisModule_GetContextFlagsAll instead. */
169#define _REDISMODULE_CTX_FLAGS_NEXT (1<<24)
170
171/* Keyspace changes notification classes. Every class is associated with a
172 * character for configuration purposes.
173 * NOTE: These have to be in sync with NOTIFY_* in server.h */
174#define REDISMODULE_NOTIFY_KEYSPACE (1<<0) /* K */
175#define REDISMODULE_NOTIFY_KEYEVENT (1<<1) /* E */
176#define REDISMODULE_NOTIFY_GENERIC (1<<2) /* g */
177#define REDISMODULE_NOTIFY_STRING (1<<3) /* $ */
178#define REDISMODULE_NOTIFY_LIST (1<<4) /* l */
179#define REDISMODULE_NOTIFY_SET (1<<5) /* s */
180#define REDISMODULE_NOTIFY_HASH (1<<6) /* h */
181#define REDISMODULE_NOTIFY_ZSET (1<<7) /* z */
182#define REDISMODULE_NOTIFY_EXPIRED (1<<8) /* x */
183#define REDISMODULE_NOTIFY_EVICTED (1<<9) /* e */
184#define REDISMODULE_NOTIFY_STREAM (1<<10) /* t */
185#define REDISMODULE_NOTIFY_KEY_MISS (1<<11) /* m (Note: This one is excluded from REDISMODULE_NOTIFY_ALL on purpose) */
186#define REDISMODULE_NOTIFY_LOADED (1<<12) /* module only key space notification, indicate a key loaded from rdb */
187#define REDISMODULE_NOTIFY_MODULE (1<<13) /* d, module key space notification */
188#define REDISMODULE_NOTIFY_NEW (1<<14) /* n, new key notification */
189
190/* Next notification flag, must be updated when adding new flags above!
191This flag should not be used directly by the module.
192 * Use RedisModule_GetKeyspaceNotificationFlagsAll instead. */
193#define _REDISMODULE_NOTIFY_NEXT (1<<15)
194
195#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 */
196
197/* A special pointer that we can use between the core and the module to signal
198 * field deletion, and that is impossible to be a valid pointer. */
199#define REDISMODULE_HASH_DELETE ((RedisModuleString*)(long)1)
200
201/* Error messages. */
202#define REDISMODULE_ERRORMSG_WRONGTYPE "WRONGTYPE Operation against a key holding the wrong kind of value"
203
204#define REDISMODULE_POSITIVE_INFINITE (1.0/0.0)
205#define REDISMODULE_NEGATIVE_INFINITE (-1.0/0.0)
206
207/* Cluster API defines. */
208#define REDISMODULE_NODE_ID_LEN 40
209#define REDISMODULE_NODE_MYSELF (1<<0)
210#define REDISMODULE_NODE_MASTER (1<<1)
211#define REDISMODULE_NODE_SLAVE (1<<2)
212#define REDISMODULE_NODE_PFAIL (1<<3)
213#define REDISMODULE_NODE_FAIL (1<<4)
214#define REDISMODULE_NODE_NOFAILOVER (1<<5)
215
216#define REDISMODULE_CLUSTER_FLAG_NONE 0
217#define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1)
218#define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2)
219
220#define REDISMODULE_NOT_USED(V) ((void) V)
221
222/* Logging level strings */
223#define REDISMODULE_LOGLEVEL_DEBUG "debug"
224#define REDISMODULE_LOGLEVEL_VERBOSE "verbose"
225#define REDISMODULE_LOGLEVEL_NOTICE "notice"
226#define REDISMODULE_LOGLEVEL_WARNING "warning"
227
228/* Bit flags for aux_save_triggers and the aux_load and aux_save callbacks */
229#define REDISMODULE_AUX_BEFORE_RDB (1<<0)
230#define REDISMODULE_AUX_AFTER_RDB (1<<1)
231
232/* RM_Yield flags */
233#define REDISMODULE_YIELD_FLAG_NONE (1<<0)
234#define REDISMODULE_YIELD_FLAG_CLIENTS (1<<1)
235
236/* This type represents a timer handle, and is returned when a timer is
237 * registered and used in order to invalidate a timer. It's just a 64 bit
238 * number, because this is how each timer is represented inside the radix tree
239 * of timers that are going to expire, sorted by expire time. */
240typedef uint64_t RedisModuleTimerID;
241
242/* CommandFilter Flags */
243
244/* Do filter RedisModule_Call() commands initiated by module itself. */
245#define REDISMODULE_CMDFILTER_NOSELF (1<<0)
246
247/* Declare that the module can handle errors with RedisModule_SetModuleOptions. */
248#define REDISMODULE_OPTIONS_HANDLE_IO_ERRORS (1<<0)
249
250/* When set, Redis will not call RedisModule_SignalModifiedKey(), implicitly in
251 * RedisModule_CloseKey, and the module needs to do that when manually when keys
252 * are modified from the user's perspective, to invalidate WATCH. */
253#define REDISMODULE_OPTION_NO_IMPLICIT_SIGNAL_MODIFIED (1<<1)
254
255/* Declare that the module can handle diskless async replication with RedisModule_SetModuleOptions. */
256#define REDISMODULE_OPTIONS_HANDLE_REPL_ASYNC_LOAD (1<<2)
257
258/* Definitions for RedisModule_SetCommandInfo. */
259
260typedef enum {
261 REDISMODULE_ARG_TYPE_STRING,
262 REDISMODULE_ARG_TYPE_INTEGER,
263 REDISMODULE_ARG_TYPE_DOUBLE,
264 REDISMODULE_ARG_TYPE_KEY, /* A string, but represents a keyname */
265 REDISMODULE_ARG_TYPE_PATTERN,
266 REDISMODULE_ARG_TYPE_UNIX_TIME,
267 REDISMODULE_ARG_TYPE_PURE_TOKEN,
268 REDISMODULE_ARG_TYPE_ONEOF, /* Must have sub-arguments */
269 REDISMODULE_ARG_TYPE_BLOCK /* Must have sub-arguments */
270} RedisModuleCommandArgType;
271
272#define REDISMODULE_CMD_ARG_NONE (0)
273#define REDISMODULE_CMD_ARG_OPTIONAL (1<<0) /* The argument is optional (like GET in SET command) */
274#define REDISMODULE_CMD_ARG_MULTIPLE (1<<1) /* The argument may repeat itself (like key in DEL) */
275#define REDISMODULE_CMD_ARG_MULTIPLE_TOKEN (1<<2) /* The argument may repeat itself, and so does its token (like `GET pattern` in SORT) */
276#define _REDISMODULE_CMD_ARG_NEXT (1<<3)
277
278typedef enum {
279 REDISMODULE_KSPEC_BS_INVALID = 0, /* Must be zero. An implicitly value of
280 * zero is provided when the field is
281 * absent in a struct literal. */
282 REDISMODULE_KSPEC_BS_UNKNOWN,
283 REDISMODULE_KSPEC_BS_INDEX,
284 REDISMODULE_KSPEC_BS_KEYWORD
285} RedisModuleKeySpecBeginSearchType;
286
287typedef enum {
288 REDISMODULE_KSPEC_FK_OMITTED = 0, /* Used when the field is absent in a
289 * struct literal. Don't use this value
290 * explicitly. */
291 REDISMODULE_KSPEC_FK_UNKNOWN,
292 REDISMODULE_KSPEC_FK_RANGE,
293 REDISMODULE_KSPEC_FK_KEYNUM
294} RedisModuleKeySpecFindKeysType;
295
296/* Key-spec flags. For details, see the documentation of
297 * RedisModule_SetCommandInfo and the key-spec flags in server.h. */
298#define REDISMODULE_CMD_KEY_RO (1ULL<<0)
299#define REDISMODULE_CMD_KEY_RW (1ULL<<1)
300#define REDISMODULE_CMD_KEY_OW (1ULL<<2)
301#define REDISMODULE_CMD_KEY_RM (1ULL<<3)
302#define REDISMODULE_CMD_KEY_ACCESS (1ULL<<4)
303#define REDISMODULE_CMD_KEY_UPDATE (1ULL<<5)
304#define REDISMODULE_CMD_KEY_INSERT (1ULL<<6)
305#define REDISMODULE_CMD_KEY_DELETE (1ULL<<7)
306#define REDISMODULE_CMD_KEY_NOT_KEY (1ULL<<8)
307#define REDISMODULE_CMD_KEY_INCOMPLETE (1ULL<<9)
308#define REDISMODULE_CMD_KEY_VARIABLE_FLAGS (1ULL<<10)
309
310/* Channel flags, for details see the documentation of
311 * RedisModule_ChannelAtPosWithFlags. */
312#define REDISMODULE_CMD_CHANNEL_PATTERN (1ULL<<0)
313#define REDISMODULE_CMD_CHANNEL_PUBLISH (1ULL<<1)
314#define REDISMODULE_CMD_CHANNEL_SUBSCRIBE (1ULL<<2)
315#define REDISMODULE_CMD_CHANNEL_UNSUBSCRIBE (1ULL<<3)
316
317typedef struct RedisModuleCommandArg {
318 const char *name;
319 RedisModuleCommandArgType type;
320 int key_spec_index; /* If type is KEY, this is a zero-based index of
321 * the key_spec in the command. For other types,
322 * you may specify -1. */
323 const char *token; /* If type is PURE_TOKEN, this is the token. */
324 const char *summary;
325 const char *since;
326 int flags; /* The REDISMODULE_CMD_ARG_* macros. */
327 const char *deprecated_since;
328 struct RedisModuleCommandArg *subargs;
329} RedisModuleCommandArg;
330
331typedef struct {
332 const char *since;
333 const char *changes;
334} RedisModuleCommandHistoryEntry;
335
336typedef struct {
337 const char *notes;
338 uint64_t flags; /* REDISMODULE_CMD_KEY_* macros. */
339 RedisModuleKeySpecBeginSearchType begin_search_type;
340 union {
341 struct {
342 /* The index from which we start the search for keys */
343 int pos;
344 } index;
345 struct {
346 /* The keyword that indicates the beginning of key args */
347 const char *keyword;
348 /* An index in argv from which to start searching.
349 * Can be negative, which means start search from the end, in reverse
350 * (Example: -2 means to start in reverse from the penultimate arg) */
351 int startfrom;
352 } keyword;
353 } bs;
354 RedisModuleKeySpecFindKeysType find_keys_type;
355 union {
356 struct {
357 /* Index of the last key relative to the result of the begin search
358 * step. Can be negative, in which case it's not relative. -1
359 * indicating till the last argument, -2 one before the last and so
360 * on. */
361 int lastkey;
362 /* How many args should we skip after finding a key, in order to
363 * find the next one. */
364 int keystep;
365 /* If lastkey is -1, we use limit to stop the search by a factor. 0
366 * and 1 mean no limit. 2 means 1/2 of the remaining args, 3 means
367 * 1/3, and so on. */
368 int limit;
369 } range;
370 struct {
371 /* Index of the argument containing the number of keys to come
372 * relative to the result of the begin search step */
373 int keynumidx;
374 /* Index of the fist key. (Usually it's just after keynumidx, in
375 * which case it should be set to keynumidx + 1.) */
376 int firstkey;
377 /* How many args should we skip after finding a key, in order to
378 * find the next one, relative to the result of the begin search
379 * step. */
380 int keystep;
381 } keynum;
382 } fk;
383} RedisModuleCommandKeySpec;
384
385typedef struct {
386 int version;
387 size_t sizeof_historyentry;
388 size_t sizeof_keyspec;
389 size_t sizeof_arg;
390} RedisModuleCommandInfoVersion;
391
392static const RedisModuleCommandInfoVersion RedisModule_CurrentCommandInfoVersion = {
393 .version = 1,
394 .sizeof_historyentry = sizeof(RedisModuleCommandHistoryEntry),
395 .sizeof_keyspec = sizeof(RedisModuleCommandKeySpec),
396 .sizeof_arg = sizeof(RedisModuleCommandArg)
397};
398
399#define REDISMODULE_COMMAND_INFO_VERSION (&RedisModule_CurrentCommandInfoVersion)
400
401typedef struct {
402 /* Always set version to REDISMODULE_COMMAND_INFO_VERSION */
403 const RedisModuleCommandInfoVersion *version;
404 /* Version 1 fields (added in Redis 7.0.0) */
405 const char *summary; /* Summary of the command */
406 const char *complexity; /* Complexity description */
407 const char *since; /* Debut module version of the command */
408 RedisModuleCommandHistoryEntry *history; /* History */
409 /* A string of space-separated tips meant for clients/proxies regarding this
410 * command */
411 const char *tips;
412 /* Number of arguments, it is possible to use -N to say >= N */
413 int arity;
414 RedisModuleCommandKeySpec *key_specs;
415 RedisModuleCommandArg *args;
416} RedisModuleCommandInfo;
417
418/* Eventloop definitions. */
419#define REDISMODULE_EVENTLOOP_READABLE 1
420#define REDISMODULE_EVENTLOOP_WRITABLE 2
421typedef void (*RedisModuleEventLoopFunc)(int fd, void *user_data, int mask);
422typedef void (*RedisModuleEventLoopOneShotFunc)(void *user_data);
423
424/* Server events definitions.
425 * Those flags should not be used directly by the module, instead
426 * the module should use RedisModuleEvent_* variables.
427 * Note: This must be synced with moduleEventVersions */
428#define REDISMODULE_EVENT_REPLICATION_ROLE_CHANGED 0
429#define REDISMODULE_EVENT_PERSISTENCE 1
430#define REDISMODULE_EVENT_FLUSHDB 2
431#define REDISMODULE_EVENT_LOADING 3
432#define REDISMODULE_EVENT_CLIENT_CHANGE 4
433#define REDISMODULE_EVENT_SHUTDOWN 5
434#define REDISMODULE_EVENT_REPLICA_CHANGE 6
435#define REDISMODULE_EVENT_MASTER_LINK_CHANGE 7
436#define REDISMODULE_EVENT_CRON_LOOP 8
437#define REDISMODULE_EVENT_MODULE_CHANGE 9
438#define REDISMODULE_EVENT_LOADING_PROGRESS 10
439#define REDISMODULE_EVENT_SWAPDB 11
440#define REDISMODULE_EVENT_REPL_BACKUP 12 /* Deprecated since Redis 7.0, not used anymore. */
441#define REDISMODULE_EVENT_FORK_CHILD 13
442#define REDISMODULE_EVENT_REPL_ASYNC_LOAD 14
443#define REDISMODULE_EVENT_EVENTLOOP 15
444#define REDISMODULE_EVENT_CONFIG 16
445#define _REDISMODULE_EVENT_NEXT 17 /* Next event flag, should be updated if a new event added. */
446
447typedef struct RedisModuleEvent {
448 uint64_t id; /* REDISMODULE_EVENT_... defines. */
449 uint64_t dataver; /* Version of the structure we pass as 'data'. */
450} RedisModuleEvent;
451
452struct RedisModuleCtx;
453struct RedisModuleDefragCtx;
454typedef void (*RedisModuleEventCallback)(struct RedisModuleCtx *ctx, RedisModuleEvent eid, uint64_t subevent, void *data);
455
456/* IMPORTANT: When adding a new version of one of below structures that contain
457 * event data (RedisModuleFlushInfoV1 for example) we have to avoid renaming the
458 * old RedisModuleEvent structure.
459 * For example, if we want to add RedisModuleFlushInfoV2, the RedisModuleEvent
460 * structures should be:
461 * RedisModuleEvent_FlushDB = {
462 * REDISMODULE_EVENT_FLUSHDB,
463 * 1
464 * },
465 * RedisModuleEvent_FlushDBV2 = {
466 * REDISMODULE_EVENT_FLUSHDB,
467 * 2
468 * }
469 * and NOT:
470 * RedisModuleEvent_FlushDBV1 = {
471 * REDISMODULE_EVENT_FLUSHDB,
472 * 1
473 * },
474 * RedisModuleEvent_FlushDB = {
475 * REDISMODULE_EVENT_FLUSHDB,
476 * 2
477 * }
478 * The reason for that is forward-compatibility: We want that module that
479 * compiled with a new redismodule.h to be able to work with a old server,
480 * unless the author explicitly decided to use the newer event type.
481 */
482static const RedisModuleEvent
483 RedisModuleEvent_ReplicationRoleChanged = {
484 REDISMODULE_EVENT_REPLICATION_ROLE_CHANGED,
485 1
486 },
487 RedisModuleEvent_Persistence = {
488 REDISMODULE_EVENT_PERSISTENCE,
489 1
490 },
491 RedisModuleEvent_FlushDB = {
492 REDISMODULE_EVENT_FLUSHDB,
493 1
494 },
495 RedisModuleEvent_Loading = {
496 REDISMODULE_EVENT_LOADING,
497 1
498 },
499 RedisModuleEvent_ClientChange = {
500 REDISMODULE_EVENT_CLIENT_CHANGE,
501 1
502 },
503 RedisModuleEvent_Shutdown = {
504 REDISMODULE_EVENT_SHUTDOWN,
505 1
506 },
507 RedisModuleEvent_ReplicaChange = {
508 REDISMODULE_EVENT_REPLICA_CHANGE,
509 1
510 },
511 RedisModuleEvent_CronLoop = {
512 REDISMODULE_EVENT_CRON_LOOP,
513 1
514 },
515 RedisModuleEvent_MasterLinkChange = {
516 REDISMODULE_EVENT_MASTER_LINK_CHANGE,
517 1
518 },
519 RedisModuleEvent_ModuleChange = {
520 REDISMODULE_EVENT_MODULE_CHANGE,
521 1
522 },
523 RedisModuleEvent_LoadingProgress = {
524 REDISMODULE_EVENT_LOADING_PROGRESS,
525 1
526 },
527 RedisModuleEvent_SwapDB = {
528 REDISMODULE_EVENT_SWAPDB,
529 1
530 },
531 /* Deprecated since Redis 7.0, not used anymore. */
532 __attribute__ ((deprecated))
533 RedisModuleEvent_ReplBackup = {
534 REDISMODULE_EVENT_REPL_BACKUP,
535 1
536 },
537 RedisModuleEvent_ReplAsyncLoad = {
538 REDISMODULE_EVENT_REPL_ASYNC_LOAD,
539 1
540 },
541 RedisModuleEvent_ForkChild = {
542 REDISMODULE_EVENT_FORK_CHILD,
543 1
544 },
545 RedisModuleEvent_EventLoop = {
546 REDISMODULE_EVENT_EVENTLOOP,
547 1
548 },
549 RedisModuleEvent_Config = {
550 REDISMODULE_EVENT_CONFIG,
551 1
552 };
553
554/* Those are values that are used for the 'subevent' callback argument. */
555#define REDISMODULE_SUBEVENT_PERSISTENCE_RDB_START 0
556#define REDISMODULE_SUBEVENT_PERSISTENCE_AOF_START 1
557#define REDISMODULE_SUBEVENT_PERSISTENCE_SYNC_RDB_START 2
558#define REDISMODULE_SUBEVENT_PERSISTENCE_ENDED 3
559#define REDISMODULE_SUBEVENT_PERSISTENCE_FAILED 4
560#define REDISMODULE_SUBEVENT_PERSISTENCE_SYNC_AOF_START 5
561#define _REDISMODULE_SUBEVENT_PERSISTENCE_NEXT 6
562
563#define REDISMODULE_SUBEVENT_LOADING_RDB_START 0
564#define REDISMODULE_SUBEVENT_LOADING_AOF_START 1
565#define REDISMODULE_SUBEVENT_LOADING_REPL_START 2
566#define REDISMODULE_SUBEVENT_LOADING_ENDED 3
567#define REDISMODULE_SUBEVENT_LOADING_FAILED 4
568#define _REDISMODULE_SUBEVENT_LOADING_NEXT 5
569
570#define REDISMODULE_SUBEVENT_CLIENT_CHANGE_CONNECTED 0
571#define REDISMODULE_SUBEVENT_CLIENT_CHANGE_DISCONNECTED 1
572#define _REDISMODULE_SUBEVENT_CLIENT_CHANGE_NEXT 2
573
574#define REDISMODULE_SUBEVENT_MASTER_LINK_UP 0
575#define REDISMODULE_SUBEVENT_MASTER_LINK_DOWN 1
576#define _REDISMODULE_SUBEVENT_MASTER_NEXT 2
577
578#define REDISMODULE_SUBEVENT_REPLICA_CHANGE_ONLINE 0
579#define REDISMODULE_SUBEVENT_REPLICA_CHANGE_OFFLINE 1
580#define _REDISMODULE_SUBEVENT_REPLICA_CHANGE_NEXT 2
581
582#define REDISMODULE_EVENT_REPLROLECHANGED_NOW_MASTER 0
583#define REDISMODULE_EVENT_REPLROLECHANGED_NOW_REPLICA 1
584#define _REDISMODULE_EVENT_REPLROLECHANGED_NEXT 2
585
586#define REDISMODULE_SUBEVENT_FLUSHDB_START 0
587#define REDISMODULE_SUBEVENT_FLUSHDB_END 1
588#define _REDISMODULE_SUBEVENT_FLUSHDB_NEXT 2
589
590#define REDISMODULE_SUBEVENT_MODULE_LOADED 0
591#define REDISMODULE_SUBEVENT_MODULE_UNLOADED 1
592#define _REDISMODULE_SUBEVENT_MODULE_NEXT 2
593
594#define REDISMODULE_SUBEVENT_CONFIG_CHANGE 0
595#define _REDISMODULE_SUBEVENT_CONFIG_NEXT 1
596
597#define REDISMODULE_SUBEVENT_LOADING_PROGRESS_RDB 0
598#define REDISMODULE_SUBEVENT_LOADING_PROGRESS_AOF 1
599#define _REDISMODULE_SUBEVENT_LOADING_PROGRESS_NEXT 2
600
601/* Replication Backup events are deprecated since Redis 7.0 and are never fired. */
602#define REDISMODULE_SUBEVENT_REPL_BACKUP_CREATE 0
603#define REDISMODULE_SUBEVENT_REPL_BACKUP_RESTORE 1
604#define REDISMODULE_SUBEVENT_REPL_BACKUP_DISCARD 2
605#define _REDISMODULE_SUBEVENT_REPL_BACKUP_NEXT 3
606
607#define REDISMODULE_SUBEVENT_REPL_ASYNC_LOAD_STARTED 0
608#define REDISMODULE_SUBEVENT_REPL_ASYNC_LOAD_ABORTED 1
609#define REDISMODULE_SUBEVENT_REPL_ASYNC_LOAD_COMPLETED 2
610#define _REDISMODULE_SUBEVENT_REPL_ASYNC_LOAD_NEXT 3
611
612#define REDISMODULE_SUBEVENT_FORK_CHILD_BORN 0
613#define REDISMODULE_SUBEVENT_FORK_CHILD_DIED 1
614#define _REDISMODULE_SUBEVENT_FORK_CHILD_NEXT 2
615
616#define REDISMODULE_SUBEVENT_EVENTLOOP_BEFORE_SLEEP 0
617#define REDISMODULE_SUBEVENT_EVENTLOOP_AFTER_SLEEP 1
618#define _REDISMODULE_SUBEVENT_EVENTLOOP_NEXT 2
619
620#define _REDISMODULE_SUBEVENT_SHUTDOWN_NEXT 0
621#define _REDISMODULE_SUBEVENT_CRON_LOOP_NEXT 0
622#define _REDISMODULE_SUBEVENT_SWAPDB_NEXT 0
623
624/* RedisModuleClientInfo flags. */
625#define REDISMODULE_CLIENTINFO_FLAG_SSL (1<<0)
626#define REDISMODULE_CLIENTINFO_FLAG_PUBSUB (1<<1)
627#define REDISMODULE_CLIENTINFO_FLAG_BLOCKED (1<<2)
628#define REDISMODULE_CLIENTINFO_FLAG_TRACKING (1<<3)
629#define REDISMODULE_CLIENTINFO_FLAG_UNIXSOCKET (1<<4)
630#define REDISMODULE_CLIENTINFO_FLAG_MULTI (1<<5)
631
632/* Here we take all the structures that the module pass to the core
633 * and the other way around. Notably the list here contains the structures
634 * used by the hooks API RedisModule_RegisterToServerEvent().
635 *
636 * The structures always start with a 'version' field. This is useful
637 * when we want to pass a reference to the structure to the core APIs,
638 * for the APIs to fill the structure. In that case, the structure 'version'
639 * field is initialized before passing it to the core, so that the core is
640 * able to cast the pointer to the appropriate structure version. In this
641 * way we obtain ABI compatibility.
642 *
643 * Here we'll list all the structure versions in case they evolve over time,
644 * however using a define, we'll make sure to use the last version as the
645 * public name for the module to use. */
646
647#define REDISMODULE_CLIENTINFO_VERSION 1
648typedef struct RedisModuleClientInfo {
649 uint64_t version; /* Version of this structure for ABI compat. */
650 uint64_t flags; /* REDISMODULE_CLIENTINFO_FLAG_* */
651 uint64_t id; /* Client ID. */
652 char addr[46]; /* IPv4 or IPv6 address. */
653 uint16_t port; /* TCP port. */
654 uint16_t db; /* Selected DB. */
655} RedisModuleClientInfoV1;
656
657#define RedisModuleClientInfo RedisModuleClientInfoV1
658
659#define REDISMODULE_CLIENTINFO_INITIALIZER_V1 { .version = 1 }
660
661#define REDISMODULE_REPLICATIONINFO_VERSION 1
662typedef struct RedisModuleReplicationInfo {
663 uint64_t version; /* Not used since this structure is never passed
664 from the module to the core right now. Here
665 for future compatibility. */
666 int master; /* true if master, false if replica */
667 char *masterhost; /* master instance hostname for NOW_REPLICA */
668 int masterport; /* master instance port for NOW_REPLICA */
669 char *replid1; /* Main replication ID */
670 char *replid2; /* Secondary replication ID */
671 uint64_t repl1_offset; /* Main replication offset */
672 uint64_t repl2_offset; /* Offset of replid2 validity */
673} RedisModuleReplicationInfoV1;
674
675#define RedisModuleReplicationInfo RedisModuleReplicationInfoV1
676
677#define REDISMODULE_FLUSHINFO_VERSION 1
678typedef struct RedisModuleFlushInfo {
679 uint64_t version; /* Not used since this structure is never passed
680 from the module to the core right now. Here
681 for future compatibility. */
682 int32_t sync; /* Synchronous or threaded flush?. */
683 int32_t dbnum; /* Flushed database number, -1 for ALL. */
684} RedisModuleFlushInfoV1;
685
686#define RedisModuleFlushInfo RedisModuleFlushInfoV1
687
688#define REDISMODULE_MODULE_CHANGE_VERSION 1
689typedef struct RedisModuleModuleChange {
690 uint64_t version; /* Not used since this structure is never passed
691 from the module to the core right now. Here
692 for future compatibility. */
693 const char* module_name;/* Name of module loaded or unloaded. */
694 int32_t module_version; /* Module version. */
695} RedisModuleModuleChangeV1;
696
697#define RedisModuleModuleChange RedisModuleModuleChangeV1
698
699#define REDISMODULE_CONFIGCHANGE_VERSION 1
700typedef struct RedisModuleConfigChange {
701 uint64_t version; /* Not used since this structure is never passed
702 from the module to the core right now. Here
703 for future compatibility. */
704 uint32_t num_changes; /* how many redis config options were changed */
705 const char **config_names; /* the config names that were changed */
706} RedisModuleConfigChangeV1;
707
708#define RedisModuleConfigChange RedisModuleConfigChangeV1
709
710#define REDISMODULE_CRON_LOOP_VERSION 1
711typedef struct RedisModuleCronLoopInfo {
712 uint64_t version; /* Not used since this structure is never passed
713 from the module to the core right now. Here
714 for future compatibility. */
715 int32_t hz; /* Approximate number of events per second. */
716} RedisModuleCronLoopV1;
717
718#define RedisModuleCronLoop RedisModuleCronLoopV1
719
720#define REDISMODULE_LOADING_PROGRESS_VERSION 1
721typedef struct RedisModuleLoadingProgressInfo {
722 uint64_t version; /* Not used since this structure is never passed
723 from the module to the core right now. Here
724 for future compatibility. */
725 int32_t hz; /* Approximate number of events per second. */
726 int32_t progress; /* Approximate progress between 0 and 1024, or -1
727 * if unknown. */
728} RedisModuleLoadingProgressV1;
729
730#define RedisModuleLoadingProgress RedisModuleLoadingProgressV1
731
732#define REDISMODULE_SWAPDBINFO_VERSION 1
733typedef struct RedisModuleSwapDbInfo {
734 uint64_t version; /* Not used since this structure is never passed
735 from the module to the core right now. Here
736 for future compatibility. */
737 int32_t dbnum_first; /* Swap Db first dbnum */
738 int32_t dbnum_second; /* Swap Db second dbnum */
739} RedisModuleSwapDbInfoV1;
740
741#define RedisModuleSwapDbInfo RedisModuleSwapDbInfoV1
742
743typedef enum {
744 REDISMODULE_ACL_LOG_AUTH = 0, /* Authentication failure */
745 REDISMODULE_ACL_LOG_CMD, /* Command authorization failure */
746 REDISMODULE_ACL_LOG_KEY, /* Key authorization failure */
747 REDISMODULE_ACL_LOG_CHANNEL /* Channel authorization failure */
748} RedisModuleACLLogEntryReason;
749
750/* ------------------------- End of common defines ------------------------ */
751
752#ifndef REDISMODULE_CORE
753
754typedef long long mstime_t;
755
756/* Macro definitions specific to individual compilers */
757#ifndef REDISMODULE_ATTR_UNUSED
758# ifdef __GNUC__
759# define REDISMODULE_ATTR_UNUSED __attribute__((unused))
760# else
761# define REDISMODULE_ATTR_UNUSED
762# endif
763#endif
764
765#ifndef REDISMODULE_ATTR_PRINTF
766# ifdef __GNUC__
767# define REDISMODULE_ATTR_PRINTF(idx,cnt) __attribute__((format(printf,idx,cnt)))
768# else
769# define REDISMODULE_ATTR_PRINTF(idx,cnt)
770# endif
771#endif
772
773#ifndef REDISMODULE_ATTR_COMMON
774# if defined(__GNUC__) && !(defined(__clang__) && defined(__cplusplus))
775# define REDISMODULE_ATTR_COMMON __attribute__((__common__))
776# else
777# define REDISMODULE_ATTR_COMMON
778# endif
779#endif
780
781/* Incomplete structures for compiler checks but opaque access. */
782typedef struct RedisModuleCtx RedisModuleCtx;
783typedef struct RedisModuleCommand RedisModuleCommand;
784typedef struct RedisModuleKey RedisModuleKey;
785typedef struct RedisModuleString RedisModuleString;
786typedef struct RedisModuleCallReply RedisModuleCallReply;
787typedef struct RedisModuleIO RedisModuleIO;
788typedef struct RedisModuleType RedisModuleType;
789typedef struct RedisModuleDigest RedisModuleDigest;
790typedef struct RedisModuleBlockedClient RedisModuleBlockedClient;
791typedef struct RedisModuleClusterInfo RedisModuleClusterInfo;
792typedef struct RedisModuleDict RedisModuleDict;
793typedef struct RedisModuleDictIter RedisModuleDictIter;
794typedef struct RedisModuleCommandFilterCtx RedisModuleCommandFilterCtx;
795typedef struct RedisModuleCommandFilter RedisModuleCommandFilter;
796typedef struct RedisModuleInfoCtx RedisModuleInfoCtx;
797typedef struct RedisModuleServerInfoData RedisModuleServerInfoData;
798typedef struct RedisModuleScanCursor RedisModuleScanCursor;
799typedef struct RedisModuleDefragCtx RedisModuleDefragCtx;
800typedef struct RedisModuleUser RedisModuleUser;
801typedef struct RedisModuleKeyOptCtx RedisModuleKeyOptCtx;
802
803typedef int (*RedisModuleCmdFunc)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
804typedef void (*RedisModuleDisconnectFunc)(RedisModuleCtx *ctx, RedisModuleBlockedClient *bc);
805typedef int (*RedisModuleNotificationFunc)(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key);
806typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver);
807typedef void (*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value);
808typedef int (*RedisModuleTypeAuxLoadFunc)(RedisModuleIO *rdb, int encver, int when);
809typedef void (*RedisModuleTypeAuxSaveFunc)(RedisModuleIO *rdb, int when);
810typedef void (*RedisModuleTypeRewriteFunc)(RedisModuleIO *aof, RedisModuleString *key, void *value);
811typedef size_t (*RedisModuleTypeMemUsageFunc)(const void *value);
812typedef size_t (*RedisModuleTypeMemUsageFunc2)(RedisModuleKeyOptCtx *ctx, const void *value, size_t sample_size);
813typedef void (*RedisModuleTypeDigestFunc)(RedisModuleDigest *digest, void *value);
814typedef void (*RedisModuleTypeFreeFunc)(void *value);
815typedef size_t (*RedisModuleTypeFreeEffortFunc)(RedisModuleString *key, const void *value);
816typedef size_t (*RedisModuleTypeFreeEffortFunc2)(RedisModuleKeyOptCtx *ctx, const void *value);
817typedef void (*RedisModuleTypeUnlinkFunc)(RedisModuleString *key, const void *value);
818typedef void (*RedisModuleTypeUnlinkFunc2)(RedisModuleKeyOptCtx *ctx, const void *value);
819typedef void *(*RedisModuleTypeCopyFunc)(RedisModuleString *fromkey, RedisModuleString *tokey, const void *value);
820typedef void *(*RedisModuleTypeCopyFunc2)(RedisModuleKeyOptCtx *ctx, const void *value);
821typedef int (*RedisModuleTypeDefragFunc)(RedisModuleDefragCtx *ctx, RedisModuleString *key, void **value);
822typedef void (*RedisModuleClusterMessageReceiver)(RedisModuleCtx *ctx, const char *sender_id, uint8_t type, const unsigned char *payload, uint32_t len);
823typedef void (*RedisModuleTimerProc)(RedisModuleCtx *ctx, void *data);
824typedef void (*RedisModuleCommandFilterFunc) (RedisModuleCommandFilterCtx *filter);
825typedef void (*RedisModuleForkDoneHandler) (int exitcode, int bysignal, void *user_data);
826typedef void (*RedisModuleInfoFunc)(RedisModuleInfoCtx *ctx, int for_crash_report);
827typedef void (*RedisModuleScanCB)(RedisModuleCtx *ctx, RedisModuleString *keyname, RedisModuleKey *key, void *privdata);
828typedef void (*RedisModuleScanKeyCB)(RedisModuleKey *key, RedisModuleString *field, RedisModuleString *value, void *privdata);
829typedef void (*RedisModuleUserChangedFunc) (uint64_t client_id, void *privdata);
830typedef int (*RedisModuleDefragFunc)(RedisModuleDefragCtx *ctx);
831typedef RedisModuleString * (*RedisModuleConfigGetStringFunc)(const char *name, void *privdata);
832typedef long long (*RedisModuleConfigGetNumericFunc)(const char *name, void *privdata);
833typedef int (*RedisModuleConfigGetBoolFunc)(const char *name, void *privdata);
834typedef int (*RedisModuleConfigGetEnumFunc)(const char *name, void *privdata);
835typedef int (*RedisModuleConfigSetStringFunc)(const char *name, RedisModuleString *val, void *privdata, RedisModuleString **err);
836typedef int (*RedisModuleConfigSetNumericFunc)(const char *name, long long val, void *privdata, RedisModuleString **err);
837typedef int (*RedisModuleConfigSetBoolFunc)(const char *name, int val, void *privdata, RedisModuleString **err);
838typedef int (*RedisModuleConfigSetEnumFunc)(const char *name, int val, void *privdata, RedisModuleString **err);
839typedef int (*RedisModuleConfigApplyFunc)(RedisModuleCtx *ctx, void *privdata, RedisModuleString **err);
840
841typedef struct RedisModuleTypeMethods {
842 uint64_t version;
843 RedisModuleTypeLoadFunc rdb_load;
844 RedisModuleTypeSaveFunc rdb_save;
845 RedisModuleTypeRewriteFunc aof_rewrite;
846 RedisModuleTypeMemUsageFunc mem_usage;
847 RedisModuleTypeDigestFunc digest;
848 RedisModuleTypeFreeFunc free;
849 RedisModuleTypeAuxLoadFunc aux_load;
850 RedisModuleTypeAuxSaveFunc aux_save;
851 int aux_save_triggers;
852 RedisModuleTypeFreeEffortFunc free_effort;
853 RedisModuleTypeUnlinkFunc unlink;
854 RedisModuleTypeCopyFunc copy;
855 RedisModuleTypeDefragFunc defrag;
856 RedisModuleTypeMemUsageFunc2 mem_usage2;
857 RedisModuleTypeFreeEffortFunc2 free_effort2;
858 RedisModuleTypeUnlinkFunc2 unlink2;
859 RedisModuleTypeCopyFunc2 copy2;
860} RedisModuleTypeMethods;
861
862#define REDISMODULE_GET_API(name) \
863 RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))
864
865/* Default API declaration prefix (not 'extern' for backwards compatibility) */
866#ifndef REDISMODULE_API
867#define REDISMODULE_API
868#endif
869
870/* Default API declaration suffix (compiler attributes) */
871#ifndef REDISMODULE_ATTR
872#define REDISMODULE_ATTR REDISMODULE_ATTR_COMMON
873#endif
874
875REDISMODULE_API void * (*RedisModule_Alloc)(size_t bytes) REDISMODULE_ATTR;
876REDISMODULE_API void * (*RedisModule_TryAlloc)(size_t bytes) REDISMODULE_ATTR;
877REDISMODULE_API void * (*RedisModule_Realloc)(void *ptr, size_t bytes) REDISMODULE_ATTR;
878REDISMODULE_API void (*RedisModule_Free)(void *ptr) REDISMODULE_ATTR;
879REDISMODULE_API void * (*RedisModule_Calloc)(size_t nmemb, size_t size) REDISMODULE_ATTR;
880REDISMODULE_API char * (*RedisModule_Strdup)(const char *str) REDISMODULE_ATTR;
881REDISMODULE_API int (*RedisModule_GetApi)(const char *, void *) REDISMODULE_ATTR;
882REDISMODULE_API int (*RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep) REDISMODULE_ATTR;
883REDISMODULE_API RedisModuleCommand *(*RedisModule_GetCommand)(RedisModuleCtx *ctx, const char *name) REDISMODULE_ATTR;
884REDISMODULE_API int (*RedisModule_CreateSubcommand)(RedisModuleCommand *parent, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep) REDISMODULE_ATTR;
885REDISMODULE_API int (*RedisModule_SetCommandInfo)(RedisModuleCommand *command, const RedisModuleCommandInfo *info) REDISMODULE_ATTR;
886REDISMODULE_API void (*RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name, int ver, int apiver) REDISMODULE_ATTR;
887REDISMODULE_API int (*RedisModule_IsModuleNameBusy)(const char *name) REDISMODULE_ATTR;
888REDISMODULE_API int (*RedisModule_WrongArity)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
889REDISMODULE_API int (*RedisModule_ReplyWithLongLong)(RedisModuleCtx *ctx, long long ll) REDISMODULE_ATTR;
890REDISMODULE_API int (*RedisModule_GetSelectedDb)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
891REDISMODULE_API int (*RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid) REDISMODULE_ATTR;
892REDISMODULE_API int (*RedisModule_KeyExists)(RedisModuleCtx *ctx, RedisModuleString *keyname) REDISMODULE_ATTR;
893REDISMODULE_API RedisModuleKey * (*RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode) REDISMODULE_ATTR;
894REDISMODULE_API void (*RedisModule_CloseKey)(RedisModuleKey *kp) REDISMODULE_ATTR;
895REDISMODULE_API int (*RedisModule_KeyType)(RedisModuleKey *kp) REDISMODULE_ATTR;
896REDISMODULE_API size_t (*RedisModule_ValueLength)(RedisModuleKey *kp) REDISMODULE_ATTR;
897REDISMODULE_API int (*RedisModule_ListPush)(RedisModuleKey *kp, int where, RedisModuleString *ele) REDISMODULE_ATTR;
898REDISMODULE_API RedisModuleString * (*RedisModule_ListPop)(RedisModuleKey *key, int where) REDISMODULE_ATTR;
899REDISMODULE_API RedisModuleString * (*RedisModule_ListGet)(RedisModuleKey *key, long index) REDISMODULE_ATTR;
900REDISMODULE_API int (*RedisModule_ListSet)(RedisModuleKey *key, long index, RedisModuleString *value) REDISMODULE_ATTR;
901REDISMODULE_API int (*RedisModule_ListInsert)(RedisModuleKey *key, long index, RedisModuleString *value) REDISMODULE_ATTR;
902REDISMODULE_API int (*RedisModule_ListDelete)(RedisModuleKey *key, long index) REDISMODULE_ATTR;
903REDISMODULE_API RedisModuleCallReply * (*RedisModule_Call)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...) REDISMODULE_ATTR;
904REDISMODULE_API const char * (*RedisModule_CallReplyProto)(RedisModuleCallReply *reply, size_t *len) REDISMODULE_ATTR;
905REDISMODULE_API void (*RedisModule_FreeCallReply)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
906REDISMODULE_API int (*RedisModule_CallReplyType)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
907REDISMODULE_API long long (*RedisModule_CallReplyInteger)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
908REDISMODULE_API double (*RedisModule_CallReplyDouble)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
909REDISMODULE_API int (*RedisModule_CallReplyBool)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
910REDISMODULE_API const char* (*RedisModule_CallReplyBigNumber)(RedisModuleCallReply *reply, size_t *len) REDISMODULE_ATTR;
911REDISMODULE_API const char* (*RedisModule_CallReplyVerbatim)(RedisModuleCallReply *reply, size_t *len, const char **format) REDISMODULE_ATTR;
912REDISMODULE_API RedisModuleCallReply * (*RedisModule_CallReplySetElement)(RedisModuleCallReply *reply, size_t idx) REDISMODULE_ATTR;
913REDISMODULE_API int (*RedisModule_CallReplyMapElement)(RedisModuleCallReply *reply, size_t idx, RedisModuleCallReply **key, RedisModuleCallReply **val) REDISMODULE_ATTR;
914REDISMODULE_API int (*RedisModule_CallReplyAttributeElement)(RedisModuleCallReply *reply, size_t idx, RedisModuleCallReply **key, RedisModuleCallReply **val) REDISMODULE_ATTR;
915REDISMODULE_API RedisModuleCallReply * (*RedisModule_CallReplyAttribute)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
916REDISMODULE_API size_t (*RedisModule_CallReplyLength)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
917REDISMODULE_API RedisModuleCallReply * (*RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx) REDISMODULE_ATTR;
918REDISMODULE_API RedisModuleString * (*RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len) REDISMODULE_ATTR;
919REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, long long ll) REDISMODULE_ATTR;
920REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromULongLong)(RedisModuleCtx *ctx, unsigned long long ull) REDISMODULE_ATTR;
921REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromDouble)(RedisModuleCtx *ctx, double d) REDISMODULE_ATTR;
922REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromLongDouble)(RedisModuleCtx *ctx, long double ld, int humanfriendly) REDISMODULE_ATTR;
923REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str) REDISMODULE_ATTR;
924REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromStreamID)(RedisModuleCtx *ctx, const RedisModuleStreamID *id) REDISMODULE_ATTR;
925REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...) REDISMODULE_ATTR_PRINTF(2,3) REDISMODULE_ATTR;
926REDISMODULE_API void (*RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
927REDISMODULE_API const char * (*RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len) REDISMODULE_ATTR;
928REDISMODULE_API int (*RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err) REDISMODULE_ATTR;
929REDISMODULE_API int (*RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg) REDISMODULE_ATTR;
930REDISMODULE_API int (*RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
931REDISMODULE_API int (*RedisModule_ReplyWithMap)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
932REDISMODULE_API int (*RedisModule_ReplyWithSet)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
933REDISMODULE_API int (*RedisModule_ReplyWithAttribute)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
934REDISMODULE_API int (*RedisModule_ReplyWithNullArray)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
935REDISMODULE_API int (*RedisModule_ReplyWithEmptyArray)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
936REDISMODULE_API void (*RedisModule_ReplySetArrayLength)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
937REDISMODULE_API void (*RedisModule_ReplySetMapLength)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
938REDISMODULE_API void (*RedisModule_ReplySetSetLength)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
939REDISMODULE_API void (*RedisModule_ReplySetAttributeLength)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
940REDISMODULE_API void (*RedisModule_ReplySetPushLength)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
941REDISMODULE_API int (*RedisModule_ReplyWithStringBuffer)(RedisModuleCtx *ctx, const char *buf, size_t len) REDISMODULE_ATTR;
942REDISMODULE_API int (*RedisModule_ReplyWithCString)(RedisModuleCtx *ctx, const char *buf) REDISMODULE_ATTR;
943REDISMODULE_API int (*RedisModule_ReplyWithString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
944REDISMODULE_API int (*RedisModule_ReplyWithEmptyString)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
945REDISMODULE_API int (*RedisModule_ReplyWithVerbatimString)(RedisModuleCtx *ctx, const char *buf, size_t len) REDISMODULE_ATTR;
946REDISMODULE_API int (*RedisModule_ReplyWithVerbatimStringType)(RedisModuleCtx *ctx, const char *buf, size_t len, const char *ext) REDISMODULE_ATTR;
947REDISMODULE_API int (*RedisModule_ReplyWithNull)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
948REDISMODULE_API int (*RedisModule_ReplyWithBool)(RedisModuleCtx *ctx, int b) REDISMODULE_ATTR;
949REDISMODULE_API int (*RedisModule_ReplyWithLongDouble)(RedisModuleCtx *ctx, long double d) REDISMODULE_ATTR;
950REDISMODULE_API int (*RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, double d) REDISMODULE_ATTR;
951REDISMODULE_API int (*RedisModule_ReplyWithBigNumber)(RedisModuleCtx *ctx, const char *bignum, size_t len) REDISMODULE_ATTR;
952REDISMODULE_API int (*RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx, RedisModuleCallReply *reply) REDISMODULE_ATTR;
953REDISMODULE_API int (*RedisModule_StringToLongLong)(const RedisModuleString *str, long long *ll) REDISMODULE_ATTR;
954REDISMODULE_API int (*RedisModule_StringToULongLong)(const RedisModuleString *str, unsigned long long *ull) REDISMODULE_ATTR;
955REDISMODULE_API int (*RedisModule_StringToDouble)(const RedisModuleString *str, double *d) REDISMODULE_ATTR;
956REDISMODULE_API int (*RedisModule_StringToLongDouble)(const RedisModuleString *str, long double *d) REDISMODULE_ATTR;
957REDISMODULE_API int (*RedisModule_StringToStreamID)(const RedisModuleString *str, RedisModuleStreamID *id) REDISMODULE_ATTR;
958REDISMODULE_API void (*RedisModule_AutoMemory)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
959REDISMODULE_API int (*RedisModule_Replicate)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...) REDISMODULE_ATTR;
960REDISMODULE_API int (*RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
961REDISMODULE_API const char * (*RedisModule_CallReplyStringPtr)(RedisModuleCallReply *reply, size_t *len) REDISMODULE_ATTR;
962REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromCallReply)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
963REDISMODULE_API int (*RedisModule_DeleteKey)(RedisModuleKey *key) REDISMODULE_ATTR;
964REDISMODULE_API int (*RedisModule_UnlinkKey)(RedisModuleKey *key) REDISMODULE_ATTR;
965REDISMODULE_API int (*RedisModule_StringSet)(RedisModuleKey *key, RedisModuleString *str) REDISMODULE_ATTR;
966REDISMODULE_API char * (*RedisModule_StringDMA)(RedisModuleKey *key, size_t *len, int mode) REDISMODULE_ATTR;
967REDISMODULE_API int (*RedisModule_StringTruncate)(RedisModuleKey *key, size_t newlen) REDISMODULE_ATTR;
968REDISMODULE_API mstime_t (*RedisModule_GetExpire)(RedisModuleKey *key) REDISMODULE_ATTR;
969REDISMODULE_API int (*RedisModule_SetExpire)(RedisModuleKey *key, mstime_t expire) REDISMODULE_ATTR;
970REDISMODULE_API mstime_t (*RedisModule_GetAbsExpire)(RedisModuleKey *key) REDISMODULE_ATTR;
971REDISMODULE_API int (*RedisModule_SetAbsExpire)(RedisModuleKey *key, mstime_t expire) REDISMODULE_ATTR;
972REDISMODULE_API void (*RedisModule_ResetDataset)(int restart_aof, int async) REDISMODULE_ATTR;
973REDISMODULE_API unsigned long long (*RedisModule_DbSize)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
974REDISMODULE_API RedisModuleString * (*RedisModule_RandomKey)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
975REDISMODULE_API int (*RedisModule_ZsetAdd)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr) REDISMODULE_ATTR;
976REDISMODULE_API int (*RedisModule_ZsetIncrby)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr, double *newscore) REDISMODULE_ATTR;
977REDISMODULE_API int (*RedisModule_ZsetScore)(RedisModuleKey *key, RedisModuleString *ele, double *score) REDISMODULE_ATTR;
978REDISMODULE_API int (*RedisModule_ZsetRem)(RedisModuleKey *key, RedisModuleString *ele, int *deleted) REDISMODULE_ATTR;
979REDISMODULE_API void (*RedisModule_ZsetRangeStop)(RedisModuleKey *key) REDISMODULE_ATTR;
980REDISMODULE_API int (*RedisModule_ZsetFirstInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex) REDISMODULE_ATTR;
981REDISMODULE_API int (*RedisModule_ZsetLastInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex) REDISMODULE_ATTR;
982REDISMODULE_API int (*RedisModule_ZsetFirstInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max) REDISMODULE_ATTR;
983REDISMODULE_API int (*RedisModule_ZsetLastInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max) REDISMODULE_ATTR;
984REDISMODULE_API RedisModuleString * (*RedisModule_ZsetRangeCurrentElement)(RedisModuleKey *key, double *score) REDISMODULE_ATTR;
985REDISMODULE_API int (*RedisModule_ZsetRangeNext)(RedisModuleKey *key) REDISMODULE_ATTR;
986REDISMODULE_API int (*RedisModule_ZsetRangePrev)(RedisModuleKey *key) REDISMODULE_ATTR;
987REDISMODULE_API int (*RedisModule_ZsetRangeEndReached)(RedisModuleKey *key) REDISMODULE_ATTR;
988REDISMODULE_API int (*RedisModule_HashSet)(RedisModuleKey *key, int flags, ...) REDISMODULE_ATTR;
989REDISMODULE_API int (*RedisModule_HashGet)(RedisModuleKey *key, int flags, ...) REDISMODULE_ATTR;
990REDISMODULE_API int (*RedisModule_StreamAdd)(RedisModuleKey *key, int flags, RedisModuleStreamID *id, RedisModuleString **argv, int64_t numfields) REDISMODULE_ATTR;
991REDISMODULE_API int (*RedisModule_StreamDelete)(RedisModuleKey *key, RedisModuleStreamID *id) REDISMODULE_ATTR;
992REDISMODULE_API int (*RedisModule_StreamIteratorStart)(RedisModuleKey *key, int flags, RedisModuleStreamID *startid, RedisModuleStreamID *endid) REDISMODULE_ATTR;
993REDISMODULE_API int (*RedisModule_StreamIteratorStop)(RedisModuleKey *key) REDISMODULE_ATTR;
994REDISMODULE_API int (*RedisModule_StreamIteratorNextID)(RedisModuleKey *key, RedisModuleStreamID *id, long *numfields) REDISMODULE_ATTR;
995REDISMODULE_API int (*RedisModule_StreamIteratorNextField)(RedisModuleKey *key, RedisModuleString **field_ptr, RedisModuleString **value_ptr) REDISMODULE_ATTR;
996REDISMODULE_API int (*RedisModule_StreamIteratorDelete)(RedisModuleKey *key) REDISMODULE_ATTR;
997REDISMODULE_API long long (*RedisModule_StreamTrimByLength)(RedisModuleKey *key, int flags, long long length) REDISMODULE_ATTR;
998REDISMODULE_API long long (*RedisModule_StreamTrimByID)(RedisModuleKey *key, int flags, RedisModuleStreamID *id) REDISMODULE_ATTR;
999REDISMODULE_API int (*RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1000REDISMODULE_API void (*RedisModule_KeyAtPos)(RedisModuleCtx *ctx, int pos) REDISMODULE_ATTR;
1001REDISMODULE_API void (*RedisModule_KeyAtPosWithFlags)(RedisModuleCtx *ctx, int pos, int flags) REDISMODULE_ATTR;
1002REDISMODULE_API int (*RedisModule_IsChannelsPositionRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1003REDISMODULE_API void (*RedisModule_ChannelAtPosWithFlags)(RedisModuleCtx *ctx, int pos, int flags) REDISMODULE_ATTR;
1004REDISMODULE_API unsigned long long (*RedisModule_GetClientId)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1005REDISMODULE_API RedisModuleString * (*RedisModule_GetClientUserNameById)(RedisModuleCtx *ctx, uint64_t id) REDISMODULE_ATTR;
1006REDISMODULE_API int (*RedisModule_GetClientInfoById)(void *ci, uint64_t id) REDISMODULE_ATTR;
1007REDISMODULE_API RedisModuleString * (*RedisModule_GetClientNameById)(RedisModuleCtx *ctx, uint64_t id) REDISMODULE_ATTR;
1008REDISMODULE_API int (*RedisModule_SetClientNameById)(uint64_t id, RedisModuleString *name) REDISMODULE_ATTR;
1009REDISMODULE_API int (*RedisModule_PublishMessage)(RedisModuleCtx *ctx, RedisModuleString *channel, RedisModuleString *message) REDISMODULE_ATTR;
1010REDISMODULE_API int (*RedisModule_PublishMessageShard)(RedisModuleCtx *ctx, RedisModuleString *channel, RedisModuleString *message) REDISMODULE_ATTR;
1011REDISMODULE_API int (*RedisModule_GetContextFlags)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1012REDISMODULE_API int (*RedisModule_AvoidReplicaTraffic)() REDISMODULE_ATTR;
1013REDISMODULE_API void * (*RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes) REDISMODULE_ATTR;
1014REDISMODULE_API RedisModuleType * (*RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods) REDISMODULE_ATTR;
1015REDISMODULE_API int (*RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value) REDISMODULE_ATTR;
1016REDISMODULE_API int (*RedisModule_ModuleTypeReplaceValue)(RedisModuleKey *key, RedisModuleType *mt, void *new_value, void **old_value) REDISMODULE_ATTR;
1017REDISMODULE_API RedisModuleType * (*RedisModule_ModuleTypeGetType)(RedisModuleKey *key) REDISMODULE_ATTR;
1018REDISMODULE_API void * (*RedisModule_ModuleTypeGetValue)(RedisModuleKey *key) REDISMODULE_ATTR;
1019REDISMODULE_API int (*RedisModule_IsIOError)(RedisModuleIO *io) REDISMODULE_ATTR;
1020REDISMODULE_API void (*RedisModule_SetModuleOptions)(RedisModuleCtx *ctx, int options) REDISMODULE_ATTR;
1021REDISMODULE_API int (*RedisModule_SignalModifiedKey)(RedisModuleCtx *ctx, RedisModuleString *keyname) REDISMODULE_ATTR;
1022REDISMODULE_API void (*RedisModule_SaveUnsigned)(RedisModuleIO *io, uint64_t value) REDISMODULE_ATTR;
1023REDISMODULE_API uint64_t (*RedisModule_LoadUnsigned)(RedisModuleIO *io) REDISMODULE_ATTR;
1024REDISMODULE_API void (*RedisModule_SaveSigned)(RedisModuleIO *io, int64_t value) REDISMODULE_ATTR;
1025REDISMODULE_API int64_t (*RedisModule_LoadSigned)(RedisModuleIO *io) REDISMODULE_ATTR;
1026REDISMODULE_API void (*RedisModule_EmitAOF)(RedisModuleIO *io, const char *cmdname, const char *fmt, ...) REDISMODULE_ATTR;
1027REDISMODULE_API void (*RedisModule_SaveString)(RedisModuleIO *io, RedisModuleString *s) REDISMODULE_ATTR;
1028REDISMODULE_API void (*RedisModule_SaveStringBuffer)(RedisModuleIO *io, const char *str, size_t len) REDISMODULE_ATTR;
1029REDISMODULE_API RedisModuleString * (*RedisModule_LoadString)(RedisModuleIO *io) REDISMODULE_ATTR;
1030REDISMODULE_API char * (*RedisModule_LoadStringBuffer)(RedisModuleIO *io, size_t *lenptr) REDISMODULE_ATTR;
1031REDISMODULE_API void (*RedisModule_SaveDouble)(RedisModuleIO *io, double value) REDISMODULE_ATTR;
1032REDISMODULE_API double (*RedisModule_LoadDouble)(RedisModuleIO *io) REDISMODULE_ATTR;
1033REDISMODULE_API void (*RedisModule_SaveFloat)(RedisModuleIO *io, float value) REDISMODULE_ATTR;
1034REDISMODULE_API float (*RedisModule_LoadFloat)(RedisModuleIO *io) REDISMODULE_ATTR;
1035REDISMODULE_API void (*RedisModule_SaveLongDouble)(RedisModuleIO *io, long double value) REDISMODULE_ATTR;
1036REDISMODULE_API long double (*RedisModule_LoadLongDouble)(RedisModuleIO *io) REDISMODULE_ATTR;
1037REDISMODULE_API void * (*RedisModule_LoadDataTypeFromString)(const RedisModuleString *str, const RedisModuleType *mt) REDISMODULE_ATTR;
1038REDISMODULE_API void * (*RedisModule_LoadDataTypeFromStringEncver)(const RedisModuleString *str, const RedisModuleType *mt, int encver) REDISMODULE_ATTR;
1039REDISMODULE_API RedisModuleString * (*RedisModule_SaveDataTypeToString)(RedisModuleCtx *ctx, void *data, const RedisModuleType *mt) REDISMODULE_ATTR;
1040REDISMODULE_API void (*RedisModule_Log)(RedisModuleCtx *ctx, const char *level, const char *fmt, ...) REDISMODULE_ATTR REDISMODULE_ATTR_PRINTF(3,4);
1041REDISMODULE_API void (*RedisModule_LogIOError)(RedisModuleIO *io, const char *levelstr, const char *fmt, ...) REDISMODULE_ATTR REDISMODULE_ATTR_PRINTF(3,4);
1042REDISMODULE_API void (*RedisModule__Assert)(const char *estr, const char *file, int line) REDISMODULE_ATTR;
1043REDISMODULE_API void (*RedisModule_LatencyAddSample)(const char *event, mstime_t latency) REDISMODULE_ATTR;
1044REDISMODULE_API int (*RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, RedisModuleString *str, const char *buf, size_t len) REDISMODULE_ATTR;
1045REDISMODULE_API void (*RedisModule_TrimStringAllocation)(RedisModuleString *str) REDISMODULE_ATTR;
1046REDISMODULE_API void (*RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
1047REDISMODULE_API RedisModuleString * (*RedisModule_HoldString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
1048REDISMODULE_API int (*RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b) REDISMODULE_ATTR;
1049REDISMODULE_API RedisModuleCtx * (*RedisModule_GetContextFromIO)(RedisModuleIO *io) REDISMODULE_ATTR;
1050REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromIO)(RedisModuleIO *io) REDISMODULE_ATTR;
1051REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromModuleKey)(RedisModuleKey *key) REDISMODULE_ATTR;
1052REDISMODULE_API int (*RedisModule_GetDbIdFromModuleKey)(RedisModuleKey *key) REDISMODULE_ATTR;
1053REDISMODULE_API int (*RedisModule_GetDbIdFromIO)(RedisModuleIO *io) REDISMODULE_ATTR;
1054REDISMODULE_API int (*RedisModule_GetDbIdFromOptCtx)(RedisModuleKeyOptCtx *ctx) REDISMODULE_ATTR;
1055REDISMODULE_API int (*RedisModule_GetToDbIdFromOptCtx)(RedisModuleKeyOptCtx *ctx) REDISMODULE_ATTR;
1056REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromOptCtx)(RedisModuleKeyOptCtx *ctx) REDISMODULE_ATTR;
1057REDISMODULE_API const RedisModuleString * (*RedisModule_GetToKeyNameFromOptCtx)(RedisModuleKeyOptCtx *ctx) REDISMODULE_ATTR;
1058REDISMODULE_API long long (*RedisModule_Milliseconds)(void) REDISMODULE_ATTR;
1059REDISMODULE_API uint64_t (*RedisModule_MonotonicMicroseconds)(void) REDISMODULE_ATTR;
1060REDISMODULE_API void (*RedisModule_DigestAddStringBuffer)(RedisModuleDigest *md, const char *ele, size_t len) REDISMODULE_ATTR;
1061REDISMODULE_API void (*RedisModule_DigestAddLongLong)(RedisModuleDigest *md, long long ele) REDISMODULE_ATTR;
1062REDISMODULE_API void (*RedisModule_DigestEndSequence)(RedisModuleDigest *md) REDISMODULE_ATTR;
1063REDISMODULE_API int (*RedisModule_GetDbIdFromDigest)(RedisModuleDigest *dig) REDISMODULE_ATTR;
1064REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromDigest)(RedisModuleDigest *dig) REDISMODULE_ATTR;
1065REDISMODULE_API RedisModuleDict * (*RedisModule_CreateDict)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1066REDISMODULE_API void (*RedisModule_FreeDict)(RedisModuleCtx *ctx, RedisModuleDict *d) REDISMODULE_ATTR;
1067REDISMODULE_API uint64_t (*RedisModule_DictSize)(RedisModuleDict *d) REDISMODULE_ATTR;
1068REDISMODULE_API int (*RedisModule_DictSetC)(RedisModuleDict *d, void *key, size_t keylen, void *ptr) REDISMODULE_ATTR;
1069REDISMODULE_API int (*RedisModule_DictReplaceC)(RedisModuleDict *d, void *key, size_t keylen, void *ptr) REDISMODULE_ATTR;
1070REDISMODULE_API int (*RedisModule_DictSet)(RedisModuleDict *d, RedisModuleString *key, void *ptr) REDISMODULE_ATTR;
1071REDISMODULE_API int (*RedisModule_DictReplace)(RedisModuleDict *d, RedisModuleString *key, void *ptr) REDISMODULE_ATTR;
1072REDISMODULE_API void * (*RedisModule_DictGetC)(RedisModuleDict *d, void *key, size_t keylen, int *nokey) REDISMODULE_ATTR;
1073REDISMODULE_API void * (*RedisModule_DictGet)(RedisModuleDict *d, RedisModuleString *key, int *nokey) REDISMODULE_ATTR;
1074REDISMODULE_API int (*RedisModule_DictDelC)(RedisModuleDict *d, void *key, size_t keylen, void *oldval) REDISMODULE_ATTR;
1075REDISMODULE_API int (*RedisModule_DictDel)(RedisModuleDict *d, RedisModuleString *key, void *oldval) REDISMODULE_ATTR;
1076REDISMODULE_API RedisModuleDictIter * (*RedisModule_DictIteratorStartC)(RedisModuleDict *d, const char *op, void *key, size_t keylen) REDISMODULE_ATTR;
1077REDISMODULE_API RedisModuleDictIter * (*RedisModule_DictIteratorStart)(RedisModuleDict *d, const char *op, RedisModuleString *key) REDISMODULE_ATTR;
1078REDISMODULE_API void (*RedisModule_DictIteratorStop)(RedisModuleDictIter *di) REDISMODULE_ATTR;
1079REDISMODULE_API int (*RedisModule_DictIteratorReseekC)(RedisModuleDictIter *di, const char *op, void *key, size_t keylen) REDISMODULE_ATTR;
1080REDISMODULE_API int (*RedisModule_DictIteratorReseek)(RedisModuleDictIter *di, const char *op, RedisModuleString *key) REDISMODULE_ATTR;
1081REDISMODULE_API void * (*RedisModule_DictNextC)(RedisModuleDictIter *di, size_t *keylen, void **dataptr) REDISMODULE_ATTR;
1082REDISMODULE_API void * (*RedisModule_DictPrevC)(RedisModuleDictIter *di, size_t *keylen, void **dataptr) REDISMODULE_ATTR;
1083REDISMODULE_API RedisModuleString * (*RedisModule_DictNext)(RedisModuleCtx *ctx, RedisModuleDictIter *di, void **dataptr) REDISMODULE_ATTR;
1084REDISMODULE_API RedisModuleString * (*RedisModule_DictPrev)(RedisModuleCtx *ctx, RedisModuleDictIter *di, void **dataptr) REDISMODULE_ATTR;
1085REDISMODULE_API int (*RedisModule_DictCompareC)(RedisModuleDictIter *di, const char *op, void *key, size_t keylen) REDISMODULE_ATTR;
1086REDISMODULE_API int (*RedisModule_DictCompare)(RedisModuleDictIter *di, const char *op, RedisModuleString *key) REDISMODULE_ATTR;
1087REDISMODULE_API int (*RedisModule_RegisterInfoFunc)(RedisModuleCtx *ctx, RedisModuleInfoFunc cb) REDISMODULE_ATTR;
1088REDISMODULE_API int (*RedisModule_InfoAddSection)(RedisModuleInfoCtx *ctx, const char *name) REDISMODULE_ATTR;
1089REDISMODULE_API int (*RedisModule_InfoBeginDictField)(RedisModuleInfoCtx *ctx, const char *name) REDISMODULE_ATTR;
1090REDISMODULE_API int (*RedisModule_InfoEndDictField)(RedisModuleInfoCtx *ctx) REDISMODULE_ATTR;
1091REDISMODULE_API int (*RedisModule_InfoAddFieldString)(RedisModuleInfoCtx *ctx, const char *field, RedisModuleString *value) REDISMODULE_ATTR;
1092REDISMODULE_API int (*RedisModule_InfoAddFieldCString)(RedisModuleInfoCtx *ctx, const char *field,const char *value) REDISMODULE_ATTR;
1093REDISMODULE_API int (*RedisModule_InfoAddFieldDouble)(RedisModuleInfoCtx *ctx, const char *field, double value) REDISMODULE_ATTR;
1094REDISMODULE_API int (*RedisModule_InfoAddFieldLongLong)(RedisModuleInfoCtx *ctx, const char *field, long long value) REDISMODULE_ATTR;
1095REDISMODULE_API int (*RedisModule_InfoAddFieldULongLong)(RedisModuleInfoCtx *ctx, const char *field, unsigned long long value) REDISMODULE_ATTR;
1096REDISMODULE_API RedisModuleServerInfoData * (*RedisModule_GetServerInfo)(RedisModuleCtx *ctx, const char *section) REDISMODULE_ATTR;
1097REDISMODULE_API void (*RedisModule_FreeServerInfo)(RedisModuleCtx *ctx, RedisModuleServerInfoData *data) REDISMODULE_ATTR;
1098REDISMODULE_API RedisModuleString * (*RedisModule_ServerInfoGetField)(RedisModuleCtx *ctx, RedisModuleServerInfoData *data, const char* field) REDISMODULE_ATTR;
1099REDISMODULE_API const char * (*RedisModule_ServerInfoGetFieldC)(RedisModuleServerInfoData *data, const char* field) REDISMODULE_ATTR;
1100REDISMODULE_API long long (*RedisModule_ServerInfoGetFieldSigned)(RedisModuleServerInfoData *data, const char* field, int *out_err) REDISMODULE_ATTR;
1101REDISMODULE_API unsigned long long (*RedisModule_ServerInfoGetFieldUnsigned)(RedisModuleServerInfoData *data, const char* field, int *out_err) REDISMODULE_ATTR;
1102REDISMODULE_API double (*RedisModule_ServerInfoGetFieldDouble)(RedisModuleServerInfoData *data, const char* field, int *out_err) REDISMODULE_ATTR;
1103REDISMODULE_API int (*RedisModule_SubscribeToServerEvent)(RedisModuleCtx *ctx, RedisModuleEvent event, RedisModuleEventCallback callback) REDISMODULE_ATTR;
1104REDISMODULE_API int (*RedisModule_SetLRU)(RedisModuleKey *key, mstime_t lru_idle) REDISMODULE_ATTR;
1105REDISMODULE_API int (*RedisModule_GetLRU)(RedisModuleKey *key, mstime_t *lru_idle) REDISMODULE_ATTR;
1106REDISMODULE_API int (*RedisModule_SetLFU)(RedisModuleKey *key, long long lfu_freq) REDISMODULE_ATTR;
1107REDISMODULE_API int (*RedisModule_GetLFU)(RedisModuleKey *key, long long *lfu_freq) REDISMODULE_ATTR;
1108REDISMODULE_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;
1109REDISMODULE_API void (*RedisModule_SignalKeyAsReady)(RedisModuleCtx *ctx, RedisModuleString *key) REDISMODULE_ATTR;
1110REDISMODULE_API RedisModuleString * (*RedisModule_GetBlockedClientReadyKey)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1111REDISMODULE_API RedisModuleScanCursor * (*RedisModule_ScanCursorCreate)() REDISMODULE_ATTR;
1112REDISMODULE_API void (*RedisModule_ScanCursorRestart)(RedisModuleScanCursor *cursor) REDISMODULE_ATTR;
1113REDISMODULE_API void (*RedisModule_ScanCursorDestroy)(RedisModuleScanCursor *cursor) REDISMODULE_ATTR;
1114REDISMODULE_API int (*RedisModule_Scan)(RedisModuleCtx *ctx, RedisModuleScanCursor *cursor, RedisModuleScanCB fn, void *privdata) REDISMODULE_ATTR;
1115REDISMODULE_API int (*RedisModule_ScanKey)(RedisModuleKey *key, RedisModuleScanCursor *cursor, RedisModuleScanKeyCB fn, void *privdata) REDISMODULE_ATTR;
1116REDISMODULE_API int (*RedisModule_GetContextFlagsAll)() REDISMODULE_ATTR;
1117REDISMODULE_API int (*RedisModule_GetKeyspaceNotificationFlagsAll)() REDISMODULE_ATTR;
1118REDISMODULE_API int (*RedisModule_IsSubEventSupported)(RedisModuleEvent event, uint64_t subevent) REDISMODULE_ATTR;
1119REDISMODULE_API int (*RedisModule_GetServerVersion)() REDISMODULE_ATTR;
1120REDISMODULE_API int (*RedisModule_GetTypeMethodVersion)() REDISMODULE_ATTR;
1121REDISMODULE_API void (*RedisModule_Yield)(RedisModuleCtx *ctx, int flags, const char *busy_reply) REDISMODULE_ATTR;
1122REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_BlockClient)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(RedisModuleCtx*,void*), long long timeout_ms) REDISMODULE_ATTR;
1123REDISMODULE_API int (*RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata) REDISMODULE_ATTR;
1124REDISMODULE_API int (*RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1125REDISMODULE_API int (*RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1126REDISMODULE_API void * (*RedisModule_GetBlockedClientPrivateData)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1127REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_GetBlockedClientHandle)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1128REDISMODULE_API int (*RedisModule_AbortBlock)(RedisModuleBlockedClient *bc) REDISMODULE_ATTR;
1129REDISMODULE_API int (*RedisModule_BlockedClientMeasureTimeStart)(RedisModuleBlockedClient *bc) REDISMODULE_ATTR;
1130REDISMODULE_API int (*RedisModule_BlockedClientMeasureTimeEnd)(RedisModuleBlockedClient *bc) REDISMODULE_ATTR;
1131REDISMODULE_API RedisModuleCtx * (*RedisModule_GetThreadSafeContext)(RedisModuleBlockedClient *bc) REDISMODULE_ATTR;
1132REDISMODULE_API RedisModuleCtx * (*RedisModule_GetDetachedThreadSafeContext)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1133REDISMODULE_API void (*RedisModule_FreeThreadSafeContext)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1134REDISMODULE_API void (*RedisModule_ThreadSafeContextLock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1135REDISMODULE_API int (*RedisModule_ThreadSafeContextTryLock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1136REDISMODULE_API void (*RedisModule_ThreadSafeContextUnlock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1137REDISMODULE_API int (*RedisModule_SubscribeToKeyspaceEvents)(RedisModuleCtx *ctx, int types, RedisModuleNotificationFunc cb) REDISMODULE_ATTR;
1138REDISMODULE_API int (*RedisModule_NotifyKeyspaceEvent)(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key) REDISMODULE_ATTR;
1139REDISMODULE_API int (*RedisModule_GetNotifyKeyspaceEvents)() REDISMODULE_ATTR;
1140REDISMODULE_API int (*RedisModule_BlockedClientDisconnected)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1141REDISMODULE_API void (*RedisModule_RegisterClusterMessageReceiver)(RedisModuleCtx *ctx, uint8_t type, RedisModuleClusterMessageReceiver callback) REDISMODULE_ATTR;
1142REDISMODULE_API int (*RedisModule_SendClusterMessage)(RedisModuleCtx *ctx, const char *target_id, uint8_t type, const char *msg, uint32_t len) REDISMODULE_ATTR;
1143REDISMODULE_API int (*RedisModule_GetClusterNodeInfo)(RedisModuleCtx *ctx, const char *id, char *ip, char *master_id, int *port, int *flags) REDISMODULE_ATTR;
1144REDISMODULE_API char ** (*RedisModule_GetClusterNodesList)(RedisModuleCtx *ctx, size_t *numnodes) REDISMODULE_ATTR;
1145REDISMODULE_API void (*RedisModule_FreeClusterNodesList)(char **ids) REDISMODULE_ATTR;
1146REDISMODULE_API RedisModuleTimerID (*RedisModule_CreateTimer)(RedisModuleCtx *ctx, mstime_t period, RedisModuleTimerProc callback, void *data) REDISMODULE_ATTR;
1147REDISMODULE_API int (*RedisModule_StopTimer)(RedisModuleCtx *ctx, RedisModuleTimerID id, void **data) REDISMODULE_ATTR;
1148REDISMODULE_API int (*RedisModule_GetTimerInfo)(RedisModuleCtx *ctx, RedisModuleTimerID id, uint64_t *remaining, void **data) REDISMODULE_ATTR;
1149REDISMODULE_API const char * (*RedisModule_GetMyClusterID)(void) REDISMODULE_ATTR;
1150REDISMODULE_API size_t (*RedisModule_GetClusterSize)(void) REDISMODULE_ATTR;
1151REDISMODULE_API void (*RedisModule_GetRandomBytes)(unsigned char *dst, size_t len) REDISMODULE_ATTR;
1152REDISMODULE_API void (*RedisModule_GetRandomHexChars)(char *dst, size_t len) REDISMODULE_ATTR;
1153REDISMODULE_API void (*RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback) REDISMODULE_ATTR;
1154REDISMODULE_API void (*RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags) REDISMODULE_ATTR;
1155REDISMODULE_API int (*RedisModule_ExportSharedAPI)(RedisModuleCtx *ctx, const char *apiname, void *func) REDISMODULE_ATTR;
1156REDISMODULE_API void * (*RedisModule_GetSharedAPI)(RedisModuleCtx *ctx, const char *apiname) REDISMODULE_ATTR;
1157REDISMODULE_API RedisModuleCommandFilter * (*RedisModule_RegisterCommandFilter)(RedisModuleCtx *ctx, RedisModuleCommandFilterFunc cb, int flags) REDISMODULE_ATTR;
1158REDISMODULE_API int (*RedisModule_UnregisterCommandFilter)(RedisModuleCtx *ctx, RedisModuleCommandFilter *filter) REDISMODULE_ATTR;
1159REDISMODULE_API int (*RedisModule_CommandFilterArgsCount)(RedisModuleCommandFilterCtx *fctx) REDISMODULE_ATTR;
1160REDISMODULE_API RedisModuleString * (*RedisModule_CommandFilterArgGet)(RedisModuleCommandFilterCtx *fctx, int pos) REDISMODULE_ATTR;
1161REDISMODULE_API int (*RedisModule_CommandFilterArgInsert)(RedisModuleCommandFilterCtx *fctx, int pos, RedisModuleString *arg) REDISMODULE_ATTR;
1162REDISMODULE_API int (*RedisModule_CommandFilterArgReplace)(RedisModuleCommandFilterCtx *fctx, int pos, RedisModuleString *arg) REDISMODULE_ATTR;
1163REDISMODULE_API int (*RedisModule_CommandFilterArgDelete)(RedisModuleCommandFilterCtx *fctx, int pos) REDISMODULE_ATTR;
1164REDISMODULE_API int (*RedisModule_Fork)(RedisModuleForkDoneHandler cb, void *user_data) REDISMODULE_ATTR;
1165REDISMODULE_API void (*RedisModule_SendChildHeartbeat)(double progress) REDISMODULE_ATTR;
1166REDISMODULE_API int (*RedisModule_ExitFromChild)(int retcode) REDISMODULE_ATTR;
1167REDISMODULE_API int (*RedisModule_KillForkChild)(int child_pid) REDISMODULE_ATTR;
1168REDISMODULE_API float (*RedisModule_GetUsedMemoryRatio)() REDISMODULE_ATTR;
1169REDISMODULE_API size_t (*RedisModule_MallocSize)(void* ptr) REDISMODULE_ATTR;
1170REDISMODULE_API size_t (*RedisModule_MallocUsableSize)(void *ptr) REDISMODULE_ATTR;
1171REDISMODULE_API size_t (*RedisModule_MallocSizeString)(RedisModuleString* str) REDISMODULE_ATTR;
1172REDISMODULE_API size_t (*RedisModule_MallocSizeDict)(RedisModuleDict* dict) REDISMODULE_ATTR;
1173REDISMODULE_API RedisModuleUser * (*RedisModule_CreateModuleUser)(const char *name) REDISMODULE_ATTR;
1174REDISMODULE_API void (*RedisModule_FreeModuleUser)(RedisModuleUser *user) REDISMODULE_ATTR;
1175REDISMODULE_API int (*RedisModule_SetModuleUserACL)(RedisModuleUser *user, const char* acl) REDISMODULE_ATTR;
1176REDISMODULE_API RedisModuleString * (*RedisModule_GetCurrentUserName)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1177REDISMODULE_API RedisModuleUser * (*RedisModule_GetModuleUserFromUserName)(RedisModuleString *name) REDISMODULE_ATTR;
1178REDISMODULE_API int (*RedisModule_ACLCheckCommandPermissions)(RedisModuleUser *user, RedisModuleString **argv, int argc) REDISMODULE_ATTR;
1179REDISMODULE_API int (*RedisModule_ACLCheckKeyPermissions)(RedisModuleUser *user, RedisModuleString *key, int flags) REDISMODULE_ATTR;
1180REDISMODULE_API int (*RedisModule_ACLCheckChannelPermissions)(RedisModuleUser *user, RedisModuleString *ch, int literal) REDISMODULE_ATTR;
1181REDISMODULE_API void (*RedisModule_ACLAddLogEntry)(RedisModuleCtx *ctx, RedisModuleUser *user, RedisModuleString *object, RedisModuleACLLogEntryReason reason) REDISMODULE_ATTR;
1182REDISMODULE_API int (*RedisModule_AuthenticateClientWithACLUser)(RedisModuleCtx *ctx, const char *name, size_t len, RedisModuleUserChangedFunc callback, void *privdata, uint64_t *client_id) REDISMODULE_ATTR;
1183REDISMODULE_API int (*RedisModule_AuthenticateClientWithUser)(RedisModuleCtx *ctx, RedisModuleUser *user, RedisModuleUserChangedFunc callback, void *privdata, uint64_t *client_id) REDISMODULE_ATTR;
1184REDISMODULE_API int (*RedisModule_DeauthenticateAndCloseClient)(RedisModuleCtx *ctx, uint64_t client_id) REDISMODULE_ATTR;
1185REDISMODULE_API int (*RedisModule_RedactClientCommandArgument)(RedisModuleCtx *ctx, int pos) REDISMODULE_ATTR;
1186REDISMODULE_API RedisModuleString * (*RedisModule_GetClientCertificate)(RedisModuleCtx *ctx, uint64_t id) REDISMODULE_ATTR;
1187REDISMODULE_API int *(*RedisModule_GetCommandKeys)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, int *num_keys) REDISMODULE_ATTR;
1188REDISMODULE_API int *(*RedisModule_GetCommandKeysWithFlags)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, int *num_keys, int **out_flags) REDISMODULE_ATTR;
1189REDISMODULE_API const char *(*RedisModule_GetCurrentCommandName)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1190REDISMODULE_API int (*RedisModule_RegisterDefragFunc)(RedisModuleCtx *ctx, RedisModuleDefragFunc func) REDISMODULE_ATTR;
1191REDISMODULE_API void *(*RedisModule_DefragAlloc)(RedisModuleDefragCtx *ctx, void *ptr) REDISMODULE_ATTR;
1192REDISMODULE_API RedisModuleString *(*RedisModule_DefragRedisModuleString)(RedisModuleDefragCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
1193REDISMODULE_API int (*RedisModule_DefragShouldStop)(RedisModuleDefragCtx *ctx) REDISMODULE_ATTR;
1194REDISMODULE_API int (*RedisModule_DefragCursorSet)(RedisModuleDefragCtx *ctx, unsigned long cursor) REDISMODULE_ATTR;
1195REDISMODULE_API int (*RedisModule_DefragCursorGet)(RedisModuleDefragCtx *ctx, unsigned long *cursor) REDISMODULE_ATTR;
1196REDISMODULE_API int (*RedisModule_GetDbIdFromDefragCtx)(RedisModuleDefragCtx *ctx) REDISMODULE_ATTR;
1197REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromDefragCtx)(RedisModuleDefragCtx *ctx) REDISMODULE_ATTR;
1198REDISMODULE_API int (*RedisModule_EventLoopAdd)(int fd, int mask, RedisModuleEventLoopFunc func, void *user_data) REDISMODULE_ATTR;
1199REDISMODULE_API int (*RedisModule_EventLoopDel)(int fd, int mask) REDISMODULE_ATTR;
1200REDISMODULE_API int (*RedisModule_EventLoopAddOneShot)(RedisModuleEventLoopOneShotFunc func, void *user_data) REDISMODULE_ATTR;
1201REDISMODULE_API int (*RedisModule_RegisterBoolConfig)(RedisModuleCtx *ctx, const char *name, int default_val, unsigned int flags, RedisModuleConfigGetBoolFunc getfn, RedisModuleConfigSetBoolFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
1202REDISMODULE_API int (*RedisModule_RegisterNumericConfig)(RedisModuleCtx *ctx, const char *name, long long default_val, unsigned int flags, long long min, long long max, RedisModuleConfigGetNumericFunc getfn, RedisModuleConfigSetNumericFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
1203REDISMODULE_API int (*RedisModule_RegisterStringConfig)(RedisModuleCtx *ctx, const char *name, const char *default_val, unsigned int flags, RedisModuleConfigGetStringFunc getfn, RedisModuleConfigSetStringFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
1204REDISMODULE_API int (*RedisModule_RegisterEnumConfig)(RedisModuleCtx *ctx, const char *name, int default_val, unsigned int flags, const char **enum_values, const int *int_values, int num_enum_vals, RedisModuleConfigGetEnumFunc getfn, RedisModuleConfigSetEnumFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
1205REDISMODULE_API int (*RedisModule_LoadConfigs)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
1206
1207#define RedisModule_IsAOFClient(id) ((id) == UINT64_MAX)
1208
1209/* This is included inline inside each Redis module. */
1210static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) REDISMODULE_ATTR_UNUSED;
1211static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
1212 void *getapifuncptr = ((void**)ctx)[0];
1213 RedisModule_GetApi = (int (*)(const char *, void *)) (unsigned long)getapifuncptr;
1214 REDISMODULE_GET_API(Alloc);
1215 REDISMODULE_GET_API(TryAlloc);
1216 REDISMODULE_GET_API(Calloc);
1217 REDISMODULE_GET_API(Free);
1218 REDISMODULE_GET_API(Realloc);
1219 REDISMODULE_GET_API(Strdup);
1220 REDISMODULE_GET_API(CreateCommand);
1221 REDISMODULE_GET_API(GetCommand);
1222 REDISMODULE_GET_API(CreateSubcommand);
1223 REDISMODULE_GET_API(SetCommandInfo);
1224 REDISMODULE_GET_API(SetModuleAttribs);
1225 REDISMODULE_GET_API(IsModuleNameBusy);
1226 REDISMODULE_GET_API(WrongArity);
1227 REDISMODULE_GET_API(ReplyWithLongLong);
1228 REDISMODULE_GET_API(ReplyWithError);
1229 REDISMODULE_GET_API(ReplyWithSimpleString);
1230 REDISMODULE_GET_API(ReplyWithArray);
1231 REDISMODULE_GET_API(ReplyWithMap);
1232 REDISMODULE_GET_API(ReplyWithSet);
1233 REDISMODULE_GET_API(ReplyWithAttribute);
1234 REDISMODULE_GET_API(ReplyWithNullArray);
1235 REDISMODULE_GET_API(ReplyWithEmptyArray);
1236 REDISMODULE_GET_API(ReplySetArrayLength);
1237 REDISMODULE_GET_API(ReplySetMapLength);
1238 REDISMODULE_GET_API(ReplySetSetLength);
1239 REDISMODULE_GET_API(ReplySetAttributeLength);
1240 REDISMODULE_GET_API(ReplySetPushLength);
1241 REDISMODULE_GET_API(ReplyWithStringBuffer);
1242 REDISMODULE_GET_API(ReplyWithCString);
1243 REDISMODULE_GET_API(ReplyWithString);
1244 REDISMODULE_GET_API(ReplyWithEmptyString);
1245 REDISMODULE_GET_API(ReplyWithVerbatimString);
1246 REDISMODULE_GET_API(ReplyWithVerbatimStringType);
1247 REDISMODULE_GET_API(ReplyWithNull);
1248 REDISMODULE_GET_API(ReplyWithBool);
1249 REDISMODULE_GET_API(ReplyWithCallReply);
1250 REDISMODULE_GET_API(ReplyWithDouble);
1251 REDISMODULE_GET_API(ReplyWithBigNumber);
1252 REDISMODULE_GET_API(ReplyWithLongDouble);
1253 REDISMODULE_GET_API(GetSelectedDb);
1254 REDISMODULE_GET_API(SelectDb);
1255 REDISMODULE_GET_API(KeyExists);
1256 REDISMODULE_GET_API(OpenKey);
1257 REDISMODULE_GET_API(CloseKey);
1258 REDISMODULE_GET_API(KeyType);
1259 REDISMODULE_GET_API(ValueLength);
1260 REDISMODULE_GET_API(ListPush);
1261 REDISMODULE_GET_API(ListPop);
1262 REDISMODULE_GET_API(ListGet);
1263 REDISMODULE_GET_API(ListSet);
1264 REDISMODULE_GET_API(ListInsert);
1265 REDISMODULE_GET_API(ListDelete);
1266 REDISMODULE_GET_API(StringToLongLong);
1267 REDISMODULE_GET_API(StringToULongLong);
1268 REDISMODULE_GET_API(StringToDouble);
1269 REDISMODULE_GET_API(StringToLongDouble);
1270 REDISMODULE_GET_API(StringToStreamID);
1271 REDISMODULE_GET_API(Call);
1272 REDISMODULE_GET_API(CallReplyProto);
1273 REDISMODULE_GET_API(FreeCallReply);
1274 REDISMODULE_GET_API(CallReplyInteger);
1275 REDISMODULE_GET_API(CallReplyDouble);
1276 REDISMODULE_GET_API(CallReplyBool);
1277 REDISMODULE_GET_API(CallReplyBigNumber);
1278 REDISMODULE_GET_API(CallReplyVerbatim);
1279 REDISMODULE_GET_API(CallReplySetElement);
1280 REDISMODULE_GET_API(CallReplyMapElement);
1281 REDISMODULE_GET_API(CallReplyAttributeElement);
1282 REDISMODULE_GET_API(CallReplyAttribute);
1283 REDISMODULE_GET_API(CallReplyType);
1284 REDISMODULE_GET_API(CallReplyLength);
1285 REDISMODULE_GET_API(CallReplyArrayElement);
1286 REDISMODULE_GET_API(CallReplyStringPtr);
1287 REDISMODULE_GET_API(CreateStringFromCallReply);
1288 REDISMODULE_GET_API(CreateString);
1289 REDISMODULE_GET_API(CreateStringFromLongLong);
1290 REDISMODULE_GET_API(CreateStringFromULongLong);
1291 REDISMODULE_GET_API(CreateStringFromDouble);
1292 REDISMODULE_GET_API(CreateStringFromLongDouble);
1293 REDISMODULE_GET_API(CreateStringFromString);
1294 REDISMODULE_GET_API(CreateStringFromStreamID);
1295 REDISMODULE_GET_API(CreateStringPrintf);
1296 REDISMODULE_GET_API(FreeString);
1297 REDISMODULE_GET_API(StringPtrLen);
1298 REDISMODULE_GET_API(AutoMemory);
1299 REDISMODULE_GET_API(Replicate);
1300 REDISMODULE_GET_API(ReplicateVerbatim);
1301 REDISMODULE_GET_API(DeleteKey);
1302 REDISMODULE_GET_API(UnlinkKey);
1303 REDISMODULE_GET_API(StringSet);
1304 REDISMODULE_GET_API(StringDMA);
1305 REDISMODULE_GET_API(StringTruncate);
1306 REDISMODULE_GET_API(GetExpire);
1307 REDISMODULE_GET_API(SetExpire);
1308 REDISMODULE_GET_API(GetAbsExpire);
1309 REDISMODULE_GET_API(SetAbsExpire);
1310 REDISMODULE_GET_API(ResetDataset);
1311 REDISMODULE_GET_API(DbSize);
1312 REDISMODULE_GET_API(RandomKey);
1313 REDISMODULE_GET_API(ZsetAdd);
1314 REDISMODULE_GET_API(ZsetIncrby);
1315 REDISMODULE_GET_API(ZsetScore);
1316 REDISMODULE_GET_API(ZsetRem);
1317 REDISMODULE_GET_API(ZsetRangeStop);
1318 REDISMODULE_GET_API(ZsetFirstInScoreRange);
1319 REDISMODULE_GET_API(ZsetLastInScoreRange);
1320 REDISMODULE_GET_API(ZsetFirstInLexRange);
1321 REDISMODULE_GET_API(ZsetLastInLexRange);
1322 REDISMODULE_GET_API(ZsetRangeCurrentElement);
1323 REDISMODULE_GET_API(ZsetRangeNext);
1324 REDISMODULE_GET_API(ZsetRangePrev);
1325 REDISMODULE_GET_API(ZsetRangeEndReached);
1326 REDISMODULE_GET_API(HashSet);
1327 REDISMODULE_GET_API(HashGet);
1328 REDISMODULE_GET_API(StreamAdd);
1329 REDISMODULE_GET_API(StreamDelete);
1330 REDISMODULE_GET_API(StreamIteratorStart);
1331 REDISMODULE_GET_API(StreamIteratorStop);
1332 REDISMODULE_GET_API(StreamIteratorNextID);
1333 REDISMODULE_GET_API(StreamIteratorNextField);
1334 REDISMODULE_GET_API(StreamIteratorDelete);
1335 REDISMODULE_GET_API(StreamTrimByLength);
1336 REDISMODULE_GET_API(StreamTrimByID);
1337 REDISMODULE_GET_API(IsKeysPositionRequest);
1338 REDISMODULE_GET_API(KeyAtPos);
1339 REDISMODULE_GET_API(KeyAtPosWithFlags);
1340 REDISMODULE_GET_API(IsChannelsPositionRequest);
1341 REDISMODULE_GET_API(ChannelAtPosWithFlags);
1342 REDISMODULE_GET_API(GetClientId);
1343 REDISMODULE_GET_API(GetClientUserNameById);
1344 REDISMODULE_GET_API(GetContextFlags);
1345 REDISMODULE_GET_API(AvoidReplicaTraffic);
1346 REDISMODULE_GET_API(PoolAlloc);
1347 REDISMODULE_GET_API(CreateDataType);
1348 REDISMODULE_GET_API(ModuleTypeSetValue);
1349 REDISMODULE_GET_API(ModuleTypeReplaceValue);
1350 REDISMODULE_GET_API(ModuleTypeGetType);
1351 REDISMODULE_GET_API(ModuleTypeGetValue);
1352 REDISMODULE_GET_API(IsIOError);
1353 REDISMODULE_GET_API(SetModuleOptions);
1354 REDISMODULE_GET_API(SignalModifiedKey);
1355 REDISMODULE_GET_API(SaveUnsigned);
1356 REDISMODULE_GET_API(LoadUnsigned);
1357 REDISMODULE_GET_API(SaveSigned);
1358 REDISMODULE_GET_API(LoadSigned);
1359 REDISMODULE_GET_API(SaveString);
1360 REDISMODULE_GET_API(SaveStringBuffer);
1361 REDISMODULE_GET_API(LoadString);
1362 REDISMODULE_GET_API(LoadStringBuffer);
1363 REDISMODULE_GET_API(SaveDouble);
1364 REDISMODULE_GET_API(LoadDouble);
1365 REDISMODULE_GET_API(SaveFloat);
1366 REDISMODULE_GET_API(LoadFloat);
1367 REDISMODULE_GET_API(SaveLongDouble);
1368 REDISMODULE_GET_API(LoadLongDouble);
1369 REDISMODULE_GET_API(SaveDataTypeToString);
1370 REDISMODULE_GET_API(LoadDataTypeFromString);
1371 REDISMODULE_GET_API(LoadDataTypeFromStringEncver);
1372 REDISMODULE_GET_API(EmitAOF);
1373 REDISMODULE_GET_API(Log);
1374 REDISMODULE_GET_API(LogIOError);
1375 REDISMODULE_GET_API(_Assert);
1376 REDISMODULE_GET_API(LatencyAddSample);
1377 REDISMODULE_GET_API(StringAppendBuffer);
1378 REDISMODULE_GET_API(TrimStringAllocation);
1379 REDISMODULE_GET_API(RetainString);
1380 REDISMODULE_GET_API(HoldString);
1381 REDISMODULE_GET_API(StringCompare);
1382 REDISMODULE_GET_API(GetContextFromIO);
1383 REDISMODULE_GET_API(GetKeyNameFromIO);
1384 REDISMODULE_GET_API(GetKeyNameFromModuleKey);
1385 REDISMODULE_GET_API(GetDbIdFromModuleKey);
1386 REDISMODULE_GET_API(GetDbIdFromIO);
1387 REDISMODULE_GET_API(GetKeyNameFromOptCtx);
1388 REDISMODULE_GET_API(GetToKeyNameFromOptCtx);
1389 REDISMODULE_GET_API(GetDbIdFromOptCtx);
1390 REDISMODULE_GET_API(GetToDbIdFromOptCtx);
1391 REDISMODULE_GET_API(Milliseconds);
1392 REDISMODULE_GET_API(MonotonicMicroseconds);
1393 REDISMODULE_GET_API(DigestAddStringBuffer);
1394 REDISMODULE_GET_API(DigestAddLongLong);
1395 REDISMODULE_GET_API(DigestEndSequence);
1396 REDISMODULE_GET_API(GetKeyNameFromDigest);
1397 REDISMODULE_GET_API(GetDbIdFromDigest);
1398 REDISMODULE_GET_API(CreateDict);
1399 REDISMODULE_GET_API(FreeDict);
1400 REDISMODULE_GET_API(DictSize);
1401 REDISMODULE_GET_API(DictSetC);
1402 REDISMODULE_GET_API(DictReplaceC);
1403 REDISMODULE_GET_API(DictSet);
1404 REDISMODULE_GET_API(DictReplace);
1405 REDISMODULE_GET_API(DictGetC);
1406 REDISMODULE_GET_API(DictGet);
1407 REDISMODULE_GET_API(DictDelC);
1408 REDISMODULE_GET_API(DictDel);
1409 REDISMODULE_GET_API(DictIteratorStartC);
1410 REDISMODULE_GET_API(DictIteratorStart);
1411 REDISMODULE_GET_API(DictIteratorStop);
1412 REDISMODULE_GET_API(DictIteratorReseekC);
1413 REDISMODULE_GET_API(DictIteratorReseek);
1414 REDISMODULE_GET_API(DictNextC);
1415 REDISMODULE_GET_API(DictPrevC);
1416 REDISMODULE_GET_API(DictNext);
1417 REDISMODULE_GET_API(DictPrev);
1418 REDISMODULE_GET_API(DictCompare);
1419 REDISMODULE_GET_API(DictCompareC);
1420 REDISMODULE_GET_API(RegisterInfoFunc);
1421 REDISMODULE_GET_API(InfoAddSection);
1422 REDISMODULE_GET_API(InfoBeginDictField);
1423 REDISMODULE_GET_API(InfoEndDictField);
1424 REDISMODULE_GET_API(InfoAddFieldString);
1425 REDISMODULE_GET_API(InfoAddFieldCString);
1426 REDISMODULE_GET_API(InfoAddFieldDouble);
1427 REDISMODULE_GET_API(InfoAddFieldLongLong);
1428 REDISMODULE_GET_API(InfoAddFieldULongLong);
1429 REDISMODULE_GET_API(GetServerInfo);
1430 REDISMODULE_GET_API(FreeServerInfo);
1431 REDISMODULE_GET_API(ServerInfoGetField);
1432 REDISMODULE_GET_API(ServerInfoGetFieldC);
1433 REDISMODULE_GET_API(ServerInfoGetFieldSigned);
1434 REDISMODULE_GET_API(ServerInfoGetFieldUnsigned);
1435 REDISMODULE_GET_API(ServerInfoGetFieldDouble);
1436 REDISMODULE_GET_API(GetClientInfoById);
1437 REDISMODULE_GET_API(GetClientNameById);
1438 REDISMODULE_GET_API(SetClientNameById);
1439 REDISMODULE_GET_API(PublishMessage);
1440 REDISMODULE_GET_API(PublishMessageShard);
1441 REDISMODULE_GET_API(SubscribeToServerEvent);
1442 REDISMODULE_GET_API(SetLRU);
1443 REDISMODULE_GET_API(GetLRU);
1444 REDISMODULE_GET_API(SetLFU);
1445 REDISMODULE_GET_API(GetLFU);
1446 REDISMODULE_GET_API(BlockClientOnKeys);
1447 REDISMODULE_GET_API(SignalKeyAsReady);
1448 REDISMODULE_GET_API(GetBlockedClientReadyKey);
1449 REDISMODULE_GET_API(ScanCursorCreate);
1450 REDISMODULE_GET_API(ScanCursorRestart);
1451 REDISMODULE_GET_API(ScanCursorDestroy);
1452 REDISMODULE_GET_API(Scan);
1453 REDISMODULE_GET_API(ScanKey);
1454 REDISMODULE_GET_API(GetContextFlagsAll);
1455 REDISMODULE_GET_API(GetKeyspaceNotificationFlagsAll);
1456 REDISMODULE_GET_API(IsSubEventSupported);
1457 REDISMODULE_GET_API(GetServerVersion);
1458 REDISMODULE_GET_API(GetTypeMethodVersion);
1459 REDISMODULE_GET_API(Yield);
1460 REDISMODULE_GET_API(GetThreadSafeContext);
1461 REDISMODULE_GET_API(GetDetachedThreadSafeContext);
1462 REDISMODULE_GET_API(FreeThreadSafeContext);
1463 REDISMODULE_GET_API(ThreadSafeContextLock);
1464 REDISMODULE_GET_API(ThreadSafeContextTryLock);
1465 REDISMODULE_GET_API(ThreadSafeContextUnlock);
1466 REDISMODULE_GET_API(BlockClient);
1467 REDISMODULE_GET_API(UnblockClient);
1468 REDISMODULE_GET_API(IsBlockedReplyRequest);
1469 REDISMODULE_GET_API(IsBlockedTimeoutRequest);
1470 REDISMODULE_GET_API(GetBlockedClientPrivateData);
1471 REDISMODULE_GET_API(GetBlockedClientHandle);
1472 REDISMODULE_GET_API(AbortBlock);
1473 REDISMODULE_GET_API(BlockedClientMeasureTimeStart);
1474 REDISMODULE_GET_API(BlockedClientMeasureTimeEnd);
1475 REDISMODULE_GET_API(SetDisconnectCallback);
1476 REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
1477 REDISMODULE_GET_API(NotifyKeyspaceEvent);
1478 REDISMODULE_GET_API(GetNotifyKeyspaceEvents);
1479 REDISMODULE_GET_API(BlockedClientDisconnected);
1480 REDISMODULE_GET_API(RegisterClusterMessageReceiver);
1481 REDISMODULE_GET_API(SendClusterMessage);
1482 REDISMODULE_GET_API(GetClusterNodeInfo);
1483 REDISMODULE_GET_API(GetClusterNodesList);
1484 REDISMODULE_GET_API(FreeClusterNodesList);
1485 REDISMODULE_GET_API(CreateTimer);
1486 REDISMODULE_GET_API(StopTimer);
1487 REDISMODULE_GET_API(GetTimerInfo);
1488 REDISMODULE_GET_API(GetMyClusterID);
1489 REDISMODULE_GET_API(GetClusterSize);
1490 REDISMODULE_GET_API(GetRandomBytes);
1491 REDISMODULE_GET_API(GetRandomHexChars);
1492 REDISMODULE_GET_API(SetClusterFlags);
1493 REDISMODULE_GET_API(ExportSharedAPI);
1494 REDISMODULE_GET_API(GetSharedAPI);
1495 REDISMODULE_GET_API(RegisterCommandFilter);
1496 REDISMODULE_GET_API(UnregisterCommandFilter);
1497 REDISMODULE_GET_API(CommandFilterArgsCount);
1498 REDISMODULE_GET_API(CommandFilterArgGet);
1499 REDISMODULE_GET_API(CommandFilterArgInsert);
1500 REDISMODULE_GET_API(CommandFilterArgReplace);
1501 REDISMODULE_GET_API(CommandFilterArgDelete);
1502 REDISMODULE_GET_API(Fork);
1503 REDISMODULE_GET_API(SendChildHeartbeat);
1504 REDISMODULE_GET_API(ExitFromChild);
1505 REDISMODULE_GET_API(KillForkChild);
1506 REDISMODULE_GET_API(GetUsedMemoryRatio);
1507 REDISMODULE_GET_API(MallocSize);
1508 REDISMODULE_GET_API(MallocUsableSize);
1509 REDISMODULE_GET_API(MallocSizeString);
1510 REDISMODULE_GET_API(MallocSizeDict);
1511 REDISMODULE_GET_API(CreateModuleUser);
1512 REDISMODULE_GET_API(FreeModuleUser);
1513 REDISMODULE_GET_API(SetModuleUserACL);
1514 REDISMODULE_GET_API(GetCurrentUserName);
1515 REDISMODULE_GET_API(GetModuleUserFromUserName);
1516 REDISMODULE_GET_API(ACLCheckCommandPermissions);
1517 REDISMODULE_GET_API(ACLCheckKeyPermissions);
1518 REDISMODULE_GET_API(ACLCheckChannelPermissions);
1519 REDISMODULE_GET_API(ACLAddLogEntry);
1520 REDISMODULE_GET_API(DeauthenticateAndCloseClient);
1521 REDISMODULE_GET_API(AuthenticateClientWithACLUser);
1522 REDISMODULE_GET_API(AuthenticateClientWithUser);
1523 REDISMODULE_GET_API(RedactClientCommandArgument);
1524 REDISMODULE_GET_API(GetClientCertificate);
1525 REDISMODULE_GET_API(GetCommandKeys);
1526 REDISMODULE_GET_API(GetCommandKeysWithFlags);
1527 REDISMODULE_GET_API(GetCurrentCommandName);
1528 REDISMODULE_GET_API(RegisterDefragFunc);
1529 REDISMODULE_GET_API(DefragAlloc);
1530 REDISMODULE_GET_API(DefragRedisModuleString);
1531 REDISMODULE_GET_API(DefragShouldStop);
1532 REDISMODULE_GET_API(DefragCursorSet);
1533 REDISMODULE_GET_API(DefragCursorGet);
1534 REDISMODULE_GET_API(GetKeyNameFromDefragCtx);
1535 REDISMODULE_GET_API(GetDbIdFromDefragCtx);
1536 REDISMODULE_GET_API(EventLoopAdd);
1537 REDISMODULE_GET_API(EventLoopDel);
1538 REDISMODULE_GET_API(EventLoopAddOneShot);
1539 REDISMODULE_GET_API(RegisterBoolConfig);
1540 REDISMODULE_GET_API(RegisterNumericConfig);
1541 REDISMODULE_GET_API(RegisterStringConfig);
1542 REDISMODULE_GET_API(RegisterEnumConfig);
1543 REDISMODULE_GET_API(LoadConfigs);
1544
1545 if (RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR;
1546 RedisModule_SetModuleAttribs(ctx,name,ver,apiver);
1547 return REDISMODULE_OK;
1548}
1549
1550#define RedisModule_Assert(_e) ((_e)?(void)0 : (RedisModule__Assert(#_e,__FILE__,__LINE__),exit(1)))
1551
1552#define RMAPI_FUNC_SUPPORTED(func) (func != NULL)
1553
1554#else
1555
1556/* Things only defined for the modules core, not exported to modules
1557 * including this file. */
1558#define RedisModuleString robj
1559
1560#endif /* REDISMODULE_CORE */
1561#endif /* REDISMODULE_H */
1562