2 * Copyright (c) 2018-2019 Nokia.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 #include <sys/types.h>
24 /* ---------------- Defines common between core and modules --------------- */
26 /* Error status return values. */
27 #define REDISMODULE_OK 0
28 #define REDISMODULE_ERR 1
31 #define REDISMODULE_APIVER_1 1
33 /* API flags and constants */
34 #define REDISMODULE_READ (1<<0)
35 #define REDISMODULE_WRITE (1<<1)
37 #define REDISMODULE_LIST_HEAD 0
38 #define REDISMODULE_LIST_TAIL 1
41 #define REDISMODULE_KEYTYPE_EMPTY 0
42 #define REDISMODULE_KEYTYPE_STRING 1
43 #define REDISMODULE_KEYTYPE_LIST 2
44 #define REDISMODULE_KEYTYPE_HASH 3
45 #define REDISMODULE_KEYTYPE_SET 4
46 #define REDISMODULE_KEYTYPE_ZSET 5
47 #define REDISMODULE_KEYTYPE_MODULE 6
50 #define REDISMODULE_REPLY_UNKNOWN -1
51 #define REDISMODULE_REPLY_STRING 0
52 #define REDISMODULE_REPLY_ERROR 1
53 #define REDISMODULE_REPLY_INTEGER 2
54 #define REDISMODULE_REPLY_ARRAY 3
55 #define REDISMODULE_REPLY_NULL 4
57 /* Postponed array length. */
58 #define REDISMODULE_POSTPONED_ARRAY_LEN -1
61 #define REDISMODULE_NO_EXPIRE -1
63 /* Sorted set API flags. */
64 #define REDISMODULE_ZADD_XX (1<<0)
65 #define REDISMODULE_ZADD_NX (1<<1)
66 #define REDISMODULE_ZADD_ADDED (1<<2)
67 #define REDISMODULE_ZADD_UPDATED (1<<3)
68 #define REDISMODULE_ZADD_NOP (1<<4)
71 #define REDISMODULE_HASH_NONE 0
72 #define REDISMODULE_HASH_NX (1<<0)
73 #define REDISMODULE_HASH_XX (1<<1)
74 #define REDISMODULE_HASH_CFIELDS (1<<2)
75 #define REDISMODULE_HASH_EXISTS (1<<3)
77 /* Context Flags: Info about the current context returned by RM_GetContextFlags */
79 /* The command is running in the context of a Lua script */
80 #define REDISMODULE_CTX_FLAGS_LUA 0x0001
81 /* The command is running inside a Redis transaction */
82 #define REDISMODULE_CTX_FLAGS_MULTI 0x0002
83 /* The instance is a master */
84 #define REDISMODULE_CTX_FLAGS_MASTER 0x0004
85 /* The instance is a slave */
86 #define REDISMODULE_CTX_FLAGS_SLAVE 0x0008
87 /* The instance is read-only (usually meaning it's a slave as well) */
88 #define REDISMODULE_CTX_FLAGS_READONLY 0x0010
89 /* The instance is running in cluster mode */
90 #define REDISMODULE_CTX_FLAGS_CLUSTER 0x0020
91 /* The instance has AOF enabled */
92 #define REDISMODULE_CTX_FLAGS_AOF 0x0040 //
93 /* The instance has RDB enabled */
94 #define REDISMODULE_CTX_FLAGS_RDB 0x0080 //
95 /* The instance has Maxmemory set */
96 #define REDISMODULE_CTX_FLAGS_MAXMEMORY 0x0100
97 /* Maxmemory is set and has an eviction policy that may delete keys */
98 #define REDISMODULE_CTX_FLAGS_EVICT 0x0200
101 #define REDISMODULE_NOTIFY_GENERIC (1<<2) /* g */
102 #define REDISMODULE_NOTIFY_STRING (1<<3) /* $ */
103 #define REDISMODULE_NOTIFY_LIST (1<<4) /* l */
104 #define REDISMODULE_NOTIFY_SET (1<<5) /* s */
105 #define REDISMODULE_NOTIFY_HASH (1<<6) /* h */
106 #define REDISMODULE_NOTIFY_ZSET (1<<7) /* z */
107 #define REDISMODULE_NOTIFY_EXPIRED (1<<8) /* x */
108 #define REDISMODULE_NOTIFY_EVICTED (1<<9) /* e */
109 #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) /* A */
112 /* A special pointer that we can use between the core and the module to signal
113 * field deletion, and that is impossible to be a valid pointer. */
114 #define REDISMODULE_HASH_DELETE ((RedisModuleString*)(long)1)
116 /* Error messages. */
117 #define REDISMODULE_ERRORMSG_WRONGTYPE "WRONGTYPE Operation against a key holding the wrong kind of value"
119 #define REDISMODULE_POSITIVE_INFINITE (1.0/0.0)
120 #define REDISMODULE_NEGATIVE_INFINITE (-1.0/0.0)
122 #define REDISMODULE_NOT_USED(V) ((void) V)
124 /* ------------------------- End of common defines ------------------------ */
126 #ifndef REDISMODULE_CORE
128 typedef long long mstime_t;
130 /* Incomplete structures for compiler checks but opaque access. */
131 typedef struct RedisModuleCtx RedisModuleCtx;
132 typedef struct RedisModuleKey RedisModuleKey;
133 typedef struct RedisModuleString RedisModuleString;
134 typedef struct RedisModuleCallReply RedisModuleCallReply;
135 typedef struct RedisModuleIO RedisModuleIO;
136 typedef struct RedisModuleType RedisModuleType;
137 typedef struct RedisModuleDigest RedisModuleDigest;
138 typedef struct RedisModuleBlockedClient RedisModuleBlockedClient;
140 typedef int (*RedisModuleCmdFunc) (RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
142 typedef int (*RedisModuleNotificationFunc) (RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key);
143 typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver);
144 typedef void (*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value);
145 typedef void (*RedisModuleTypeRewriteFunc)(RedisModuleIO *aof, RedisModuleString *key, void *value);
146 typedef size_t (*RedisModuleTypeMemUsageFunc)(const void *value);
147 typedef void (*RedisModuleTypeDigestFunc)(RedisModuleDigest *digest, void *value);
148 typedef void (*RedisModuleTypeFreeFunc)(void *value);
150 #define REDISMODULE_TYPE_METHOD_VERSION 1
151 typedef struct RedisModuleTypeMethods {
153 RedisModuleTypeLoadFunc rdb_load;
154 RedisModuleTypeSaveFunc rdb_save;
155 RedisModuleTypeRewriteFunc aof_rewrite;
156 RedisModuleTypeMemUsageFunc mem_usage;
157 RedisModuleTypeDigestFunc digest;
158 RedisModuleTypeFreeFunc free;
159 } RedisModuleTypeMethods;
161 #define REDISMODULE_GET_API(name) \
162 RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))
164 #define REDISMODULE_API_FUNC(x) (*x)
167 void *REDISMODULE_API_FUNC(RedisModule_Alloc)(size_t bytes);
168 void *REDISMODULE_API_FUNC(RedisModule_Realloc)(void *ptr, size_t bytes);
169 void REDISMODULE_API_FUNC(RedisModule_Free)(void *ptr);
170 void *REDISMODULE_API_FUNC(RedisModule_Calloc)(size_t nmemb, size_t size);
171 char *REDISMODULE_API_FUNC(RedisModule_Strdup)(const char *str);
172 int REDISMODULE_API_FUNC(RedisModule_GetApi)(const char *, void *);
173 int REDISMODULE_API_FUNC(RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep);
174 void REDISMODULE_API_FUNC(RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name, int ver, int apiver);
175 int REDISMODULE_API_FUNC(RedisModule_IsModuleNameBusy)(const char *name);
176 int REDISMODULE_API_FUNC(RedisModule_WrongArity)(RedisModuleCtx *ctx);
177 int REDISMODULE_API_FUNC(RedisModule_ReplyWithLongLong)(RedisModuleCtx *ctx, long long ll);
178 int REDISMODULE_API_FUNC(RedisModule_GetSelectedDb)(RedisModuleCtx *ctx);
179 int REDISMODULE_API_FUNC(RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid);
180 void *REDISMODULE_API_FUNC(RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode);
181 void REDISMODULE_API_FUNC(RedisModule_CloseKey)(RedisModuleKey *kp);
182 int REDISMODULE_API_FUNC(RedisModule_KeyType)(RedisModuleKey *kp);
183 size_t REDISMODULE_API_FUNC(RedisModule_ValueLength)(RedisModuleKey *kp);
184 int REDISMODULE_API_FUNC(RedisModule_ListPush)(RedisModuleKey *kp, int where, RedisModuleString *ele);
185 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ListPop)(RedisModuleKey *key, int where);
186 RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_Call)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...);
187 const char *REDISMODULE_API_FUNC(RedisModule_CallReplyProto)(RedisModuleCallReply *reply, size_t *len);
188 void REDISMODULE_API_FUNC(RedisModule_FreeCallReply)(RedisModuleCallReply *reply);
189 int REDISMODULE_API_FUNC(RedisModule_CallReplyType)(RedisModuleCallReply *reply);
190 long long REDISMODULE_API_FUNC(RedisModule_CallReplyInteger)(RedisModuleCallReply *reply);
191 size_t REDISMODULE_API_FUNC(RedisModule_CallReplyLength)(RedisModuleCallReply *reply);
192 RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx);
193 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len);
194 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, long long ll);
195 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str);
196 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...);
197 void REDISMODULE_API_FUNC(RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str);
198 const char *REDISMODULE_API_FUNC(RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len);
199 int REDISMODULE_API_FUNC(RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err);
200 int REDISMODULE_API_FUNC(RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg);
201 int REDISMODULE_API_FUNC(RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, long len);
202 void REDISMODULE_API_FUNC(RedisModule_ReplySetArrayLength)(RedisModuleCtx *ctx, long len);
203 int REDISMODULE_API_FUNC(RedisModule_ReplyWithStringBuffer)(RedisModuleCtx *ctx, const char *buf, size_t len);
204 int REDISMODULE_API_FUNC(RedisModule_ReplyWithString)(RedisModuleCtx *ctx, RedisModuleString *str);
205 int REDISMODULE_API_FUNC(RedisModule_ReplyWithNull)(RedisModuleCtx *ctx);
206 int REDISMODULE_API_FUNC(RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, double d);
207 int REDISMODULE_API_FUNC(RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx, RedisModuleCallReply *reply);
208 int REDISMODULE_API_FUNC(RedisModule_StringToLongLong)(const RedisModuleString *str, long long *ll);
209 int REDISMODULE_API_FUNC(RedisModule_StringToDouble)(const RedisModuleString *str, double *d);
210 void REDISMODULE_API_FUNC(RedisModule_AutoMemory)(RedisModuleCtx *ctx);
211 int REDISMODULE_API_FUNC(RedisModule_Replicate)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...);
212 int REDISMODULE_API_FUNC(RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx);
213 const char *REDISMODULE_API_FUNC(RedisModule_CallReplyStringPtr)(RedisModuleCallReply *reply, size_t *len);
214 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromCallReply)(RedisModuleCallReply *reply);
215 int REDISMODULE_API_FUNC(RedisModule_DeleteKey)(RedisModuleKey *key);
216 int REDISMODULE_API_FUNC(RedisModule_UnlinkKey)(RedisModuleKey *key);
217 int REDISMODULE_API_FUNC(RedisModule_StringSet)(RedisModuleKey *key, RedisModuleString *str);
218 char *REDISMODULE_API_FUNC(RedisModule_StringDMA)(RedisModuleKey *key, size_t *len, int mode);
219 int REDISMODULE_API_FUNC(RedisModule_StringTruncate)(RedisModuleKey *key, size_t newlen);
220 mstime_t REDISMODULE_API_FUNC(RedisModule_GetExpire)(RedisModuleKey *key);
221 int REDISMODULE_API_FUNC(RedisModule_SetExpire)(RedisModuleKey *key, mstime_t expire);
222 int REDISMODULE_API_FUNC(RedisModule_ZsetAdd)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr);
223 int REDISMODULE_API_FUNC(RedisModule_ZsetIncrby)(RedisModuleKey *key, double score, RedisModuleString *ele, int *flagsptr, double *newscore);
224 int REDISMODULE_API_FUNC(RedisModule_ZsetScore)(RedisModuleKey *key, RedisModuleString *ele, double *score);
225 int REDISMODULE_API_FUNC(RedisModule_ZsetRem)(RedisModuleKey *key, RedisModuleString *ele, int *deleted);
226 void REDISMODULE_API_FUNC(RedisModule_ZsetRangeStop)(RedisModuleKey *key);
227 int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex);
228 int REDISMODULE_API_FUNC(RedisModule_ZsetLastInScoreRange)(RedisModuleKey *key, double min, double max, int minex, int maxex);
229 int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max);
230 int REDISMODULE_API_FUNC(RedisModule_ZsetLastInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max);
231 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ZsetRangeCurrentElement)(RedisModuleKey *key, double *score);
232 int REDISMODULE_API_FUNC(RedisModule_ZsetRangeNext)(RedisModuleKey *key);
233 int REDISMODULE_API_FUNC(RedisModule_ZsetRangePrev)(RedisModuleKey *key);
234 int REDISMODULE_API_FUNC(RedisModule_ZsetRangeEndReached)(RedisModuleKey *key);
235 int REDISMODULE_API_FUNC(RedisModule_HashSet)(RedisModuleKey *key, int flags, ...);
236 int REDISMODULE_API_FUNC(RedisModule_HashGet)(RedisModuleKey *key, int flags, ...);
237 int REDISMODULE_API_FUNC(RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx);
238 void REDISMODULE_API_FUNC(RedisModule_KeyAtPos)(RedisModuleCtx *ctx, int pos);
239 unsigned long long REDISMODULE_API_FUNC(RedisModule_GetClientId)(RedisModuleCtx *ctx);
240 int REDISMODULE_API_FUNC(RedisModule_GetContextFlags)(RedisModuleCtx *ctx);
241 void *REDISMODULE_API_FUNC(RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes);
242 RedisModuleType *REDISMODULE_API_FUNC(RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods);
243 int REDISMODULE_API_FUNC(RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value);
244 RedisModuleType *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetType)(RedisModuleKey *key);
245 void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetValue)(RedisModuleKey *key);
246 void REDISMODULE_API_FUNC(RedisModule_SaveUnsigned)(RedisModuleIO *io, uint64_t value);
247 uint64_t REDISMODULE_API_FUNC(RedisModule_LoadUnsigned)(RedisModuleIO *io);
248 void REDISMODULE_API_FUNC(RedisModule_SaveSigned)(RedisModuleIO *io, int64_t value);
249 int64_t REDISMODULE_API_FUNC(RedisModule_LoadSigned)(RedisModuleIO *io);
250 void REDISMODULE_API_FUNC(RedisModule_EmitAOF)(RedisModuleIO *io, const char *cmdname, const char *fmt, ...);
251 void REDISMODULE_API_FUNC(RedisModule_SaveString)(RedisModuleIO *io, RedisModuleString *s);
252 void REDISMODULE_API_FUNC(RedisModule_SaveStringBuffer)(RedisModuleIO *io, const char *str, size_t len);
253 RedisModuleString *REDISMODULE_API_FUNC(RedisModule_LoadString)(RedisModuleIO *io);
254 char *REDISMODULE_API_FUNC(RedisModule_LoadStringBuffer)(RedisModuleIO *io, size_t *lenptr);
255 void REDISMODULE_API_FUNC(RedisModule_SaveDouble)(RedisModuleIO *io, double value);
256 double REDISMODULE_API_FUNC(RedisModule_LoadDouble)(RedisModuleIO *io);
257 void REDISMODULE_API_FUNC(RedisModule_SaveFloat)(RedisModuleIO *io, float value);
258 float REDISMODULE_API_FUNC(RedisModule_LoadFloat)(RedisModuleIO *io);
259 void REDISMODULE_API_FUNC(RedisModule_Log)(RedisModuleCtx *ctx, const char *level, const char *fmt, ...);
260 void REDISMODULE_API_FUNC(RedisModule_LogIOError)(RedisModuleIO *io, const char *levelstr, const char *fmt, ...);
261 int REDISMODULE_API_FUNC(RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, RedisModuleString *str, const char *buf, size_t len);
262 void REDISMODULE_API_FUNC(RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str);
263 int REDISMODULE_API_FUNC(RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b);
264 RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetContextFromIO)(RedisModuleIO *io);
265 long long REDISMODULE_API_FUNC(RedisModule_Milliseconds)(void);
266 void REDISMODULE_API_FUNC(RedisModule_DigestAddStringBuffer)(RedisModuleDigest *md, unsigned char *ele, size_t len);
267 void REDISMODULE_API_FUNC(RedisModule_DigestAddLongLong)(RedisModuleDigest *md, long long ele);
268 void REDISMODULE_API_FUNC(RedisModule_DigestEndSequence)(RedisModuleDigest *md);
270 /* Experimental APIs */
271 #ifdef REDISMODULE_EXPERIMENTAL_API
272 RedisModuleBlockedClient *REDISMODULE_API_FUNC(RedisModule_BlockClient)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(void*), long long timeout_ms);
273 int REDISMODULE_API_FUNC(RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata);
274 int REDISMODULE_API_FUNC(RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx);
275 int REDISMODULE_API_FUNC(RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx);
276 void *REDISMODULE_API_FUNC(RedisModule_GetBlockedClientPrivateData)(RedisModuleCtx *ctx);
277 int REDISMODULE_API_FUNC(RedisModule_AbortBlock)(RedisModuleBlockedClient *bc);
278 RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetThreadSafeContext)(RedisModuleBlockedClient *bc);
279 void REDISMODULE_API_FUNC(RedisModule_FreeThreadSafeContext)(RedisModuleCtx *ctx);
280 void REDISMODULE_API_FUNC(RedisModule_ThreadSafeContextLock)(RedisModuleCtx *ctx);
281 void REDISMODULE_API_FUNC(RedisModule_ThreadSafeContextUnlock)(RedisModuleCtx *ctx);
282 int REDISMODULE_API_FUNC(RedisModule_SubscribeToKeyspaceEvents)(RedisModuleCtx *ctx, int types, RedisModuleNotificationFunc cb);
286 /* This is included inline inside each Redis module. */
287 static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) __attribute__((unused));
288 static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
289 void *getapifuncptr = ((void**)ctx)[0];
290 RedisModule_GetApi = (int (*)(const char *, void *)) (unsigned long)getapifuncptr;
291 REDISMODULE_GET_API(Alloc);
292 REDISMODULE_GET_API(Calloc);
293 REDISMODULE_GET_API(Free);
294 REDISMODULE_GET_API(Realloc);
295 REDISMODULE_GET_API(Strdup);
296 REDISMODULE_GET_API(CreateCommand);
297 REDISMODULE_GET_API(SetModuleAttribs);
298 REDISMODULE_GET_API(IsModuleNameBusy);
299 REDISMODULE_GET_API(WrongArity);
300 REDISMODULE_GET_API(ReplyWithLongLong);
301 REDISMODULE_GET_API(ReplyWithError);
302 REDISMODULE_GET_API(ReplyWithSimpleString);
303 REDISMODULE_GET_API(ReplyWithArray);
304 REDISMODULE_GET_API(ReplySetArrayLength);
305 REDISMODULE_GET_API(ReplyWithStringBuffer);
306 REDISMODULE_GET_API(ReplyWithString);
307 REDISMODULE_GET_API(ReplyWithNull);
308 REDISMODULE_GET_API(ReplyWithCallReply);
309 REDISMODULE_GET_API(ReplyWithDouble);
310 REDISMODULE_GET_API(ReplySetArrayLength);
311 REDISMODULE_GET_API(GetSelectedDb);
312 REDISMODULE_GET_API(SelectDb);
313 REDISMODULE_GET_API(OpenKey);
314 REDISMODULE_GET_API(CloseKey);
315 REDISMODULE_GET_API(KeyType);
316 REDISMODULE_GET_API(ValueLength);
317 REDISMODULE_GET_API(ListPush);
318 REDISMODULE_GET_API(ListPop);
319 REDISMODULE_GET_API(StringToLongLong);
320 REDISMODULE_GET_API(StringToDouble);
321 REDISMODULE_GET_API(Call);
322 REDISMODULE_GET_API(CallReplyProto);
323 REDISMODULE_GET_API(FreeCallReply);
324 REDISMODULE_GET_API(CallReplyInteger);
325 REDISMODULE_GET_API(CallReplyType);
326 REDISMODULE_GET_API(CallReplyLength);
327 REDISMODULE_GET_API(CallReplyArrayElement);
328 REDISMODULE_GET_API(CallReplyStringPtr);
329 REDISMODULE_GET_API(CreateStringFromCallReply);
330 REDISMODULE_GET_API(CreateString);
331 REDISMODULE_GET_API(CreateStringFromLongLong);
332 REDISMODULE_GET_API(CreateStringFromString);
333 REDISMODULE_GET_API(CreateStringPrintf);
334 REDISMODULE_GET_API(FreeString);
335 REDISMODULE_GET_API(StringPtrLen);
336 REDISMODULE_GET_API(AutoMemory);
337 REDISMODULE_GET_API(Replicate);
338 REDISMODULE_GET_API(ReplicateVerbatim);
339 REDISMODULE_GET_API(DeleteKey);
340 REDISMODULE_GET_API(UnlinkKey);
341 REDISMODULE_GET_API(StringSet);
342 REDISMODULE_GET_API(StringDMA);
343 REDISMODULE_GET_API(StringTruncate);
344 REDISMODULE_GET_API(GetExpire);
345 REDISMODULE_GET_API(SetExpire);
346 REDISMODULE_GET_API(ZsetAdd);
347 REDISMODULE_GET_API(ZsetIncrby);
348 REDISMODULE_GET_API(ZsetScore);
349 REDISMODULE_GET_API(ZsetRem);
350 REDISMODULE_GET_API(ZsetRangeStop);
351 REDISMODULE_GET_API(ZsetFirstInScoreRange);
352 REDISMODULE_GET_API(ZsetLastInScoreRange);
353 REDISMODULE_GET_API(ZsetFirstInLexRange);
354 REDISMODULE_GET_API(ZsetLastInLexRange);
355 REDISMODULE_GET_API(ZsetRangeCurrentElement);
356 REDISMODULE_GET_API(ZsetRangeNext);
357 REDISMODULE_GET_API(ZsetRangePrev);
358 REDISMODULE_GET_API(ZsetRangeEndReached);
359 REDISMODULE_GET_API(HashSet);
360 REDISMODULE_GET_API(HashGet);
361 REDISMODULE_GET_API(IsKeysPositionRequest);
362 REDISMODULE_GET_API(KeyAtPos);
363 REDISMODULE_GET_API(GetClientId);
364 REDISMODULE_GET_API(GetContextFlags);
365 REDISMODULE_GET_API(PoolAlloc);
366 REDISMODULE_GET_API(CreateDataType);
367 REDISMODULE_GET_API(ModuleTypeSetValue);
368 REDISMODULE_GET_API(ModuleTypeGetType);
369 REDISMODULE_GET_API(ModuleTypeGetValue);
370 REDISMODULE_GET_API(SaveUnsigned);
371 REDISMODULE_GET_API(LoadUnsigned);
372 REDISMODULE_GET_API(SaveSigned);
373 REDISMODULE_GET_API(LoadSigned);
374 REDISMODULE_GET_API(SaveString);
375 REDISMODULE_GET_API(SaveStringBuffer);
376 REDISMODULE_GET_API(LoadString);
377 REDISMODULE_GET_API(LoadStringBuffer);
378 REDISMODULE_GET_API(SaveDouble);
379 REDISMODULE_GET_API(LoadDouble);
380 REDISMODULE_GET_API(SaveFloat);
381 REDISMODULE_GET_API(LoadFloat);
382 REDISMODULE_GET_API(EmitAOF);
383 REDISMODULE_GET_API(Log);
384 REDISMODULE_GET_API(LogIOError);
385 REDISMODULE_GET_API(StringAppendBuffer);
386 REDISMODULE_GET_API(RetainString);
387 REDISMODULE_GET_API(StringCompare);
388 REDISMODULE_GET_API(GetContextFromIO);
389 REDISMODULE_GET_API(Milliseconds);
390 REDISMODULE_GET_API(DigestAddStringBuffer);
391 REDISMODULE_GET_API(DigestAddLongLong);
392 REDISMODULE_GET_API(DigestEndSequence);
394 #ifdef REDISMODULE_EXPERIMENTAL_API
395 REDISMODULE_GET_API(GetThreadSafeContext);
396 REDISMODULE_GET_API(FreeThreadSafeContext);
397 REDISMODULE_GET_API(ThreadSafeContextLock);
398 REDISMODULE_GET_API(ThreadSafeContextUnlock);
399 REDISMODULE_GET_API(BlockClient);
400 REDISMODULE_GET_API(UnblockClient);
401 REDISMODULE_GET_API(IsBlockedReplyRequest);
402 REDISMODULE_GET_API(IsBlockedTimeoutRequest);
403 REDISMODULE_GET_API(GetBlockedClientPrivateData);
404 REDISMODULE_GET_API(AbortBlock);
405 REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
409 if (RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR;
410 RedisModule_SetModuleAttribs(ctx,name,ver,apiver);
411 return REDISMODULE_OK;
416 /* Things only defined for the modules core, not exported to modules
417 * including this file. */
418 #define RedisModuleString robj
420 #endif /* REDISMODULE_CORE */
421 #endif /* REDISMOUDLE_H */