· 6 years ago · Feb 16, 2020, 10:06 AM
1#ifndef REDISMODULE_H
2#define REDISMODULE_H
3
4#include <sys/types.h>
5#include <stdint.h>
6#include <stdio.h>
7
8/* ---------------- Defines common between core and modules --------------- */
9
10/* Error status return values. */
11#define REDISMODULE_OK 0
12#define REDISMODULE_ERR 1
13
14/* API versions. */
15#define REDISMODULE_APIVER_1 1
16
17/* API flags and constants */
18#define REDISMODULE_READ (1<<0)
19#define REDISMODULE_WRITE (1<<1)
20
21#define REDISMODULE_LIST_HEAD 0
22#define REDISMODULE_LIST_TAIL 1
23
24/* Key types. */
25#define REDISMODULE_KEYTYPE_EMPTY 0
26#define REDISMODULE_KEYTYPE_STRING 1
27#define REDISMODULE_KEYTYPE_LIST 2
28#define REDISMODULE_KEYTYPE_HASH 3
29#define REDISMODULE_KEYTYPE_SET 4
30#define REDISMODULE_KEYTYPE_ZSET 5
31#define REDISMODULE_KEYTYPE_MODULE 6
32
33/* Reply types. */
34#define REDISMODULE_REPLY_UNKNOWN -1
35#define REDISMODULE_REPLY_STRING 0
36#define REDISMODULE_REPLY_ERROR 1
37#define REDISMODULE_REPLY_INTEGER 2
38#define REDISMODULE_REPLY_ARRAY 3
39#define REDISMODULE_REPLY_NULL 4
40
41/* Postponed array length. */
42#define REDISMODULE_POSTPONED_ARRAY_LEN -1
43
44/* Expire */
45#define REDISMODULE_NO_EXPIRE -1
46
47/* Sorted set API flags. */
48#define REDISMODULE_ZADD_XX (1<<0)
49#define REDISMODULE_ZADD_NX (1<<1)
50#define REDISMODULE_ZADD_ADDED (1<<2)
51#define REDISMODULE_ZADD_UPDATED (1<<3)
52#define REDISMODULE_ZADD_NOP (1<<4)
53
54/* Hash API flags. */
55#define REDISMODULE_HASH_NONE 0
56#define REDISMODULE_HASH_NX (1<<0)
57#define REDISMODULE_HASH_XX (1<<1)
58#define REDISMODULE_HASH_CFIELDS (1<<2)
59#define REDISMODULE_HASH_EXISTS (1<<3)
60
61/* Context Flags: Info about the current context returned by
62 * RM_GetContextFlags(). */
63
64/* The command is running in the context of a Lua script */
65#define REDISMODULE_CTX_FLAGS_LUA (1<<0)
66/* The command is running inside a Redis transaction */
67#define REDISMODULE_CTX_FLAGS_MULTI (1<<1)
68/* The instance is a master */
69#define REDISMODULE_CTX_FLAGS_MASTER (1<<2)
70/* The instance is a slave */
71#define REDISMODULE_CTX_FLAGS_SLAVE (1<<3)
72/* The instance is read-only (usually meaning it's a slave as well) */
73#define REDISMODULE_CTX_FLAGS_READONLY (1<<4)
74/* The instance is running in cluster mode */
75#define REDISMODULE_CTX_FLAGS_CLUSTER (1<<5)
76/* The instance has AOF enabled */
77#define REDISMODULE_CTX_FLAGS_AOF (1<<6)
78/* The instance has RDB enabled */
79#define REDISMODULE_CTX_FLAGS_RDB (1<<7)
80/* The instance has Maxmemory set */
81#define REDISMODULE_CTX_FLAGS_MAXMEMORY (1<<8)
82/* Maxmemory is set and has an eviction policy that may delete keys */
83#define REDISMODULE_CTX_FLAGS_EVICT (1<<9)
84/* Redis is out of memory according to the maxmemory flag. */
85#define REDISMODULE_CTX_FLAGS_OOM (1<<10)
86/* Less than 25% of memory available according to maxmemory. */
87#define REDISMODULE_CTX_FLAGS_OOM_WARNING (1<<11)
88/* The command was sent over the replication link. */
89#define REDISMODULE_CTX_FLAGS_REPLICATED (1<<12)
90/* Redis is currently loading either from AOF or RDB. */
91#define REDISMODULE_CTX_FLAGS_LOADING (1<<13)
92
93
94#define REDISMODULE_NOTIFY_GENERIC (1<<2) /* g */
95#define REDISMODULE_NOTIFY_STRING (1<<3) /* $ */
96#define REDISMODULE_NOTIFY_LIST (1<<4) /* l */
97#define REDISMODULE_NOTIFY_SET (1<<5) /* s */
98#define REDISMODULE_NOTIFY_HASH (1<<6) /* h */
99#define REDISMODULE_NOTIFY_ZSET (1<<7) /* z */
100#define REDISMODULE_NOTIFY_EXPIRED (1<<8) /* x */
101#define REDISMODULE_NOTIFY_EVICTED (1<<9) /* e */
102#define REDISMODULE_NOTIFY_STREAM (1<<10) /* t */
103#define REDISMODULE_NOTIFY_KEY_MISS (1<<11) /* m */
104#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_KEY_MISS) /* A */
105
106
107/* A special pointer that we can use between the core and the module to signal
108 * field deletion, and that is impossible to be a valid pointer. */
109#define REDISMODULE_HASH_DELETE ((RedisModuleString*)(long)1)
110
111/* Error messages. */
112#define REDISMODULE_ERRORMSG_WRONGTYPE "WRONGTYPE Operation against a key holding the wrong kind of value"
113
114#define REDISMODULE_POSITIVE_INFINITE (1.0/0.0)
115#define REDISMODULE_NEGATIVE_INFINITE (-1.0/0.0)
116
117/* Cluster API defines. */
118#define REDISMODULE_NODE_ID_LEN 40
119#define REDISMODULE_NODE_MYSELF (1<<0)
120#define REDISMODULE_NODE_MASTER (1<<1)
121#define REDISMODULE_NODE_SLAVE (1<<2)
122#define REDISMODULE_NODE_PFAIL (1<<3)
123#define REDISMODULE_NODE_FAIL (1<<4)
124#define REDISMODULE_NODE_NOFAILOVER (1<<5)
125
126#define REDISMODULE_CLUSTER_FLAG_NONE 0
127#define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1)
128#define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2)
129
130#define REDISMODULE_NOT_USED(V) ((void) V)
131
132/* Bit flags for aux_save_triggers and the aux_load and aux_save callbacks */
133#define REDISMODULE_AUX_BEFORE_RDB (1<<0)
134#define REDISMODULE_AUX_AFTER_RDB (1<<1)
135
136/* This type represents a timer handle, and is returned when a timer is
137 * registered and used in order to invalidate a timer. It's just a 64 bit
138 * number, because this is how each timer is represented inside the radix tree
139 * of timers that are going to expire, sorted by expire time. */
140typedef uint64_t RedisModuleTimerID;
141
142/* CommandFilter Flags */
143
144/* Do filter RedisModule_Call() commands initiated by module itself. */
145#define REDISMODULE_CMDFILTER_NOSELF (1<<0)
146
147/* ------------------------- End of common defines ------------------------ */
148
149#ifndef REDISMODULE_CORE
150
151typedef long long mstime_t;
152
153/* Incomplete structures for compiler checks but opaque access. */
154typedef struct RedisModuleCtx RedisModuleCtx;
155typedef struct RedisModuleKey RedisModuleKey;
156typedef struct RedisModuleString RedisModuleString;
157typedef struct RedisModuleCallReply RedisModuleCallReply;
158typedef struct RedisModuleIO RedisModuleIO;
159typedef struct RedisModuleType RedisModuleType;
160typedef struct RedisModuleDigest RedisModuleDigest;
161typedef struct RedisModuleBlockedClient RedisModuleBlockedClient;
162typedef struct RedisModuleClusterInfo RedisModuleClusterInfo;
163typedef struct RedisModuleDict RedisModuleDict;
164typedef struct RedisModuleDictIter RedisModuleDictIter;
165typedef struct RedisModuleCommandFilterCtx RedisModuleCommandFilterCtx;
166typedef struct RedisModuleCommandFilter RedisModuleCommandFilter;
167
168typedef int (*RedisModuleCmdFunc)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
169typedef void (*RedisModuleDisconnectFunc)(RedisModuleCtx *ctx, RedisModuleBlockedClient *bc);
170typedef int (*RedisModuleNotificationFunc)(RedisModuleCtx *ctx, int type, const char *event,
171 RedisModuleString *key);
172typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver);
173typedef void (*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value);
174typedef int (*RedisModuleTypeAuxLoadFunc)(RedisModuleIO *rdb, int encver, int when);
175typedef void (*RedisModuleTypeAuxSaveFunc)(RedisModuleIO *rdb, int when);
176typedef void (*RedisModuleTypeRewriteFunc)(RedisModuleIO *aof, RedisModuleString *key, void *value);
177typedef size_t (*RedisModuleTypeMemUsageFunc)(const void *value);
178typedef void (*RedisModuleTypeDigestFunc)(RedisModuleDigest *digest, void *value);
179typedef void (*RedisModuleForkDoneHandler) (int exitcode, int bysignal, void *user_data);
180typedef void (*RedisModuleTypeFreeFunc)(void *value);
181typedef void (*RedisModuleClusterMessageReceiver)(RedisModuleCtx *ctx, const char *sender_id,
182 uint8_t type, const unsigned char *payload, uint32_t len);
183typedef void (*RedisModuleTimerProc)(RedisModuleCtx *ctx, void *data);
184typedef void (*RedisModuleCommandFilterFunc)(RedisModuleCommandFilterCtx *filter);
185
186#define REDISMODULE_TYPE_METHOD_VERSION 2
187typedef struct RedisModuleTypeMethods {
188 uint64_t version;
189 RedisModuleTypeLoadFunc rdb_load;
190 RedisModuleTypeSaveFunc rdb_save;
191 RedisModuleTypeRewriteFunc aof_rewrite;
192 RedisModuleTypeMemUsageFunc mem_usage;
193 RedisModuleTypeDigestFunc digest;
194 RedisModuleTypeFreeFunc free;
195 RedisModuleTypeAuxLoadFunc aux_load;
196 RedisModuleTypeAuxSaveFunc aux_save;
197 int aux_save_triggers;
198} RedisModuleTypeMethods;
199
200#define REDISMODULE_GET_API(name) \
201 RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))
202
203#define REDISMODULE_API_FUNC(x) (*x)
204
205
206void *REDISMODULE_API_FUNC(RedisModule_Alloc)(size_t bytes);
207void *REDISMODULE_API_FUNC(RedisModule_Realloc)(void *ptr, size_t bytes);
208void REDISMODULE_API_FUNC(RedisModule_Free)(void *ptr);
209void *REDISMODULE_API_FUNC(RedisModule_Calloc)(size_t nmemb, size_t size);
210char *REDISMODULE_API_FUNC(RedisModule_Strdup)(const char *str);
211int REDISMODULE_API_FUNC(RedisModule_GetApi)(const char *, void *);
212int REDISMODULE_API_FUNC(RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char *name,
213 RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep);
214void REDISMODULE_API_FUNC(RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name,
215 int ver, int apiver);
216int REDISMODULE_API_FUNC(RedisModule_IsModuleNameBusy)(const char *name);
217int REDISMODULE_API_FUNC(RedisModule_WrongArity)(RedisModuleCtx *ctx);
218int REDISMODULE_API_FUNC(RedisModule_ReplyWithLongLong)(RedisModuleCtx *ctx, long long ll);
219int REDISMODULE_API_FUNC(RedisModule_GetSelectedDb)(RedisModuleCtx *ctx);
220int REDISMODULE_API_FUNC(RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid);
221void *REDISMODULE_API_FUNC(RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname,
222 int mode);
223void REDISMODULE_API_FUNC(RedisModule_CloseKey)(RedisModuleKey *kp);
224int REDISMODULE_API_FUNC(RedisModule_KeyType)(RedisModuleKey *kp);
225size_t REDISMODULE_API_FUNC(RedisModule_ValueLength)(RedisModuleKey *kp);
226int REDISMODULE_API_FUNC(RedisModule_ListPush)(RedisModuleKey *kp, int where,
227 RedisModuleString *ele);
228RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ListPop)(RedisModuleKey *key, int where);
229RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_Call)(RedisModuleCtx *ctx,
230 const char *cmdname, const char *fmt, ...);
231const char *REDISMODULE_API_FUNC(RedisModule_CallReplyProto)(RedisModuleCallReply *reply,
232 size_t *len);
233void REDISMODULE_API_FUNC(RedisModule_FreeCallReply)(RedisModuleCallReply *reply);
234int REDISMODULE_API_FUNC(RedisModule_CallReplyType)(RedisModuleCallReply *reply);
235long long REDISMODULE_API_FUNC(RedisModule_CallReplyInteger)(RedisModuleCallReply *reply);
236size_t REDISMODULE_API_FUNC(RedisModule_CallReplyLength)(RedisModuleCallReply *reply);
237RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_CallReplyArrayElement)(
238 RedisModuleCallReply *reply, size_t idx);
239RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateString)(RedisModuleCtx *ctx,
240 const char *ptr, size_t len);
241RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx,
242 long long ll);
243RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx,
244 const RedisModuleString *str);
245RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx,
246 const char *fmt, ...);
247void REDISMODULE_API_FUNC(RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str);
248const char *REDISMODULE_API_FUNC(RedisModule_StringPtrLen)(const RedisModuleString *str,
249 size_t *len);
250int REDISMODULE_API_FUNC(RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err);
251int REDISMODULE_API_FUNC(RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg);
252int REDISMODULE_API_FUNC(RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, long len);
253void REDISMODULE_API_FUNC(RedisModule_ReplySetArrayLength)(RedisModuleCtx *ctx, long len);
254int REDISMODULE_API_FUNC(RedisModule_ReplyWithStringBuffer)(RedisModuleCtx *ctx, const char *buf,
255 size_t len);
256int REDISMODULE_API_FUNC(RedisModule_ReplyWithCString)(RedisModuleCtx *ctx, const char *buf);
257int REDISMODULE_API_FUNC(RedisModule_ReplyWithString)(RedisModuleCtx *ctx, RedisModuleString *str);
258int REDISMODULE_API_FUNC(RedisModule_ReplyWithNull)(RedisModuleCtx *ctx);
259int REDISMODULE_API_FUNC(RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, double d);
260int REDISMODULE_API_FUNC(RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx,
261 RedisModuleCallReply *reply);
262int REDISMODULE_API_FUNC(RedisModule_StringToLongLong)(const RedisModuleString *str, long long *ll);
263int REDISMODULE_API_FUNC(RedisModule_StringToDouble)(const RedisModuleString *str, double *d);
264void REDISMODULE_API_FUNC(RedisModule_AutoMemory)(RedisModuleCtx *ctx);
265int REDISMODULE_API_FUNC(RedisModule_Replicate)(RedisModuleCtx *ctx, const char *cmdname,
266 const char *fmt, ...);
267int REDISMODULE_API_FUNC(RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx);
268const char *REDISMODULE_API_FUNC(RedisModule_CallReplyStringPtr)(RedisModuleCallReply *reply,
269 size_t *len);
270RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromCallReply)(
271 RedisModuleCallReply *reply);
272int REDISMODULE_API_FUNC(RedisModule_DeleteKey)(RedisModuleKey *key);
273int REDISMODULE_API_FUNC(RedisModule_UnlinkKey)(RedisModuleKey *key);
274int REDISMODULE_API_FUNC(RedisModule_StringSet)(RedisModuleKey *key, RedisModuleString *str);
275char *REDISMODULE_API_FUNC(RedisModule_StringDMA)(RedisModuleKey *key, size_t *len, int mode);
276int REDISMODULE_API_FUNC(RedisModule_StringTruncate)(RedisModuleKey *key, size_t newlen);
277mstime_t REDISMODULE_API_FUNC(RedisModule_GetExpire)(RedisModuleKey *key);
278int REDISMODULE_API_FUNC(RedisModule_SetExpire)(RedisModuleKey *key, mstime_t expire);
279int REDISMODULE_API_FUNC(RedisModule_ZsetAdd)(RedisModuleKey *key, double score,
280 RedisModuleString *ele, int *flagsptr);
281int REDISMODULE_API_FUNC(RedisModule_ZsetIncrby)(RedisModuleKey *key, double score,
282 RedisModuleString *ele, int *flagsptr, double *newscore);
283int REDISMODULE_API_FUNC(RedisModule_ZsetScore)(RedisModuleKey *key, RedisModuleString *ele,
284 double *score);
285int REDISMODULE_API_FUNC(RedisModule_ZsetRem)(RedisModuleKey *key, RedisModuleString *ele,
286 int *deleted);
287void REDISMODULE_API_FUNC(RedisModule_ZsetRangeStop)(RedisModuleKey *key);
288int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInScoreRange)(RedisModuleKey *key, double min,
289 double max, int minex, int maxex);
290int REDISMODULE_API_FUNC(RedisModule_ZsetLastInScoreRange)(RedisModuleKey *key, double min,
291 double max, int minex, int maxex);
292int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInLexRange)(RedisModuleKey *key,
293 RedisModuleString *min, RedisModuleString *max);
294int REDISMODULE_API_FUNC(RedisModule_ZsetLastInLexRange)(RedisModuleKey *key,
295 RedisModuleString *min, RedisModuleString *max);
296RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ZsetRangeCurrentElement)(RedisModuleKey *key,
297 double *score);
298int REDISMODULE_API_FUNC(RedisModule_ZsetRangeNext)(RedisModuleKey *key);
299int REDISMODULE_API_FUNC(RedisModule_ZsetRangePrev)(RedisModuleKey *key);
300int REDISMODULE_API_FUNC(RedisModule_ZsetRangeEndReached)(RedisModuleKey *key);
301int REDISMODULE_API_FUNC(RedisModule_HashSet)(RedisModuleKey *key, int flags, ...);
302int REDISMODULE_API_FUNC(RedisModule_HashGet)(RedisModuleKey *key, int flags, ...);
303int REDISMODULE_API_FUNC(RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx);
304void REDISMODULE_API_FUNC(RedisModule_KeyAtPos)(RedisModuleCtx *ctx, int pos);
305unsigned long long REDISMODULE_API_FUNC(RedisModule_GetClientId)(RedisModuleCtx *ctx);
306int REDISMODULE_API_FUNC(RedisModule_GetContextFlags)(RedisModuleCtx *ctx);
307void *REDISMODULE_API_FUNC(RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes);
308RedisModuleType *REDISMODULE_API_FUNC(RedisModule_CreateDataType)(RedisModuleCtx *ctx,
309 const char *name, int encver, RedisModuleTypeMethods *typemethods);
310int REDISMODULE_API_FUNC(RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt,
311 void *value);
312RedisModuleType *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetType)(RedisModuleKey *key);
313void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetValue)(RedisModuleKey *key);
314void REDISMODULE_API_FUNC(RedisModule_SaveUnsigned)(RedisModuleIO *io, uint64_t value);
315uint64_t REDISMODULE_API_FUNC(RedisModule_LoadUnsigned)(RedisModuleIO *io);
316void REDISMODULE_API_FUNC(RedisModule_SaveSigned)(RedisModuleIO *io, int64_t value);
317int64_t REDISMODULE_API_FUNC(RedisModule_LoadSigned)(RedisModuleIO *io);
318void REDISMODULE_API_FUNC(RedisModule_EmitAOF)(RedisModuleIO *io, const char *cmdname,
319 const char *fmt, ...);
320void REDISMODULE_API_FUNC(RedisModule_SaveString)(RedisModuleIO *io, RedisModuleString *s);
321void REDISMODULE_API_FUNC(RedisModule_SaveStringBuffer)(RedisModuleIO *io, const char *str,
322 size_t len);
323RedisModuleString *REDISMODULE_API_FUNC(RedisModule_LoadString)(RedisModuleIO *io);
324char *REDISMODULE_API_FUNC(RedisModule_LoadStringBuffer)(RedisModuleIO *io, size_t *lenptr);
325void REDISMODULE_API_FUNC(RedisModule_SaveDouble)(RedisModuleIO *io, double value);
326double REDISMODULE_API_FUNC(RedisModule_LoadDouble)(RedisModuleIO *io);
327void REDISMODULE_API_FUNC(RedisModule_SaveFloat)(RedisModuleIO *io, float value);
328float REDISMODULE_API_FUNC(RedisModule_LoadFloat)(RedisModuleIO *io);
329void REDISMODULE_API_FUNC(RedisModule_Log)(RedisModuleCtx *ctx, const char *level, const char *fmt,
330 ...);
331void REDISMODULE_API_FUNC(RedisModule_LogIOError)(RedisModuleIO *io, const char *levelstr,
332 const char *fmt, ...);
333int REDISMODULE_API_FUNC(RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx,
334 RedisModuleString *str, const char *buf, size_t len);
335void REDISMODULE_API_FUNC(RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str);
336int REDISMODULE_API_FUNC(RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b);
337RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetContextFromIO)(RedisModuleIO *io);
338const RedisModuleString *REDISMODULE_API_FUNC(RedisModule_GetKeyNameFromIO)(RedisModuleIO *io);
339long long REDISMODULE_API_FUNC(RedisModule_Milliseconds)(void);
340void REDISMODULE_API_FUNC(RedisModule_DigestAddStringBuffer)(RedisModuleDigest *md,
341 unsigned char *ele, size_t len);
342void REDISMODULE_API_FUNC(RedisModule_DigestAddLongLong)(RedisModuleDigest *md, long long ele);
343void REDISMODULE_API_FUNC(RedisModule_DigestEndSequence)(RedisModuleDigest *md);
344RedisModuleDict *REDISMODULE_API_FUNC(RedisModule_CreateDict)(RedisModuleCtx *ctx);
345void REDISMODULE_API_FUNC(RedisModule_FreeDict)(RedisModuleCtx *ctx, RedisModuleDict *d);
346uint64_t REDISMODULE_API_FUNC(RedisModule_DictSize)(RedisModuleDict *d);
347int REDISMODULE_API_FUNC(RedisModule_DictSetC)(RedisModuleDict *d, void *key, size_t keylen,
348 void *ptr);
349int REDISMODULE_API_FUNC(RedisModule_DictReplaceC)(RedisModuleDict *d, void *key, size_t keylen,
350 void *ptr);
351int REDISMODULE_API_FUNC(RedisModule_DictSet)(RedisModuleDict *d, RedisModuleString *key,
352 void *ptr);
353int REDISMODULE_API_FUNC(RedisModule_DictReplace)(RedisModuleDict *d, RedisModuleString *key,
354 void *ptr);
355void *REDISMODULE_API_FUNC(RedisModule_DictGetC)(RedisModuleDict *d, void *key, size_t keylen,
356 int *nokey);
357void *REDISMODULE_API_FUNC(RedisModule_DictGet)(RedisModuleDict *d, RedisModuleString *key,
358 int *nokey);
359int REDISMODULE_API_FUNC(RedisModule_DictDelC)(RedisModuleDict *d, void *key, size_t keylen,
360 void *oldval);
361int REDISMODULE_API_FUNC(RedisModule_DictDel)(RedisModuleDict *d, RedisModuleString *key,
362 void *oldval);
363RedisModuleDictIter *REDISMODULE_API_FUNC(RedisModule_DictIteratorStartC)(RedisModuleDict *d,
364 const char *op, void *key, size_t keylen);
365RedisModuleDictIter *REDISMODULE_API_FUNC(RedisModule_DictIteratorStart)(RedisModuleDict *d,
366 const char *op, RedisModuleString *key);
367void REDISMODULE_API_FUNC(RedisModule_DictIteratorStop)(RedisModuleDictIter *di);
368int REDISMODULE_API_FUNC(RedisModule_DictIteratorReseekC)(RedisModuleDictIter *di, const char *op,
369 void *key, size_t keylen);
370int REDISMODULE_API_FUNC(RedisModule_DictIteratorReseek)(RedisModuleDictIter *di, const char *op,
371 RedisModuleString *key);
372void *REDISMODULE_API_FUNC(RedisModule_DictNextC)(RedisModuleDictIter *di, size_t *keylen,
373 void **dataptr);
374void *REDISMODULE_API_FUNC(RedisModule_DictPrevC)(RedisModuleDictIter *di, size_t *keylen,
375 void **dataptr);
376RedisModuleString *REDISMODULE_API_FUNC(RedisModule_DictNext)(RedisModuleCtx *ctx,
377 RedisModuleDictIter *di, void **dataptr);
378RedisModuleString *REDISMODULE_API_FUNC(RedisModule_DictPrev)(RedisModuleCtx *ctx,
379 RedisModuleDictIter *di, void **dataptr);
380int REDISMODULE_API_FUNC(RedisModule_DictCompareC)(RedisModuleDictIter *di, const char *op,
381 void *key, size_t keylen);
382int REDISMODULE_API_FUNC(RedisModule_DictCompare)(RedisModuleDictIter *di, const char *op,
383 RedisModuleString *key);
384
385// Required by RediSearch.
386int REDISMODULE_API_FUNC(RedisModule_AvoidReplicaTraffic)(void);
387
388/* Experimental APIs */
389#ifdef REDISMODULE_EXPERIMENTAL_API
390#define REDISMODULE_EXPERIMENTAL_API_VERSION 3
391RedisModuleBlockedClient *REDISMODULE_API_FUNC(RedisModule_BlockClient)(RedisModuleCtx *ctx,
392 RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback,
393 void (*free_privdata)(RedisModuleCtx *, void *), long long timeout_ms);
394int REDISMODULE_API_FUNC(RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata);
395int REDISMODULE_API_FUNC(RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx);
396int REDISMODULE_API_FUNC(RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx);
397void *REDISMODULE_API_FUNC(RedisModule_GetBlockedClientPrivateData)(RedisModuleCtx *ctx);
398RedisModuleBlockedClient *REDISMODULE_API_FUNC(RedisModule_GetBlockedClientHandle)(
399 RedisModuleCtx *ctx);
400int REDISMODULE_API_FUNC(RedisModule_AbortBlock)(RedisModuleBlockedClient *bc);
401RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetThreadSafeContext)(
402 RedisModuleBlockedClient *bc);
403void REDISMODULE_API_FUNC(RedisModule_FreeThreadSafeContext)(RedisModuleCtx *ctx);
404void REDISMODULE_API_FUNC(RedisModule_ThreadSafeContextLock)(RedisModuleCtx *ctx);
405void REDISMODULE_API_FUNC(RedisModule_ThreadSafeContextUnlock)(RedisModuleCtx *ctx);
406int REDISMODULE_API_FUNC(RedisModule_SubscribeToKeyspaceEvents)(RedisModuleCtx *ctx, int types,
407 RedisModuleNotificationFunc cb);
408int REDISMODULE_API_FUNC(RedisModule_BlockedClientDisconnected)(RedisModuleCtx *ctx);
409void REDISMODULE_API_FUNC(RedisModule_RegisterClusterMessageReceiver)(RedisModuleCtx *ctx,
410 uint8_t type, RedisModuleClusterMessageReceiver callback);
411int REDISMODULE_API_FUNC(RedisModule_SendClusterMessage)(RedisModuleCtx *ctx, char *target_id,
412 uint8_t type, unsigned char *msg, uint32_t len);
413int REDISMODULE_API_FUNC(RedisModule_GetClusterNodeInfo)(RedisModuleCtx *ctx, const char *id,
414 char *ip, char *master_id, int *port, int *flags);
415char **REDISMODULE_API_FUNC(RedisModule_GetClusterNodesList)(RedisModuleCtx *ctx, size_t *numnodes);
416void REDISMODULE_API_FUNC(RedisModule_FreeClusterNodesList)(char **ids);
417RedisModuleTimerID REDISMODULE_API_FUNC(RedisModule_CreateTimer)(RedisModuleCtx *ctx,
418 mstime_t period, RedisModuleTimerProc callback, void *data);
419int REDISMODULE_API_FUNC(RedisModule_StopTimer)(RedisModuleCtx *ctx, RedisModuleTimerID id,
420 void **data);
421int REDISMODULE_API_FUNC(RedisModule_GetTimerInfo)(RedisModuleCtx *ctx, RedisModuleTimerID id,
422 uint64_t *remaining, void **data);
423const char *REDISMODULE_API_FUNC(RedisModule_GetMyClusterID)(void);
424size_t REDISMODULE_API_FUNC(RedisModule_GetClusterSize)(void);
425void REDISMODULE_API_FUNC(RedisModule_GetRandomBytes)(unsigned char *dst, size_t len);
426void REDISMODULE_API_FUNC(RedisModule_GetRandomHexChars)(char *dst, size_t len);
427void REDISMODULE_API_FUNC(RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc,
428 RedisModuleDisconnectFunc callback);
429void REDISMODULE_API_FUNC(RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags);
430int REDISMODULE_API_FUNC(RedisModule_ExportSharedAPI)(RedisModuleCtx *ctx, const char *apiname,
431 void *func);
432void *REDISMODULE_API_FUNC(RedisModule_GetSharedAPI)(RedisModuleCtx *ctx, const char *apiname);
433RedisModuleCommandFilter *REDISMODULE_API_FUNC(RedisModule_RegisterCommandFilter)(
434 RedisModuleCtx *ctx, RedisModuleCommandFilterFunc cb, int flags);
435int REDISMODULE_API_FUNC(RedisModule_UnregisterCommandFilter)(RedisModuleCtx *ctx,
436 RedisModuleCommandFilter *filter);
437int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgsCount)(RedisModuleCommandFilterCtx *fctx);
438const RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CommandFilterArgGet)(
439 RedisModuleCommandFilterCtx *fctx, int pos);
440int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgInsert)(RedisModuleCommandFilterCtx *fctx,
441 int pos, RedisModuleString *arg);
442int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgReplace)(RedisModuleCommandFilterCtx *fctx,
443 int pos, RedisModuleString *arg);
444int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgDelete)(RedisModuleCommandFilterCtx *fctx,
445 int pos);
446#endif
447
448/* Enterprise Only API */
449int REDISMODULE_API_FUNC(RedisModule_Fork)(RedisModuleForkDoneHandler cb, void *user_data);
450int REDISMODULE_API_FUNC(RedisModule_ExitFromChild)(int retcode);
451int REDISMODULE_API_FUNC(RedisModule_KillForkChild)(int child_pid);
452
453/* This is included inline inside each Redis module. */
454static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver,
455 int apiver) __attribute__((unused));
456static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
457 void *getapifuncptr = ((void **)ctx)[0];
458 RedisModule_GetApi = (int (*)(const char *, void *))(unsigned long)getapifuncptr;
459 REDISMODULE_GET_API(Alloc);
460 REDISMODULE_GET_API(Calloc);
461 REDISMODULE_GET_API(Free);
462 REDISMODULE_GET_API(Realloc);
463 REDISMODULE_GET_API(Strdup);
464 REDISMODULE_GET_API(CreateCommand);
465 REDISMODULE_GET_API(SetModuleAttribs);
466 REDISMODULE_GET_API(IsModuleNameBusy);
467 REDISMODULE_GET_API(WrongArity);
468 REDISMODULE_GET_API(ReplyWithLongLong);
469 REDISMODULE_GET_API(ReplyWithError);
470 REDISMODULE_GET_API(ReplyWithSimpleString);
471 REDISMODULE_GET_API(ReplyWithArray);
472 REDISMODULE_GET_API(ReplySetArrayLength);
473 REDISMODULE_GET_API(ReplyWithStringBuffer);
474 REDISMODULE_GET_API(ReplyWithCString);
475 REDISMODULE_GET_API(ReplyWithString);
476 REDISMODULE_GET_API(ReplyWithNull);
477 REDISMODULE_GET_API(ReplyWithCallReply);
478 REDISMODULE_GET_API(ReplyWithDouble);
479 REDISMODULE_GET_API(ReplySetArrayLength);
480 REDISMODULE_GET_API(GetSelectedDb);
481 REDISMODULE_GET_API(SelectDb);
482 REDISMODULE_GET_API(OpenKey);
483 REDISMODULE_GET_API(CloseKey);
484 REDISMODULE_GET_API(KeyType);
485 REDISMODULE_GET_API(ValueLength);
486 REDISMODULE_GET_API(ListPush);
487 REDISMODULE_GET_API(ListPop);
488 REDISMODULE_GET_API(StringToLongLong);
489 REDISMODULE_GET_API(StringToDouble);
490 REDISMODULE_GET_API(Call);
491 REDISMODULE_GET_API(CallReplyProto);
492 REDISMODULE_GET_API(FreeCallReply);
493 REDISMODULE_GET_API(CallReplyInteger);
494 REDISMODULE_GET_API(CallReplyType);
495 REDISMODULE_GET_API(CallReplyLength);
496 REDISMODULE_GET_API(CallReplyArrayElement);
497 REDISMODULE_GET_API(CallReplyStringPtr);
498 REDISMODULE_GET_API(CreateStringFromCallReply);
499 REDISMODULE_GET_API(CreateString);
500 REDISMODULE_GET_API(CreateStringFromLongLong);
501 REDISMODULE_GET_API(CreateStringFromString);
502 REDISMODULE_GET_API(CreateStringPrintf);
503 REDISMODULE_GET_API(FreeString);
504 REDISMODULE_GET_API(StringPtrLen);
505 REDISMODULE_GET_API(AutoMemory);
506 REDISMODULE_GET_API(Replicate);
507 REDISMODULE_GET_API(ReplicateVerbatim);
508 REDISMODULE_GET_API(DeleteKey);
509 REDISMODULE_GET_API(UnlinkKey);
510 REDISMODULE_GET_API(StringSet);
511 REDISMODULE_GET_API(StringDMA);
512 REDISMODULE_GET_API(StringTruncate);
513 REDISMODULE_GET_API(GetExpire);
514 REDISMODULE_GET_API(SetExpire);
515 REDISMODULE_GET_API(ZsetAdd);
516 REDISMODULE_GET_API(ZsetIncrby);
517 REDISMODULE_GET_API(ZsetScore);
518 REDISMODULE_GET_API(ZsetRem);
519 REDISMODULE_GET_API(ZsetRangeStop);
520 REDISMODULE_GET_API(ZsetFirstInScoreRange);
521 REDISMODULE_GET_API(ZsetLastInScoreRange);
522 REDISMODULE_GET_API(ZsetFirstInLexRange);
523 REDISMODULE_GET_API(ZsetLastInLexRange);
524 REDISMODULE_GET_API(ZsetRangeCurrentElement);
525 REDISMODULE_GET_API(ZsetRangeNext);
526 REDISMODULE_GET_API(ZsetRangePrev);
527 REDISMODULE_GET_API(ZsetRangeEndReached);
528 REDISMODULE_GET_API(HashSet);
529 REDISMODULE_GET_API(HashGet);
530 REDISMODULE_GET_API(IsKeysPositionRequest);
531 REDISMODULE_GET_API(KeyAtPos);
532 REDISMODULE_GET_API(GetClientId);
533 REDISMODULE_GET_API(GetContextFlags);
534 REDISMODULE_GET_API(PoolAlloc);
535 REDISMODULE_GET_API(CreateDataType);
536 REDISMODULE_GET_API(ModuleTypeSetValue);
537 REDISMODULE_GET_API(ModuleTypeGetType);
538 REDISMODULE_GET_API(ModuleTypeGetValue);
539 REDISMODULE_GET_API(SaveUnsigned);
540 REDISMODULE_GET_API(LoadUnsigned);
541 REDISMODULE_GET_API(SaveSigned);
542 REDISMODULE_GET_API(LoadSigned);
543 REDISMODULE_GET_API(SaveString);
544 REDISMODULE_GET_API(SaveStringBuffer);
545 REDISMODULE_GET_API(LoadString);
546 REDISMODULE_GET_API(LoadStringBuffer);
547 REDISMODULE_GET_API(SaveDouble);
548 REDISMODULE_GET_API(LoadDouble);
549 REDISMODULE_GET_API(SaveFloat);
550 REDISMODULE_GET_API(LoadFloat);
551 REDISMODULE_GET_API(EmitAOF);
552 REDISMODULE_GET_API(Log);
553 REDISMODULE_GET_API(LogIOError);
554 REDISMODULE_GET_API(StringAppendBuffer);
555 REDISMODULE_GET_API(RetainString);
556 REDISMODULE_GET_API(StringCompare);
557 REDISMODULE_GET_API(GetContextFromIO);
558 REDISMODULE_GET_API(GetKeyNameFromIO);
559 REDISMODULE_GET_API(Milliseconds);
560 REDISMODULE_GET_API(DigestAddStringBuffer);
561 REDISMODULE_GET_API(DigestAddLongLong);
562 REDISMODULE_GET_API(DigestEndSequence);
563 REDISMODULE_GET_API(CreateDict);
564 REDISMODULE_GET_API(FreeDict);
565 REDISMODULE_GET_API(DictSize);
566 REDISMODULE_GET_API(DictSetC);
567 REDISMODULE_GET_API(DictReplaceC);
568 REDISMODULE_GET_API(DictSet);
569 REDISMODULE_GET_API(DictReplace);
570 REDISMODULE_GET_API(DictGetC);
571 REDISMODULE_GET_API(DictGet);
572 REDISMODULE_GET_API(DictDelC);
573 REDISMODULE_GET_API(DictDel);
574 REDISMODULE_GET_API(DictIteratorStartC);
575 REDISMODULE_GET_API(DictIteratorStart);
576 REDISMODULE_GET_API(DictIteratorStop);
577 REDISMODULE_GET_API(DictIteratorReseekC);
578 REDISMODULE_GET_API(DictIteratorReseek);
579 REDISMODULE_GET_API(DictNextC);
580 REDISMODULE_GET_API(DictPrevC);
581 REDISMODULE_GET_API(DictNext);
582 REDISMODULE_GET_API(DictPrev);
583 REDISMODULE_GET_API(DictCompare);
584 REDISMODULE_GET_API(DictCompareC);
585
586#ifdef REDISMODULE_EXPERIMENTAL_API
587 REDISMODULE_GET_API(GetThreadSafeContext);
588 REDISMODULE_GET_API(FreeThreadSafeContext);
589 REDISMODULE_GET_API(ThreadSafeContextLock);
590 REDISMODULE_GET_API(ThreadSafeContextUnlock);
591 REDISMODULE_GET_API(BlockClient);
592 REDISMODULE_GET_API(UnblockClient);
593 REDISMODULE_GET_API(IsBlockedReplyRequest);
594 REDISMODULE_GET_API(IsBlockedTimeoutRequest);
595 REDISMODULE_GET_API(GetBlockedClientPrivateData);
596 REDISMODULE_GET_API(GetBlockedClientHandle);
597 REDISMODULE_GET_API(AbortBlock);
598 REDISMODULE_GET_API(SetDisconnectCallback);
599 REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
600 REDISMODULE_GET_API(BlockedClientDisconnected);
601 REDISMODULE_GET_API(RegisterClusterMessageReceiver);
602 REDISMODULE_GET_API(SendClusterMessage);
603 REDISMODULE_GET_API(GetClusterNodeInfo);
604 REDISMODULE_GET_API(GetClusterNodesList);
605 REDISMODULE_GET_API(FreeClusterNodesList);
606 REDISMODULE_GET_API(CreateTimer);
607 REDISMODULE_GET_API(StopTimer);
608 REDISMODULE_GET_API(GetTimerInfo);
609 REDISMODULE_GET_API(GetMyClusterID);
610 REDISMODULE_GET_API(GetClusterSize);
611 REDISMODULE_GET_API(GetRandomBytes);
612 REDISMODULE_GET_API(GetRandomHexChars);
613 REDISMODULE_GET_API(SetClusterFlags);
614 REDISMODULE_GET_API(ExportSharedAPI);
615 REDISMODULE_GET_API(GetSharedAPI);
616 REDISMODULE_GET_API(RegisterCommandFilter);
617 REDISMODULE_GET_API(UnregisterCommandFilter);
618 REDISMODULE_GET_API(CommandFilterArgsCount);
619 REDISMODULE_GET_API(CommandFilterArgGet);
620 REDISMODULE_GET_API(CommandFilterArgInsert);
621 REDISMODULE_GET_API(CommandFilterArgReplace);
622 REDISMODULE_GET_API(CommandFilterArgDelete);
623#endif
624
625 if(RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR;
626 RedisModule_SetModuleAttribs(ctx, name, ver, apiver);
627 return REDISMODULE_OK;
628}
629
630#else
631
632/* Things only defined for the modules core, not exported to modules
633 * including this file. */
634#define RedisModuleString robj
635
636#endif /* REDISMODULE_CORE */
637#endif /* REDISMOUDLE_H */