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