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
91
92 #define REDISMODULE_NOTIFY_GENERIC (1<<2) /* g */
93 #define REDISMODULE_NOTIFY_STRING (1<<3) /* $ */
94 #define REDISMODULE_NOTIFY_LIST (1<<4) /* l */
95 #define REDISMODULE_NOTIFY_SET (1<<5) /* s */
96 #define REDISMODULE_NOTIFY_HASH (1<<6) /* h */
97 #define REDISMODULE_NOTIFY_ZSET (1<<7) /* z */
98 #define REDISMODULE_NOTIFY_EXPIRED (1<<8) /* x */
99 #define REDISMODULE_NOTIFY_EVICTED (1<<9) /* e */
100 #define REDISMODULE_NOTIFY_STREAM (1<<10) /* t */
101 #define REDISMODULE_NOTIFY_ALL (REDISMODULE_NOTIFY_GENERIC | REDISMODULE_NOTIFY_STRING | REDISMODULE_NOTIFY_LIST | REDISMODULE_NOTIFY_SET | REDISMODULE_NOTIFY_HASH | REDISMODULE_NOTIFY_ZSET | REDISMODULE_NOTIFY_EXPIRED | REDISMODULE_NOTIFY_EVICTED | REDISMODULE_NOTIFY_STREAM) /* A */
102
103
104 /* A special pointer that we can use between the core and the module to signal
105 * field deletion, and that is impossible to be a valid pointer. */
106 #define REDISMODULE_HASH_DELETE ((RedisModuleString*)(long)1)
107
108 /* Error messages. */
109 #define REDISMODULE_ERRORMSG_WRONGTYPE "WRONGTYPE Operation against a key holding the wrong kind of value"
110
111 #define REDISMODULE_POSITIVE_INFINITE (1.0/0.0)
112 #define REDISMODULE_NEGATIVE_INFINITE (-1.0/0.0)
113
114 /* Cluster API defines. */
115 #define REDISMODULE_NODE_ID_LEN 40
116 #define REDISMODULE_NODE_MYSELF (1<<0)
117 #define REDISMODULE_NODE_MASTER (1<<1)
118 #define REDISMODULE_NODE_SLAVE (1<<2)
119 #define REDISMODULE_NODE_PFAIL (1<<3)
120 #define REDISMODULE_NODE_FAIL (1<<4)
121 #define REDISMODULE_NODE_NOFAILOVER (1<<5)
122
123 #define REDISMODULE_CLUSTER_FLAG_NONE 0
124 #define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1)
125 #define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2)
126
127 #define REDISMODULE_NOT_USED(V) ((void) V)
128
129 /* This type represents a timer handle, and is returned when a timer is
130 * registered and used in order to invalidate a timer. It's just a 64 bit
131 * number, because this is how each timer is represented inside the radix tree
132 * of timers that are going to expire, sorted by expire time. */
133 typedef uint64_t RedisModuleTimerID;
134
135 /* CommandFilter Flags */
136
137 /* Do filter RedisModule_Call() commands initiated by module itself. */
138 #define REDISMODULE_CMDFILTER_NOSELF (1<<0)
139
140 /* ------------------------- End of common defines ------------------------ */
141
142 #ifndef REDISMODULE_CORE
143
144 typedef long long mstime_t;
145
146 /* Incomplete structures for compiler checks but opaque access. */
147 typedef struct RedisModuleCtx RedisModuleCtx;
148 typedef struct RedisModuleKey RedisModuleKey;
149 typedef struct RedisModuleString RedisModuleString;
150 typedef struct RedisModuleCallReply RedisModuleCallReply;
151 typedef struct RedisModuleIO RedisModuleIO;
152 typedef struct RedisModuleType RedisModuleType;
153 typedef struct RedisModuleDigest RedisModuleDigest;
154 typedef struct RedisModuleBlockedClient RedisModuleBlockedClient;
155 typedef struct RedisModuleClusterInfo RedisModuleClusterInfo;
156 typedef struct RedisModuleDict RedisModuleDict;
157 typedef struct RedisModuleDictIter RedisModuleDictIter;
158 typedef struct RedisModuleCommandFilterCtx RedisModuleCommandFilterCtx;
159 typedef struct RedisModuleCommandFilter RedisModuleCommandFilter;
160
161 typedef int (*RedisModuleCmdFunc)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
162 typedef void (*RedisModuleDisconnectFunc)(RedisModuleCtx *ctx, RedisModuleBlockedClient *bc);
163 typedef int (*RedisModuleNotificationFunc)(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key);
164 typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver);
165 typedef void (*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value);
166 typedef void (*RedisModuleTypeRewriteFunc)(RedisModuleIO *aof, RedisModuleString *key, void *value);
167 typedef size_t (*RedisModuleTypeMemUsageFunc)(const void *value);
168 typedef void (*RedisModuleTypeDigestFunc)(RedisModuleDigest *digest, void *value);
169 typedef void (*RedisModuleTypeFreeFunc)(void *value);
170 typedef void (*RedisModuleClusterMessageReceiver)(RedisModuleCtx *ctx, const char *sender_id, uint8_t type, const unsigned char *payload, uint32_t len);
171 typedef void (*RedisModuleTimerProc)(RedisModuleCtx *ctx, void *data);
172 typedef void (*RedisModuleCommandFilterFunc) (RedisModuleCommandFilterCtx *filter);
173
174 #define REDISMODULE_TYPE_METHOD_VERSION 1
175 typedef struct RedisModuleTypeMethods {
176 uint64_t version;
177 RedisModuleTypeLoadFunc rdb_load;
178 RedisModuleTypeSaveFunc rdb_save;
179 RedisModuleTypeRewriteFunc aof_rewrite;
180 RedisModuleTypeMemUsageFunc mem_usage;
181 RedisModuleTypeDigestFunc digest;
182 RedisModuleTypeFreeFunc free;
183 } RedisModuleTypeMethods;
184
185 #define REDISMODULE_GET_API(name) \
186 RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))
187
188 #define REDISMODULE_API_FUNC(x) (*x)
189
190
191 void *REDISMODULE_API_FUNC(RedisModule_Alloc)(size_t bytes);
192 void *REDISMODULE_API_FUNC(RedisModule_Realloc)(void *ptr, size_t bytes);
193 void REDISMODULE_API_FUNC(RedisModule_Free)(void *ptr);
194 void *REDISMODULE_API_FUNC(RedisModule_Calloc)(size_t nmemb, size_t size);
195 char *REDISMODULE_API_FUNC(RedisModule_Strdup)(const char *str);
196 int REDISMODULE_API_FUNC(RedisModule_GetApi)(const char *, void *);
197 int REDISMODULE_API_FUNC(RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep);
198 void REDISMODULE_API_FUNC(RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name, int ver, int apiver);
199 int REDISMODULE_API_FUNC(RedisModule_IsModuleNameBusy)(const char *name);
200 int REDISMODULE_API_FUNC(RedisModule_WrongArity)(RedisModuleCtx *ctx);
201 int REDISMODULE_API_FUNC(RedisModule_ReplyWithLongLong)(RedisModuleCtx *ctx, long long ll);
202 int REDISMODULE_API_FUNC(RedisModule_GetSelectedDb)(RedisModuleCtx *ctx);
203 int REDISMODULE_API_FUNC(RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid);
204 void *REDISMODULE_API_FUNC(RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode);
205 void REDISMODULE_API_FUNC(RedisModule_CloseKey)(RedisModuleKey *kp);
206 int REDISMODULE_API_FUNC(RedisModule_KeyType)(RedisModuleKey *kp);
207 size_t REDISMODULE_API_FUNC(RedisModule_ValueLength)(RedisModuleKey *kp);
208 int REDISMODULE_API_FUNC(RedisModule_ListPush)(RedisModuleKey *kp, int where, RedisModuleString *ele);
209 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ListPop)(RedisModuleKey *key, int where);
210 RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_Call)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...);
211 const char *REDISMODULE_API_FUNC(RedisModule_CallReplyProto)(RedisModuleCallReply *reply, size_t *len);
212 void REDISMODULE_API_FUNC(RedisModule_FreeCallReply)(RedisModuleCallReply *reply);
213 int REDISMODULE_API_FUNC(RedisModule_CallReplyType)(RedisModuleCallReply *reply);
214 long long REDISMODULE_API_FUNC(RedisModule_CallReplyInteger)(RedisModuleCallReply *reply);
215 size_t REDISMODULE_API_FUNC(RedisModule_CallReplyLength)(RedisModuleCallReply *reply);
216 RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx);
217 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len);
218 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, long long ll);
219 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str);
220 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...);
221 void REDISMODULE_API_FUNC(RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str);
222 const char *REDISMODULE_API_FUNC(RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len);
223 int REDISMODULE_API_FUNC(RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err);
224 int REDISMODULE_API_FUNC(RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg);
225 int REDISMODULE_API_FUNC(RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, long len);
226 void REDISMODULE_API_FUNC(RedisModule_ReplySetArrayLength)(RedisModuleCtx *ctx, long len);
227 int REDISMODULE_API_FUNC(RedisModule_ReplyWithStringBuffer)(RedisModuleCtx *ctx, const char *buf, size_t len);
228 int REDISMODULE_API_FUNC(RedisModule_ReplyWithString)(RedisModuleCtx *ctx, RedisModuleString *str);
229 int REDISMODULE_API_FUNC(RedisModule_ReplyWithNull)(RedisModuleCtx *ctx);
230 int REDISMODULE_API_FUNC(RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, double d);
231 int REDISMODULE_API_FUNC(RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx, RedisModuleCallReply *reply);
232 int REDISMODULE_API_FUNC(RedisModule_StringToLongLong)(const RedisModuleString *str, long long *ll);
233 int REDISMODULE_API_FUNC(RedisModule_StringToDouble)(const RedisModuleString *str, double *d);
234 void REDISMODULE_API_FUNC(RedisModule_AutoMemory)(RedisModuleCtx *ctx);
235 int REDISMODULE_API_FUNC(RedisModule_Replicate)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...);
236 int REDISMODULE_API_FUNC(RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx);
237 const char *REDISMODULE_API_FUNC(RedisModule_CallReplyStringPtr)(RedisModuleCallReply *reply, size_t *len);
238 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromCallReply)(RedisModuleCallReply *reply);
239 int REDISMODULE_API_FUNC(RedisModule_DeleteKey)(RedisModuleKey *key);
240 int REDISMODULE_API_FUNC(RedisModule_UnlinkKey)(RedisModuleKey *key);
241 int REDISMODULE_API_FUNC(RedisModule_StringSet)(RedisModuleKey *key, RedisModuleString *str);
242 char *REDISMODULE_API_FUNC(RedisModule_StringDMA)(RedisModuleKey *key, size_t *len, int mode);
243 int REDISMODULE_API_FUNC(RedisModule_StringTruncate)(RedisModuleKey *key, size_t newlen);
244 mstime_t REDISMODULE_API_FUNC(RedisModule_GetExpire)(RedisModuleKey *key);
245 int REDISMODULE_API_FUNC(RedisModule_SetExpire)(RedisModuleKey *key, mstime_t expire);
246 int REDISMODULE_API_FUNC(RedisModule_ZsetAdd)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr);
247 int REDISMODULE_API_FUNC(RedisModule_ZsetIncrby)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr, double *newscore);
248 int REDISMODULE_API_FUNC(RedisModule_ZsetScore)(RedisModuleKey *key, RedisModuleString *ele, double *score);
249 int REDISMODULE_API_FUNC(RedisModule_ZsetRem)(RedisModuleKey *key, RedisModuleString *ele, int *deleted);
250 void REDISMODULE_API_FUNC(RedisModule_ZsetRangeStop)(RedisModuleKey *key);
251 int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex);
252 int REDISMODULE_API_FUNC(RedisModule_ZsetLastInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex);
253 int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max);
254 int REDISMODULE_API_FUNC(RedisModule_ZsetLastInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max);
255 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ZsetRangeCurrentElement)(RedisModuleKey *key, double *score);
256 int REDISMODULE_API_FUNC(RedisModule_ZsetRangeNext)(RedisModuleKey *key);
257 int REDISMODULE_API_FUNC(RedisModule_ZsetRangePrev)(RedisModuleKey *key);
258 int REDISMODULE_API_FUNC(RedisModule_ZsetRangeEndReached)(RedisModuleKey *key);
259 int REDISMODULE_API_FUNC(RedisModule_HashSet)(RedisModuleKey *key, int flags, ...);
260 int REDISMODULE_API_FUNC(RedisModule_HashGet)(RedisModuleKey *key, int flags, ...);
261 int REDISMODULE_API_FUNC(RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx);
262 void REDISMODULE_API_FUNC(RedisModule_KeyAtPos)(RedisModuleCtx *ctx, int pos);
263 unsigned long long REDISMODULE_API_FUNC(RedisModule_GetClientId)(RedisModuleCtx *ctx);
264 int REDISMODULE_API_FUNC(RedisModule_GetContextFlags)(RedisModuleCtx *ctx);
265 void *REDISMODULE_API_FUNC(RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes);
266 RedisModuleType *REDISMODULE_API_FUNC(RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods);
267 int REDISMODULE_API_FUNC(RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value);
268 RedisModuleType *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetType)(RedisModuleKey *key);
269 void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetValue)(RedisModuleKey *key);
270 void REDISMODULE_API_FUNC(RedisModule_SaveUnsigned)(RedisModuleIO *io, uint64_t value);
271 uint64_t REDISMODULE_API_FUNC(RedisModule_LoadUnsigned)(RedisModuleIO *io);
272 void REDISMODULE_API_FUNC(RedisModule_SaveSigned)(RedisModuleIO *io, int64_t value);
273 int64_t REDISMODULE_API_FUNC(RedisModule_LoadSigned)(RedisModuleIO *io);
274 void REDISMODULE_API_FUNC(RedisModule_EmitAOF)(RedisModuleIO *io, const char *cmdname, const char *fmt, ...);
275 void REDISMODULE_API_FUNC(RedisModule_SaveString)(RedisModuleIO *io, RedisModuleString *s);
276 void REDISMODULE_API_FUNC(RedisModule_SaveStringBuffer)(RedisModuleIO *io, const char *str, size_t len);
277 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_LoadString)(RedisModuleIO *io);
278 char *REDISMODULE_API_FUNC(RedisModule_LoadStringBuffer)(RedisModuleIO *io, size_t *lenptr);
279 void REDISMODULE_API_FUNC(RedisModule_SaveDouble)(RedisModuleIO *io, double value);
280 double REDISMODULE_API_FUNC(RedisModule_LoadDouble)(RedisModuleIO *io);
281 void REDISMODULE_API_FUNC(RedisModule_SaveFloat)(RedisModuleIO *io, float value);
282 float REDISMODULE_API_FUNC(RedisModule_LoadFloat)(RedisModuleIO *io);
283 void REDISMODULE_API_FUNC(RedisModule_Log)(RedisModuleCtx *ctx, const char *level, const char *fmt, ...);
284 void REDISMODULE_API_FUNC(RedisModule_LogIOError)(RedisModuleIO *io, const char *levelstr, const char *fmt, ...);
285 int REDISMODULE_API_FUNC(RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, RedisModuleString *str, const char *buf, size_t len);
286 void REDISMODULE_API_FUNC(RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str);
287 int REDISMODULE_API_FUNC(RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b);
288 RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetContextFromIO)(RedisModuleIO *io);
289 const RedisModuleString *REDISMODULE_API_FUNC(RedisModule_GetKeyNameFromIO)(RedisModuleIO *io);
290 long long REDISMODULE_API_FUNC(RedisModule_Milliseconds)(void);
291 void REDISMODULE_API_FUNC(RedisModule_DigestAddStringBuffer)(RedisModuleDigest *md, unsigned char *ele, size_t len);
292 void REDISMODULE_API_FUNC(RedisModule_DigestAddLongLong)(RedisModuleDigest *md, long long ele);
293 void REDISMODULE_API_FUNC(RedisModule_DigestEndSequence)(RedisModuleDigest *md);
294 RedisModuleDict *REDISMODULE_API_FUNC(RedisModule_CreateDict)(RedisModuleCtx *ctx);
295 void REDISMODULE_API_FUNC(RedisModule_FreeDict)(RedisModuleCtx *ctx, RedisModuleDict *d);
296 uint64_t REDISMODULE_API_FUNC(RedisModule_DictSize)(RedisModuleDict *d);
297 int REDISMODULE_API_FUNC(RedisModule_DictSetC)(RedisModuleDict *d, void *key, size_t keylen, void *ptr);
298 int REDISMODULE_API_FUNC(RedisModule_DictReplaceC)(RedisModuleDict *d, void *key, size_t keylen, void *ptr);
299 int REDISMODULE_API_FUNC(RedisModule_DictSet)(RedisModuleDict *d, RedisModuleString *key, void *ptr);
300 int REDISMODULE_API_FUNC(RedisModule_DictReplace)(RedisModuleDict *d, RedisModuleString *key, void *ptr);
301 void *REDISMODULE_API_FUNC(RedisModule_DictGetC)(RedisModuleDict *d, void *key, size_t keylen, int *nokey);
302 void *REDISMODULE_API_FUNC(RedisModule_DictGet)(RedisModuleDict *d, RedisModuleString *key, int *nokey);
303 int REDISMODULE_API_FUNC(RedisModule_DictDelC)(RedisModuleDict *d, void *key, size_t keylen, void *oldval);
304 int REDISMODULE_API_FUNC(RedisModule_DictDel)(RedisModuleDict *d, RedisModuleString *key, void *oldval);
305 RedisModuleDictIter *REDISMODULE_API_FUNC(RedisModule_DictIteratorStartC)(RedisModuleDict *d, const char *op, void *key, size_t keylen);
306 RedisModuleDictIter *REDISMODULE_API_FUNC(RedisModule_DictIteratorStart)(RedisModuleDict *d, const char *op, RedisModuleString *key);
307 void REDISMODULE_API_FUNC(RedisModule_DictIteratorStop)(RedisModuleDictIter *di);
308 int REDISMODULE_API_FUNC(RedisModule_DictIteratorReseekC)(RedisModuleDictIter *di, const char *op, void *key, size_t keylen);
309 int REDISMODULE_API_FUNC(RedisModule_DictIteratorReseek)(RedisModuleDictIter *di, const char *op, RedisModuleString *key);
310 void *REDISMODULE_API_FUNC(RedisModule_DictNextC)(RedisModuleDictIter *di, size_t *keylen, void **dataptr);
311 void *REDISMODULE_API_FUNC(RedisModule_DictPrevC)(RedisModuleDictIter *di, size_t *keylen, void **dataptr);
312 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_DictNext)(RedisModuleCtx *ctx, RedisModuleDictIter *di, void **dataptr);
313 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_DictPrev)(RedisModuleCtx *ctx, RedisModuleDictIter *di, void **dataptr);
314 int REDISMODULE_API_FUNC(RedisModule_DictCompareC)(RedisModuleDictIter *di, const char *op, void *key, size_t keylen);
315 int REDISMODULE_API_FUNC(RedisModule_DictCompare)(RedisModuleDictIter *di, const char *op, RedisModuleString *key);
316
317 /* Experimental APIs */
318 #ifdef REDISMODULE_EXPERIMENTAL_API
319 #define REDISMODULE_EXPERIMENTAL_API_VERSION 3
320 RedisModuleBlockedClient *REDISMODULE_API_FUNC(RedisModule_BlockClient)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(RedisModuleCtx*,void*), long long timeout_ms);
321 int REDISMODULE_API_FUNC(RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata);
322 int REDISMODULE_API_FUNC(RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx);
323 int REDISMODULE_API_FUNC(RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx);
324 void *REDISMODULE_API_FUNC(RedisModule_GetBlockedClientPrivateData)(RedisModuleCtx *ctx);
325 RedisModuleBlockedClient *REDISMODULE_API_FUNC(RedisModule_GetBlockedClientHandle)(RedisModuleCtx *ctx);
326 int REDISMODULE_API_FUNC(RedisModule_AbortBlock)(RedisModuleBlockedClient *bc);
327 RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetThreadSafeContext)(RedisModuleBlockedClient *bc);
328 void REDISMODULE_API_FUNC(RedisModule_FreeThreadSafeContext)(RedisModuleCtx *ctx);
329 void REDISMODULE_API_FUNC(RedisModule_ThreadSafeContextLock)(RedisModuleCtx *ctx);
330 void REDISMODULE_API_FUNC(RedisModule_ThreadSafeContextUnlock)(RedisModuleCtx *ctx);
331 int REDISMODULE_API_FUNC(RedisModule_SubscribeToKeyspaceEvents)(RedisModuleCtx *ctx, int types, RedisModuleNotificationFunc cb);
332 int REDISMODULE_API_FUNC(RedisModule_BlockedClientDisconnected)(RedisModuleCtx *ctx);
333 void REDISMODULE_API_FUNC(RedisModule_RegisterClusterMessageReceiver)(RedisModuleCtx *ctx, uint8_t type, RedisModuleClusterMessageReceiver callback);
334 int REDISMODULE_API_FUNC(RedisModule_SendClusterMessage)(RedisModuleCtx *ctx, char *target_id, uint8_t type, unsigned char *msg, uint32_t len);
335 int REDISMODULE_API_FUNC(RedisModule_GetClusterNodeInfo)(RedisModuleCtx *ctx, const char *id, char *ip, char *master_id, int *port, int *flags);
336 char **REDISMODULE_API_FUNC(RedisModule_GetClusterNodesList)(RedisModuleCtx *ctx, size_t *numnodes);
337 void REDISMODULE_API_FUNC(RedisModule_FreeClusterNodesList)(char **ids);
338 RedisModuleTimerID REDISMODULE_API_FUNC(RedisModule_CreateTimer)(RedisModuleCtx *ctx, mstime_t period, RedisModuleTimerProc callback, void *data);
339 int REDISMODULE_API_FUNC(RedisModule_StopTimer)(RedisModuleCtx *ctx, RedisModuleTimerID id, void **data);
340 int REDISMODULE_API_FUNC(RedisModule_GetTimerInfo)(RedisModuleCtx *ctx, RedisModuleTimerID id, uint64_t *remaining, void **data);
341 const char *REDISMODULE_API_FUNC(RedisModule_GetMyClusterID)(void);
342 size_t REDISMODULE_API_FUNC(RedisModule_GetClusterSize)(void);
343 void REDISMODULE_API_FUNC(RedisModule_GetRandomBytes)(unsigned char *dst, size_t len);
344 void REDISMODULE_API_FUNC(RedisModule_GetRandomHexChars)(char *dst, size_t len);
345 void REDISMODULE_API_FUNC(RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback);
346 void REDISMODULE_API_FUNC(RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags);
347 int REDISMODULE_API_FUNC(RedisModule_ExportSharedAPI)(RedisModuleCtx *ctx, const char *apiname, void *func);
348 void *REDISMODULE_API_FUNC(RedisModule_GetSharedAPI)(RedisModuleCtx *ctx, const char *apiname);
349 RedisModuleCommandFilter *REDISMODULE_API_FUNC(RedisModule_RegisterCommandFilter)(RedisModuleCtx *ctx, RedisModuleCommandFilterFunc cb, int flags);
350 int REDISMODULE_API_FUNC(RedisModule_UnregisterCommandFilter)(RedisModuleCtx *ctx, RedisModuleCommandFilter *filter);
351 int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgsCount)(RedisModuleCommandFilterCtx *fctx);
352 const RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CommandFilterArgGet)(RedisModuleCommandFilterCtx *fctx, int pos);
353 int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgInsert)(RedisModuleCommandFilterCtx *fctx, int pos, RedisModuleString *arg);
354 int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgReplace)(RedisModuleCommandFilterCtx *fctx, int pos, RedisModuleString *arg);
355 int REDISMODULE_API_FUNC(RedisModule_CommandFilterArgDelete)(RedisModuleCommandFilterCtx *fctx, int pos);
356 #endif
357
358 /* This is included inline inside each Redis module. */
359 static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) __attribute__((unused));
RedisModule_Init(RedisModuleCtx * ctx,const char * name,int ver,int apiver)360 static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
361 void *getapifuncptr = ((void**)ctx)[0];
362 RedisModule_GetApi = (int (*)(const char *, void *)) (unsigned long)getapifuncptr;
363 REDISMODULE_GET_API(Alloc);
364 REDISMODULE_GET_API(Calloc);
365 REDISMODULE_GET_API(Free);
366 REDISMODULE_GET_API(Realloc);
367 REDISMODULE_GET_API(Strdup);
368 REDISMODULE_GET_API(CreateCommand);
369 REDISMODULE_GET_API(SetModuleAttribs);
370 REDISMODULE_GET_API(IsModuleNameBusy);
371 REDISMODULE_GET_API(WrongArity);
372 REDISMODULE_GET_API(ReplyWithLongLong);
373 REDISMODULE_GET_API(ReplyWithError);
374 REDISMODULE_GET_API(ReplyWithSimpleString);
375 REDISMODULE_GET_API(ReplyWithArray);
376 REDISMODULE_GET_API(ReplySetArrayLength);
377 REDISMODULE_GET_API(ReplyWithStringBuffer);
378 REDISMODULE_GET_API(ReplyWithString);
379 REDISMODULE_GET_API(ReplyWithNull);
380 REDISMODULE_GET_API(ReplyWithCallReply);
381 REDISMODULE_GET_API(ReplyWithDouble);
382 REDISMODULE_GET_API(ReplySetArrayLength);
383 REDISMODULE_GET_API(GetSelectedDb);
384 REDISMODULE_GET_API(SelectDb);
385 REDISMODULE_GET_API(OpenKey);
386 REDISMODULE_GET_API(CloseKey);
387 REDISMODULE_GET_API(KeyType);
388 REDISMODULE_GET_API(ValueLength);
389 REDISMODULE_GET_API(ListPush);
390 REDISMODULE_GET_API(ListPop);
391 REDISMODULE_GET_API(StringToLongLong);
392 REDISMODULE_GET_API(StringToDouble);
393 REDISMODULE_GET_API(Call);
394 REDISMODULE_GET_API(CallReplyProto);
395 REDISMODULE_GET_API(FreeCallReply);
396 REDISMODULE_GET_API(CallReplyInteger);
397 REDISMODULE_GET_API(CallReplyType);
398 REDISMODULE_GET_API(CallReplyLength);
399 REDISMODULE_GET_API(CallReplyArrayElement);
400 REDISMODULE_GET_API(CallReplyStringPtr);
401 REDISMODULE_GET_API(CreateStringFromCallReply);
402 REDISMODULE_GET_API(CreateString);
403 REDISMODULE_GET_API(CreateStringFromLongLong);
404 REDISMODULE_GET_API(CreateStringFromString);
405 REDISMODULE_GET_API(CreateStringPrintf);
406 REDISMODULE_GET_API(FreeString);
407 REDISMODULE_GET_API(StringPtrLen);
408 REDISMODULE_GET_API(AutoMemory);
409 REDISMODULE_GET_API(Replicate);
410 REDISMODULE_GET_API(ReplicateVerbatim);
411 REDISMODULE_GET_API(DeleteKey);
412 REDISMODULE_GET_API(UnlinkKey);
413 REDISMODULE_GET_API(StringSet);
414 REDISMODULE_GET_API(StringDMA);
415 REDISMODULE_GET_API(StringTruncate);
416 REDISMODULE_GET_API(GetExpire);
417 REDISMODULE_GET_API(SetExpire);
418 REDISMODULE_GET_API(ZsetAdd);
419 REDISMODULE_GET_API(ZsetIncrby);
420 REDISMODULE_GET_API(ZsetScore);
421 REDISMODULE_GET_API(ZsetRem);
422 REDISMODULE_GET_API(ZsetRangeStop);
423 REDISMODULE_GET_API(ZsetFirstInScoreRange);
424 REDISMODULE_GET_API(ZsetLastInScoreRange);
425 REDISMODULE_GET_API(ZsetFirstInLexRange);
426 REDISMODULE_GET_API(ZsetLastInLexRange);
427 REDISMODULE_GET_API(ZsetRangeCurrentElement);
428 REDISMODULE_GET_API(ZsetRangeNext);
429 REDISMODULE_GET_API(ZsetRangePrev);
430 REDISMODULE_GET_API(ZsetRangeEndReached);
431 REDISMODULE_GET_API(HashSet);
432 REDISMODULE_GET_API(HashGet);
433 REDISMODULE_GET_API(IsKeysPositionRequest);
434 REDISMODULE_GET_API(KeyAtPos);
435 REDISMODULE_GET_API(GetClientId);
436 REDISMODULE_GET_API(GetContextFlags);
437 REDISMODULE_GET_API(PoolAlloc);
438 REDISMODULE_GET_API(CreateDataType);
439 REDISMODULE_GET_API(ModuleTypeSetValue);
440 REDISMODULE_GET_API(ModuleTypeGetType);
441 REDISMODULE_GET_API(ModuleTypeGetValue);
442 REDISMODULE_GET_API(SaveUnsigned);
443 REDISMODULE_GET_API(LoadUnsigned);
444 REDISMODULE_GET_API(SaveSigned);
445 REDISMODULE_GET_API(LoadSigned);
446 REDISMODULE_GET_API(SaveString);
447 REDISMODULE_GET_API(SaveStringBuffer);
448 REDISMODULE_GET_API(LoadString);
449 REDISMODULE_GET_API(LoadStringBuffer);
450 REDISMODULE_GET_API(SaveDouble);
451 REDISMODULE_GET_API(LoadDouble);
452 REDISMODULE_GET_API(SaveFloat);
453 REDISMODULE_GET_API(LoadFloat);
454 REDISMODULE_GET_API(EmitAOF);
455 REDISMODULE_GET_API(Log);
456 REDISMODULE_GET_API(LogIOError);
457 REDISMODULE_GET_API(StringAppendBuffer);
458 REDISMODULE_GET_API(RetainString);
459 REDISMODULE_GET_API(StringCompare);
460 REDISMODULE_GET_API(GetContextFromIO);
461 REDISMODULE_GET_API(GetKeyNameFromIO);
462 REDISMODULE_GET_API(Milliseconds);
463 REDISMODULE_GET_API(DigestAddStringBuffer);
464 REDISMODULE_GET_API(DigestAddLongLong);
465 REDISMODULE_GET_API(DigestEndSequence);
466 REDISMODULE_GET_API(CreateDict);
467 REDISMODULE_GET_API(FreeDict);
468 REDISMODULE_GET_API(DictSize);
469 REDISMODULE_GET_API(DictSetC);
470 REDISMODULE_GET_API(DictReplaceC);
471 REDISMODULE_GET_API(DictSet);
472 REDISMODULE_GET_API(DictReplace);
473 REDISMODULE_GET_API(DictGetC);
474 REDISMODULE_GET_API(DictGet);
475 REDISMODULE_GET_API(DictDelC);
476 REDISMODULE_GET_API(DictDel);
477 REDISMODULE_GET_API(DictIteratorStartC);
478 REDISMODULE_GET_API(DictIteratorStart);
479 REDISMODULE_GET_API(DictIteratorStop);
480 REDISMODULE_GET_API(DictIteratorReseekC);
481 REDISMODULE_GET_API(DictIteratorReseek);
482 REDISMODULE_GET_API(DictNextC);
483 REDISMODULE_GET_API(DictPrevC);
484 REDISMODULE_GET_API(DictNext);
485 REDISMODULE_GET_API(DictPrev);
486 REDISMODULE_GET_API(DictCompare);
487 REDISMODULE_GET_API(DictCompareC);
488
489 #ifdef REDISMODULE_EXPERIMENTAL_API
490 REDISMODULE_GET_API(GetThreadSafeContext);
491 REDISMODULE_GET_API(FreeThreadSafeContext);
492 REDISMODULE_GET_API(ThreadSafeContextLock);
493 REDISMODULE_GET_API(ThreadSafeContextUnlock);
494 REDISMODULE_GET_API(BlockClient);
495 REDISMODULE_GET_API(UnblockClient);
496 REDISMODULE_GET_API(IsBlockedReplyRequest);
497 REDISMODULE_GET_API(IsBlockedTimeoutRequest);
498 REDISMODULE_GET_API(GetBlockedClientPrivateData);
499 REDISMODULE_GET_API(GetBlockedClientHandle);
500 REDISMODULE_GET_API(AbortBlock);
501 REDISMODULE_GET_API(SetDisconnectCallback);
502 REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
503 REDISMODULE_GET_API(BlockedClientDisconnected);
504 REDISMODULE_GET_API(RegisterClusterMessageReceiver);
505 REDISMODULE_GET_API(SendClusterMessage);
506 REDISMODULE_GET_API(GetClusterNodeInfo);
507 REDISMODULE_GET_API(GetClusterNodesList);
508 REDISMODULE_GET_API(FreeClusterNodesList);
509 REDISMODULE_GET_API(CreateTimer);
510 REDISMODULE_GET_API(StopTimer);
511 REDISMODULE_GET_API(GetTimerInfo);
512 REDISMODULE_GET_API(GetMyClusterID);
513 REDISMODULE_GET_API(GetClusterSize);
514 REDISMODULE_GET_API(GetRandomBytes);
515 REDISMODULE_GET_API(GetRandomHexChars);
516 REDISMODULE_GET_API(SetClusterFlags);
517 REDISMODULE_GET_API(ExportSharedAPI);
518 REDISMODULE_GET_API(GetSharedAPI);
519 REDISMODULE_GET_API(RegisterCommandFilter);
520 REDISMODULE_GET_API(UnregisterCommandFilter);
521 REDISMODULE_GET_API(CommandFilterArgsCount);
522 REDISMODULE_GET_API(CommandFilterArgGet);
523 REDISMODULE_GET_API(CommandFilterArgInsert);
524 REDISMODULE_GET_API(CommandFilterArgReplace);
525 REDISMODULE_GET_API(CommandFilterArgDelete);
526 #endif
527
528 if (RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR;
529 RedisModule_SetModuleAttribs(ctx,name,ver,apiver);
530 return REDISMODULE_OK;
531 }
532
533 #else
534
535 /* Things only defined for the modules core, not exported to modules
536 * including this file. */
537 #define RedisModuleString robj
538
539 #endif /* REDISMODULE_CORE */
540 #endif /* REDISMOUDLE_H */
541