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