认证模块样例
This commit is contained in:
parent
55b70e6bb2
commit
d15397358d
151
src/redis-acl.c
151
src/redis-acl.c
@ -1,9 +1,11 @@
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "redis-acl.h"
|
||||
#include "redismodule.h"
|
||||
|
||||
static RedisModuleCommandFilter *filter;
|
||||
static int time = 1;
|
||||
static int times = 1;
|
||||
static int MAX_TIME = 1000;
|
||||
|
||||
void AuthFilter_CommandFilter(RedisModuleCommandFilter *filter) {
|
||||
@ -13,18 +15,20 @@ void AuthFilter_CommandFilter(RedisModuleCommandFilter *filter) {
|
||||
const RedisModuleString *arg = RedisModule_CommandFilterArgGet(filter, pos);
|
||||
size_t arg_len;
|
||||
const char *arg_str = RedisModule_StringPtrLen(arg, &arg_len);
|
||||
RedisModule_Log(NULL, LOG_LEVEL_NOTICE, "str=%s,len=%ld", arg_str, arg_len);
|
||||
if (strcmp(arg_str, "auth") == 0) {
|
||||
RedisModule_Log(NULL, LOG_LEVEL_NOTICE, "command is auth");
|
||||
RedisModule_CommandFilterArgReplace(filter, pos, RedisModule_CreateString(NULL, "acl.auth", 9));
|
||||
}
|
||||
// RedisModule_Log(NULL, LOG_LEVEL_NOTICE, "str=%s,len=%ld", arg_str, arg_len);
|
||||
// if (strcmp(arg_str, "auth") == 0) {
|
||||
// RedisModule_Log(NULL, LOG_LEVEL_NOTICE, "command is auth");
|
||||
// RedisModule_CommandFilterArgReplace(filter, pos,
|
||||
// RedisModule_CreateString(NULL, "acl.auth", 9));
|
||||
//}
|
||||
// 解密
|
||||
pos++;
|
||||
}
|
||||
RedisModule_Log(NULL, LOG_LEVEL_NOTICE, "filter finished");
|
||||
}
|
||||
|
||||
int AuthCommand_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
||||
int AuthCommand_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv,
|
||||
int argc) {
|
||||
REDISMODULE_NOT_USED(ctx);
|
||||
REDISMODULE_NOT_USED(argc);
|
||||
REDISMODULE_NOT_USED(argv);
|
||||
@ -33,23 +37,138 @@ int AuthCommand_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int
|
||||
return REDISMODULE_OK;
|
||||
}
|
||||
|
||||
void cronLoopCallBack(RedisModuleCtx *ctx, RedisModuleEvent *e, uint64_t sub, void *data) {
|
||||
RedisModuleUser* createUser(RedisModuleCtx *ctx, const char *name) {
|
||||
RedisModuleUser *user = RedisModule_CreateModuleUser(name);
|
||||
RedisModule_SetModuleUserACL(user, "allcommands");
|
||||
RedisModule_SetModuleUserACL(user, "allkeys");
|
||||
RedisModule_SetModuleUserACL(user, "on");
|
||||
return user;
|
||||
}
|
||||
|
||||
int module_auth_reply(RedisModuleCtx *ctx, RedisModuleString *username,
|
||||
RedisModuleString *password, RedisModuleString **err) {
|
||||
void **targ = RedisModule_GetBlockedClientPrivateData(ctx);
|
||||
int result = (uintptr_t)targ[0];
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "auth reply");
|
||||
size_t userlen = 0;
|
||||
const char *user = RedisModule_StringPtrLen(username, &userlen);
|
||||
if (result == 1) {
|
||||
// auth success
|
||||
RedisModuleUser *moduleUser = createUser(ctx, user);
|
||||
uint64_t client_id;
|
||||
int auth_result = RedisModule_AuthenticateClientWithUser(ctx, moduleUser, NULL, NULL, &client_id);
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "auth success user=%s, %lu", user, client_id);
|
||||
if (auth_result == REDISMODULE_ERR) {
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "user not exits user=%s", user);
|
||||
}
|
||||
return REDISMODULE_AUTH_HANDLED;
|
||||
} else if (result == 0) {
|
||||
// auth failed
|
||||
const char *err_msg = "Auth denied by Misc Module.";
|
||||
*err = RedisModule_CreateString(ctx, err_msg, strlen(err_msg));
|
||||
return REDISMODULE_AUTH_HANDLED;
|
||||
}
|
||||
/** skip auth*/
|
||||
return REDISMODULE_AUTH_HANDLED;
|
||||
}
|
||||
|
||||
void free_auth_data(RedisModuleCtx *ctx, void *privdata) {
|
||||
REDISMODULE_NOT_USED(ctx);
|
||||
RedisModule_Free(privdata);
|
||||
}
|
||||
|
||||
void *AuthBlock_ThreadMain(void *arg) {
|
||||
void **targ = arg;
|
||||
RedisModuleBlockedClient *bc = targ[0];
|
||||
RedisModuleCtx *ctx = targ[1];
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "begin auth ");
|
||||
const char *user = RedisModule_StringPtrLen(targ[2], NULL);
|
||||
const char *pwd = RedisModule_StringPtrLen(targ[3], NULL);
|
||||
int result = 2;
|
||||
if (!strcmp(user, "foo") && !strcmp(pwd, "block_allow")) {
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "auth success");
|
||||
result = 1;
|
||||
} else if (!strcmp(user, "foo") && !strcmp(pwd, "block_deny")) {
|
||||
result = 0;
|
||||
} else if (!strcmp(user, "foo") && !strcmp(pwd, "block_abort")) {
|
||||
RedisModule_BlockedClientMeasureTimeEnd(bc);
|
||||
RedisModule_AbortBlock(bc);
|
||||
goto cleanup;
|
||||
} else {
|
||||
result = 0;
|
||||
}
|
||||
void **replyarg = RedisModule_Alloc(sizeof(void *));
|
||||
replyarg[0] = (void *)(uintptr_t)result;
|
||||
RedisModule_BlockedClientMeasureTimeEnd(bc);
|
||||
RedisModule_UnblockClient(bc, replyarg);
|
||||
cleanup:
|
||||
RedisModule_FreeString(NULL, targ[2]);
|
||||
RedisModule_FreeString(NULL, targ[3]);
|
||||
RedisModule_Free(targ);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int module_auth(RedisModuleCtx *ctx, RedisModuleString *username,
|
||||
RedisModuleString *password, RedisModuleString **err) {
|
||||
RedisModuleBlockedClient *bc =
|
||||
RedisModule_BlockClientOnAuth(ctx, module_auth_reply, free_auth_data);
|
||||
int ctx_flags = RedisModule_GetContextFlags(ctx);
|
||||
if (ctx_flags & REDISMODULE_CTX_FLAGS_MULTI ||
|
||||
ctx_flags & REDISMODULE_CTX_FLAGS_LUA) {
|
||||
RedisModule_UnblockClient(bc, NULL);
|
||||
return REDISMODULE_AUTH_HANDLED;
|
||||
}
|
||||
RedisModule_BlockedClientMeasureTimeStart(bc);
|
||||
pthread_t tid;
|
||||
void **targ = RedisModule_Alloc(sizeof(void *) * 4);
|
||||
targ[0] = bc;
|
||||
targ[1] = ctx;
|
||||
targ[2] = RedisModule_CreateStringFromString(NULL, username);
|
||||
targ[3] = RedisModule_CreateStringFromString(NULL, password);
|
||||
/* Create bg thread and pass the blockedclient, username and password to it.
|
||||
*/
|
||||
if (pthread_create(&tid, NULL, AuthBlock_ThreadMain, targ) != 0) {
|
||||
RedisModule_AbortBlock(bc);
|
||||
}
|
||||
return REDISMODULE_AUTH_HANDLED;
|
||||
}
|
||||
|
||||
int auth_cb(RedisModuleCtx *ctx, RedisModuleString *username,
|
||||
RedisModuleString *password, RedisModuleString **err) {
|
||||
const char *user = RedisModule_StringPtrLen(username, NULL);
|
||||
const char *pwd = RedisModule_StringPtrLen(password, NULL);
|
||||
if (!strcmp(user, "foo") && !strcmp(pwd, "allow")) {
|
||||
RedisModuleUser *user = createUser(ctx, "foo");
|
||||
RedisModule_AuthenticateClientWithACLUser(ctx, "foo", 3, NULL, NULL, NULL);
|
||||
return REDISMODULE_AUTH_HANDLED;
|
||||
} else if (!strcmp(user, "foo") && !strcmp(pwd, "deny")) {
|
||||
const char *err_msg = "Auth denied by Misc Module.";
|
||||
*err = RedisModule_CreateString(ctx, err_msg, strlen(err_msg));
|
||||
return REDISMODULE_AUTH_HANDLED;
|
||||
}
|
||||
return REDISMODULE_AUTH_NOT_HANDLED;
|
||||
}
|
||||
|
||||
void cronLoopCallBack(RedisModuleCtx *ctx, RedisModuleEvent *e, uint64_t sub,
|
||||
void *data) {
|
||||
REDISMODULE_NOT_USED(e);
|
||||
RedisModuleCronLoop *ei = data;
|
||||
REDISMODULE_NOT_USED(ei);
|
||||
REDISMODULE_NOT_USED(sub);
|
||||
if (time < MAX_TIME) {
|
||||
time++;
|
||||
times++;
|
||||
return;
|
||||
}
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "cron event");
|
||||
time = 0;
|
||||
times = 0;
|
||||
}
|
||||
|
||||
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
||||
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv,
|
||||
int argc) {
|
||||
REDISMODULE_NOT_USED(argv);
|
||||
REDISMODULE_NOT_USED(argc);
|
||||
if (RedisModule_Init(ctx, "redis-auth", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) {
|
||||
if (RedisModule_Init(ctx, "redis-auth", 1, REDISMODULE_APIVER_1) ==
|
||||
REDISMODULE_ERR) {
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "init redis-auth failed");
|
||||
return REDISMODULE_ERR;
|
||||
}
|
||||
@ -66,10 +185,14 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
||||
RedisModule_Log(ctx, LOG_LEVEL_WARNING, "init acl.auth failed");
|
||||
return REDISMODULE_ERR;
|
||||
}
|
||||
|
||||
RedisModule_RegisterAuthCallback(ctx, module_auth);
|
||||
RedisModule_RegisterAuthCallback(ctx, auth_cb);
|
||||
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "init command success");
|
||||
RedisModule_SubscribeToServerEvent(ctx, RedisModuleEvent_CronLoop, cronLoopCallBack);
|
||||
// RedisModule_SubscribeToServerEvent(ctx, RedisModuleEvent_CronLoop,
|
||||
// cronLoopCallBack);
|
||||
|
||||
RedisModule_Log(ctx, LOG_LEVEL_NOTICE, "init redis-auth success!");
|
||||
return REDISMODULE_OK;
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,8 @@
|
||||
#define LOG_LEVEL_NOTICE "notice"
|
||||
#define LOG_LEVEL_WARNING "warning"
|
||||
|
||||
#define UNUSED(V) ((void) V)
|
||||
|
||||
/* *
|
||||
* Redis Auth command
|
||||
* */
|
||||
|
@ -6,18 +6,44 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
typedef struct RedisModuleString RedisModuleString;
|
||||
typedef struct RedisModuleKey RedisModuleKey;
|
||||
|
||||
/* -------------- Defines NOT common between core and modules ------------- */
|
||||
|
||||
#if defined REDISMODULE_CORE
|
||||
/* Things only defined for the modules core (server), not exported to modules
|
||||
* that include this file. */
|
||||
|
||||
#define RedisModuleString robj
|
||||
|
||||
#endif /* defined REDISMODULE_CORE */
|
||||
|
||||
#if !defined REDISMODULE_CORE && !defined REDISMODULE_CORE_MODULE
|
||||
/* Things defined for modules, but not for core-modules. */
|
||||
|
||||
typedef long long mstime_t;
|
||||
typedef long long ustime_t;
|
||||
|
||||
#endif /* !defined REDISMODULE_CORE && !defined REDISMODULE_CORE_MODULE */
|
||||
|
||||
/* ---------------- Defines common between core and modules --------------- */
|
||||
|
||||
/* Error status return values. */
|
||||
#define REDISMODULE_OK 0
|
||||
#define REDISMODULE_ERR 1
|
||||
|
||||
/* Module Based Authentication status return values. */
|
||||
#define REDISMODULE_AUTH_HANDLED 0
|
||||
#define REDISMODULE_AUTH_NOT_HANDLED 1
|
||||
|
||||
/* API versions. */
|
||||
#define REDISMODULE_APIVER_1 1
|
||||
|
||||
/* Version of the RedisModuleTypeMethods structure. Once the RedisModuleTypeMethods
|
||||
* structure is changed, this version number needs to be changed synchronistically. */
|
||||
#define REDISMODULE_TYPE_METHOD_VERSION 4
|
||||
#define REDISMODULE_TYPE_METHOD_VERSION 5
|
||||
|
||||
/* API flags and constants */
|
||||
#define REDISMODULE_READ (1<<0)
|
||||
@ -26,6 +52,18 @@
|
||||
/* RedisModule_OpenKey extra flags for the 'mode' argument.
|
||||
* Avoid touching the LRU/LFU of the key when opened. */
|
||||
#define REDISMODULE_OPEN_KEY_NOTOUCH (1<<16)
|
||||
/* Don't trigger keyspace event on key misses. */
|
||||
#define REDISMODULE_OPEN_KEY_NONOTIFY (1<<17)
|
||||
/* Don't update keyspace hits/misses counters. */
|
||||
#define REDISMODULE_OPEN_KEY_NOSTATS (1<<18)
|
||||
/* Avoid deleting lazy expired keys. */
|
||||
#define REDISMODULE_OPEN_KEY_NOEXPIRE (1<<19)
|
||||
/* Avoid any effects from fetching the key */
|
||||
#define REDISMODULE_OPEN_KEY_NOEFFECTS (1<<20)
|
||||
/* Mask of all REDISMODULE_OPEN_KEY_* values. Any new mode should be added to this list.
|
||||
* Should not be used directly by the module, use RM_GetOpenKeyModesAll instead.
|
||||
* Located here so when we will add new modes we will not forget to update it. */
|
||||
#define _REDISMODULE_OPEN_KEY_ALL REDISMODULE_READ | REDISMODULE_WRITE | REDISMODULE_OPEN_KEY_NOTOUCH | REDISMODULE_OPEN_KEY_NONOTIFY | REDISMODULE_OPEN_KEY_NOSTATS | REDISMODULE_OPEN_KEY_NOEXPIRE | REDISMODULE_OPEN_KEY_NOEFFECTS
|
||||
|
||||
/* List push and pop */
|
||||
#define REDISMODULE_LIST_HEAD 0
|
||||
@ -55,6 +93,7 @@
|
||||
#define REDISMODULE_REPLY_BIG_NUMBER 9
|
||||
#define REDISMODULE_REPLY_VERBATIM_STRING 10
|
||||
#define REDISMODULE_REPLY_ATTRIBUTE 11
|
||||
#define REDISMODULE_REPLY_PROMISE 12
|
||||
|
||||
/* Postponed array length. */
|
||||
#define REDISMODULE_POSTPONED_ARRAY_LEN -1 /* Deprecated, please use REDISMODULE_POSTPONED_LEN */
|
||||
@ -162,11 +201,13 @@ typedef struct RedisModuleStreamID {
|
||||
#define REDISMODULE_CTX_FLAGS_RESP3 (1<<22)
|
||||
/* Redis is currently async loading database for diskless replication. */
|
||||
#define REDISMODULE_CTX_FLAGS_ASYNC_LOADING (1<<23)
|
||||
/* Redis is starting. */
|
||||
#define REDISMODULE_CTX_FLAGS_SERVER_STARTUP (1<<24)
|
||||
|
||||
/* Next context flag, must be updated when adding new flags above!
|
||||
This flag should not be used directly by the module.
|
||||
* Use RedisModule_GetContextFlagsAll instead. */
|
||||
#define _REDISMODULE_CTX_FLAGS_NEXT (1<<24)
|
||||
#define _REDISMODULE_CTX_FLAGS_NEXT (1<<25)
|
||||
|
||||
/* Keyspace changes notification classes. Every class is associated with a
|
||||
* character for configuration purposes.
|
||||
@ -185,11 +226,12 @@ This flag should not be used directly by the module.
|
||||
#define REDISMODULE_NOTIFY_KEY_MISS (1<<11) /* m (Note: This one is excluded from REDISMODULE_NOTIFY_ALL on purpose) */
|
||||
#define REDISMODULE_NOTIFY_LOADED (1<<12) /* module only key space notification, indicate a key loaded from rdb */
|
||||
#define REDISMODULE_NOTIFY_MODULE (1<<13) /* d, module key space notification */
|
||||
#define REDISMODULE_NOTIFY_NEW (1<<14) /* n, new key notification */
|
||||
|
||||
/* Next notification flag, must be updated when adding new flags above!
|
||||
This flag should not be used directly by the module.
|
||||
* Use RedisModule_GetKeyspaceNotificationFlagsAll instead. */
|
||||
#define _REDISMODULE_NOTIFY_NEXT (1<<14)
|
||||
#define _REDISMODULE_NOTIFY_NEXT (1<<15)
|
||||
|
||||
#define REDISMODULE_NOTIFY_ALL (REDISMODULE_NOTIFY_GENERIC | REDISMODULE_NOTIFY_STRING | REDISMODULE_NOTIFY_LIST | REDISMODULE_NOTIFY_SET | REDISMODULE_NOTIFY_HASH | REDISMODULE_NOTIFY_ZSET | REDISMODULE_NOTIFY_EXPIRED | REDISMODULE_NOTIFY_EVICTED | REDISMODULE_NOTIFY_STREAM | REDISMODULE_NOTIFY_MODULE) /* A */
|
||||
|
||||
@ -232,6 +274,10 @@ This flag should not be used directly by the module.
|
||||
#define REDISMODULE_YIELD_FLAG_NONE (1<<0)
|
||||
#define REDISMODULE_YIELD_FLAG_CLIENTS (1<<1)
|
||||
|
||||
/* RM_BlockClientOnKeysWithFlags flags */
|
||||
#define REDISMODULE_BLOCK_UNBLOCK_DEFAULT (0)
|
||||
#define REDISMODULE_BLOCK_UNBLOCK_DELETED (1<<0)
|
||||
|
||||
/* This type represents a timer handle, and is returned when a timer is
|
||||
* registered and used in order to invalidate a timer. It's just a 64 bit
|
||||
* number, because this is how each timer is represented inside the radix tree
|
||||
@ -248,12 +294,21 @@ typedef uint64_t RedisModuleTimerID;
|
||||
|
||||
/* When set, Redis will not call RedisModule_SignalModifiedKey(), implicitly in
|
||||
* RedisModule_CloseKey, and the module needs to do that when manually when keys
|
||||
* are modified from the user's sperspective, to invalidate WATCH. */
|
||||
* are modified from the user's perspective, to invalidate WATCH. */
|
||||
#define REDISMODULE_OPTION_NO_IMPLICIT_SIGNAL_MODIFIED (1<<1)
|
||||
|
||||
/* Declare that the module can handle diskless async replication with RedisModule_SetModuleOptions. */
|
||||
#define REDISMODULE_OPTIONS_HANDLE_REPL_ASYNC_LOAD (1<<2)
|
||||
|
||||
/* Declare that the module want to get nested key space notifications.
|
||||
* If enabled, the module is responsible to break endless loop. */
|
||||
#define REDISMODULE_OPTIONS_ALLOW_NESTED_KEYSPACE_NOTIFICATIONS (1<<3)
|
||||
|
||||
/* Next option flag, must be updated when adding new module flags above!
|
||||
* This flag should not be used directly by the module.
|
||||
* Use RedisModule_GetModuleOptionsAll instead. */
|
||||
#define _REDISMODULE_OPTIONS_FLAGS_NEXT (1<<4)
|
||||
|
||||
/* Definitions for RedisModule_SetCommandInfo. */
|
||||
|
||||
typedef enum {
|
||||
@ -325,6 +380,7 @@ typedef struct RedisModuleCommandArg {
|
||||
int flags; /* The REDISMODULE_CMD_ARG_* macros. */
|
||||
const char *deprecated_since;
|
||||
struct RedisModuleCommandArg *subargs;
|
||||
const char *display_text;
|
||||
} RedisModuleCommandArg;
|
||||
|
||||
typedef struct {
|
||||
@ -346,7 +402,7 @@ typedef struct {
|
||||
const char *keyword;
|
||||
/* An index in argv from which to start searching.
|
||||
* Can be negative, which means start search from the end, in reverse
|
||||
* (Example: -2 means to start in reverse from the panultimate arg) */
|
||||
* (Example: -2 means to start in reverse from the penultimate arg) */
|
||||
int startfrom;
|
||||
} keyword;
|
||||
} bs;
|
||||
@ -441,7 +497,8 @@ typedef void (*RedisModuleEventLoopOneShotFunc)(void *user_data);
|
||||
#define REDISMODULE_EVENT_REPL_ASYNC_LOAD 14
|
||||
#define REDISMODULE_EVENT_EVENTLOOP 15
|
||||
#define REDISMODULE_EVENT_CONFIG 16
|
||||
#define _REDISMODULE_EVENT_NEXT 17 /* Next event flag, should be updated if a new event added. */
|
||||
#define REDISMODULE_EVENT_KEY 17
|
||||
#define _REDISMODULE_EVENT_NEXT 18 /* Next event flag, should be updated if a new event added. */
|
||||
|
||||
typedef struct RedisModuleEvent {
|
||||
uint64_t id; /* REDISMODULE_EVENT_... defines. */
|
||||
@ -548,6 +605,10 @@ static const RedisModuleEvent
|
||||
RedisModuleEvent_Config = {
|
||||
REDISMODULE_EVENT_CONFIG,
|
||||
1
|
||||
},
|
||||
RedisModuleEvent_Key = {
|
||||
REDISMODULE_EVENT_KEY,
|
||||
1
|
||||
};
|
||||
|
||||
/* Those are values that are used for the 'subevent' callback argument. */
|
||||
@ -616,6 +677,12 @@ static const RedisModuleEvent
|
||||
#define REDISMODULE_SUBEVENT_EVENTLOOP_AFTER_SLEEP 1
|
||||
#define _REDISMODULE_SUBEVENT_EVENTLOOP_NEXT 2
|
||||
|
||||
#define REDISMODULE_SUBEVENT_KEY_DELETED 0
|
||||
#define REDISMODULE_SUBEVENT_KEY_EXPIRED 1
|
||||
#define REDISMODULE_SUBEVENT_KEY_EVICTED 2
|
||||
#define REDISMODULE_SUBEVENT_KEY_OVERWRITTEN 3
|
||||
#define _REDISMODULE_SUBEVENT_KEY_NEXT 4
|
||||
|
||||
#define _REDISMODULE_SUBEVENT_SHUTDOWN_NEXT 0
|
||||
#define _REDISMODULE_SUBEVENT_CRON_LOOP_NEXT 0
|
||||
#define _REDISMODULE_SUBEVENT_SWAPDB_NEXT 0
|
||||
@ -655,6 +722,8 @@ typedef struct RedisModuleClientInfo {
|
||||
|
||||
#define RedisModuleClientInfo RedisModuleClientInfoV1
|
||||
|
||||
#define REDISMODULE_CLIENTINFO_INITIALIZER_V1 { .version = 1 }
|
||||
|
||||
#define REDISMODULE_REPLICATIONINFO_VERSION 1
|
||||
typedef struct RedisModuleReplicationInfo {
|
||||
uint64_t version; /* Not used since this structure is never passed
|
||||
@ -737,6 +806,16 @@ typedef struct RedisModuleSwapDbInfo {
|
||||
|
||||
#define RedisModuleSwapDbInfo RedisModuleSwapDbInfoV1
|
||||
|
||||
#define REDISMODULE_KEYINFO_VERSION 1
|
||||
typedef struct RedisModuleKeyInfo {
|
||||
uint64_t version; /* Not used since this structure is never passed
|
||||
from the module to the core right now. Here
|
||||
for future compatibility. */
|
||||
RedisModuleKey *key; /* Opened key. */
|
||||
} RedisModuleKeyInfoV1;
|
||||
|
||||
#define RedisModuleKeyInfo RedisModuleKeyInfoV1
|
||||
|
||||
typedef enum {
|
||||
REDISMODULE_ACL_LOG_AUTH = 0, /* Authentication failure */
|
||||
REDISMODULE_ACL_LOG_CMD, /* Command authorization failure */
|
||||
@ -744,11 +823,23 @@ typedef enum {
|
||||
REDISMODULE_ACL_LOG_CHANNEL /* Channel authorization failure */
|
||||
} RedisModuleACLLogEntryReason;
|
||||
|
||||
/* Incomplete structures needed by both the core and modules. */
|
||||
typedef struct RedisModuleIO RedisModuleIO;
|
||||
typedef struct RedisModuleDigest RedisModuleDigest;
|
||||
typedef struct RedisModuleInfoCtx RedisModuleInfoCtx;
|
||||
typedef struct RedisModuleDefragCtx RedisModuleDefragCtx;
|
||||
|
||||
/* Function pointers needed by both the core and modules, these needs to be
|
||||
* exposed since you can't cast a function pointer to (void *). */
|
||||
typedef void (*RedisModuleInfoFunc)(RedisModuleInfoCtx *ctx, int for_crash_report);
|
||||
typedef void (*RedisModuleDefragFunc)(RedisModuleDefragCtx *ctx);
|
||||
typedef void (*RedisModuleUserChangedFunc) (uint64_t client_id, void *privdata);
|
||||
|
||||
/* ------------------------- End of common defines ------------------------ */
|
||||
|
||||
#ifndef REDISMODULE_CORE
|
||||
|
||||
typedef long long mstime_t;
|
||||
/* ----------- The rest of the defines are only for modules ----------------- */
|
||||
#if !defined REDISMODULE_CORE || defined REDISMODULE_CORE_MODULE
|
||||
/* Things defined for modules and core-modules. */
|
||||
|
||||
/* Macro definitions specific to individual compilers */
|
||||
#ifndef REDISMODULE_ATTR_UNUSED
|
||||
@ -778,28 +869,24 @@ typedef long long mstime_t;
|
||||
/* Incomplete structures for compiler checks but opaque access. */
|
||||
typedef struct RedisModuleCtx RedisModuleCtx;
|
||||
typedef struct RedisModuleCommand RedisModuleCommand;
|
||||
typedef struct RedisModuleKey RedisModuleKey;
|
||||
typedef struct RedisModuleString RedisModuleString;
|
||||
typedef struct RedisModuleCallReply RedisModuleCallReply;
|
||||
typedef struct RedisModuleIO RedisModuleIO;
|
||||
typedef struct RedisModuleType RedisModuleType;
|
||||
typedef struct RedisModuleDigest RedisModuleDigest;
|
||||
typedef struct RedisModuleBlockedClient RedisModuleBlockedClient;
|
||||
typedef struct RedisModuleClusterInfo RedisModuleClusterInfo;
|
||||
typedef struct RedisModuleDict RedisModuleDict;
|
||||
typedef struct RedisModuleDictIter RedisModuleDictIter;
|
||||
typedef struct RedisModuleCommandFilterCtx RedisModuleCommandFilterCtx;
|
||||
typedef struct RedisModuleCommandFilter RedisModuleCommandFilter;
|
||||
typedef struct RedisModuleInfoCtx RedisModuleInfoCtx;
|
||||
typedef struct RedisModuleServerInfoData RedisModuleServerInfoData;
|
||||
typedef struct RedisModuleScanCursor RedisModuleScanCursor;
|
||||
typedef struct RedisModuleDefragCtx RedisModuleDefragCtx;
|
||||
typedef struct RedisModuleUser RedisModuleUser;
|
||||
typedef struct RedisModuleKeyOptCtx RedisModuleKeyOptCtx;
|
||||
typedef struct RedisModuleRdbStream RedisModuleRdbStream;
|
||||
|
||||
typedef int (*RedisModuleCmdFunc)(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
|
||||
typedef void (*RedisModuleDisconnectFunc)(RedisModuleCtx *ctx, RedisModuleBlockedClient *bc);
|
||||
typedef int (*RedisModuleNotificationFunc)(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key);
|
||||
typedef void (*RedisModulePostNotificationJobFunc) (RedisModuleCtx *ctx, void *pd);
|
||||
typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver);
|
||||
typedef void (*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value);
|
||||
typedef int (*RedisModuleTypeAuxLoadFunc)(RedisModuleIO *rdb, int encver, int when);
|
||||
@ -820,11 +907,8 @@ typedef void (*RedisModuleClusterMessageReceiver)(RedisModuleCtx *ctx, const cha
|
||||
typedef void (*RedisModuleTimerProc)(RedisModuleCtx *ctx, void *data);
|
||||
typedef void (*RedisModuleCommandFilterFunc) (RedisModuleCommandFilterCtx *filter);
|
||||
typedef void (*RedisModuleForkDoneHandler) (int exitcode, int bysignal, void *user_data);
|
||||
typedef void (*RedisModuleInfoFunc)(RedisModuleInfoCtx *ctx, int for_crash_report);
|
||||
typedef void (*RedisModuleScanCB)(RedisModuleCtx *ctx, RedisModuleString *keyname, RedisModuleKey *key, void *privdata);
|
||||
typedef void (*RedisModuleScanKeyCB)(RedisModuleKey *key, RedisModuleString *field, RedisModuleString *value, void *privdata);
|
||||
typedef void (*RedisModuleUserChangedFunc) (uint64_t client_id, void *privdata);
|
||||
typedef int (*RedisModuleDefragFunc)(RedisModuleDefragCtx *ctx);
|
||||
typedef RedisModuleString * (*RedisModuleConfigGetStringFunc)(const char *name, void *privdata);
|
||||
typedef long long (*RedisModuleConfigGetNumericFunc)(const char *name, void *privdata);
|
||||
typedef int (*RedisModuleConfigGetBoolFunc)(const char *name, void *privdata);
|
||||
@ -834,6 +918,8 @@ typedef int (*RedisModuleConfigSetNumericFunc)(const char *name, long long val,
|
||||
typedef int (*RedisModuleConfigSetBoolFunc)(const char *name, int val, void *privdata, RedisModuleString **err);
|
||||
typedef int (*RedisModuleConfigSetEnumFunc)(const char *name, int val, void *privdata, RedisModuleString **err);
|
||||
typedef int (*RedisModuleConfigApplyFunc)(RedisModuleCtx *ctx, void *privdata, RedisModuleString **err);
|
||||
typedef void (*RedisModuleOnUnblocked)(RedisModuleCtx *ctx, RedisModuleCallReply *reply, void *private_data);
|
||||
typedef int (*RedisModuleAuthCallback)(RedisModuleCtx *ctx, RedisModuleString *username, RedisModuleString *password, RedisModuleString **err);
|
||||
|
||||
typedef struct RedisModuleTypeMethods {
|
||||
uint64_t version;
|
||||
@ -854,6 +940,7 @@ typedef struct RedisModuleTypeMethods {
|
||||
RedisModuleTypeFreeEffortFunc2 free_effort2;
|
||||
RedisModuleTypeUnlinkFunc2 unlink2;
|
||||
RedisModuleTypeCopyFunc2 copy2;
|
||||
RedisModuleTypeAuxSaveFunc aux_save2;
|
||||
} RedisModuleTypeMethods;
|
||||
|
||||
#define REDISMODULE_GET_API(name) \
|
||||
@ -880,6 +967,7 @@ REDISMODULE_API int (*RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char
|
||||
REDISMODULE_API RedisModuleCommand *(*RedisModule_GetCommand)(RedisModuleCtx *ctx, const char *name) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_CreateSubcommand)(RedisModuleCommand *parent, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_SetCommandInfo)(RedisModuleCommand *command, const RedisModuleCommandInfo *info) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_SetCommandACLCategories)(RedisModuleCommand *command, const char *ctgrsflags) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name, int ver, int apiver) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_IsModuleNameBusy)(const char *name) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_WrongArity)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
@ -888,6 +976,7 @@ REDISMODULE_API int (*RedisModule_GetSelectedDb)(RedisModuleCtx *ctx) REDISMODUL
|
||||
REDISMODULE_API int (*RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_KeyExists)(RedisModuleCtx *ctx, RedisModuleString *keyname) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleKey * (*RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetOpenKeyModesAll)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_CloseKey)(RedisModuleKey *kp) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_KeyType)(RedisModuleKey *kp) REDISMODULE_ATTR;
|
||||
REDISMODULE_API size_t (*RedisModule_ValueLength)(RedisModuleKey *kp) REDISMODULE_ATTR;
|
||||
@ -909,11 +998,14 @@ REDISMODULE_API const char* (*RedisModule_CallReplyVerbatim)(RedisModuleCallRepl
|
||||
REDISMODULE_API RedisModuleCallReply * (*RedisModule_CallReplySetElement)(RedisModuleCallReply *reply, size_t idx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_CallReplyMapElement)(RedisModuleCallReply *reply, size_t idx, RedisModuleCallReply **key, RedisModuleCallReply **val) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_CallReplyAttributeElement)(RedisModuleCallReply *reply, size_t idx, RedisModuleCallReply **key, RedisModuleCallReply **val) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_CallReplyPromiseSetUnblockHandler)(RedisModuleCallReply *reply, RedisModuleOnUnblocked on_unblock, void *private_data) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_CallReplyPromiseAbort)(RedisModuleCallReply *reply, void **private_data) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleCallReply * (*RedisModule_CallReplyAttribute)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
|
||||
REDISMODULE_API size_t (*RedisModule_CallReplyLength)(RedisModuleCallReply *reply) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleCallReply * (*RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, long long ll) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromULongLong)(RedisModuleCtx *ctx, unsigned long long ull) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromDouble)(RedisModuleCtx *ctx, double d) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromLongDouble)(RedisModuleCtx *ctx, long double ld, int humanfriendly) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str) REDISMODULE_ATTR;
|
||||
@ -922,6 +1014,7 @@ REDISMODULE_API RedisModuleString * (*RedisModule_CreateStringPrintf)(RedisModul
|
||||
REDISMODULE_API void (*RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
|
||||
REDISMODULE_API const char * (*RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ReplyWithErrorFormat)(RedisModuleCtx *ctx, const char *fmt, ...) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ReplyWithMap)(RedisModuleCtx *ctx, long len) REDISMODULE_ATTR;
|
||||
@ -947,6 +1040,7 @@ REDISMODULE_API int (*RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, double d
|
||||
REDISMODULE_API int (*RedisModule_ReplyWithBigNumber)(RedisModuleCtx *ctx, const char *bignum, size_t len) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx, RedisModuleCallReply *reply) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_StringToLongLong)(const RedisModuleString *str, long long *ll) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_StringToULongLong)(const RedisModuleString *str, unsigned long long *ull) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_StringToDouble)(const RedisModuleString *str, double *d) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_StringToLongDouble)(const RedisModuleString *str, long double *d) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_StringToStreamID)(const RedisModuleString *str, RedisModuleStreamID *id) REDISMODULE_ATTR;
|
||||
@ -999,10 +1093,12 @@ REDISMODULE_API void (*RedisModule_ChannelAtPosWithFlags)(RedisModuleCtx *ctx, i
|
||||
REDISMODULE_API unsigned long long (*RedisModule_GetClientId)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_GetClientUserNameById)(RedisModuleCtx *ctx, uint64_t id) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetClientInfoById)(void *ci, uint64_t id) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_GetClientNameById)(RedisModuleCtx *ctx, uint64_t id) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_SetClientNameById)(uint64_t id, RedisModuleString *name) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_PublishMessage)(RedisModuleCtx *ctx, RedisModuleString *channel, RedisModuleString *message) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_PublishMessageShard)(RedisModuleCtx *ctx, RedisModuleString *channel, RedisModuleString *message) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetContextFlags)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_AvoidReplicaTraffic)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_AvoidReplicaTraffic)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void * (*RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleType * (*RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value) REDISMODULE_ATTR;
|
||||
@ -1038,7 +1134,7 @@ REDISMODULE_API int (*RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, Redis
|
||||
REDISMODULE_API void (*RedisModule_TrimStringAllocation)(RedisModuleString *str) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_HoldString)(RedisModuleCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_StringCompare)(const RedisModuleString *a, const RedisModuleString *b) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleCtx * (*RedisModule_GetContextFromIO)(RedisModuleIO *io) REDISMODULE_ATTR;
|
||||
REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromIO)(RedisModuleIO *io) REDISMODULE_ATTR;
|
||||
REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromModuleKey)(RedisModuleKey *key) REDISMODULE_ATTR;
|
||||
@ -1048,8 +1144,10 @@ REDISMODULE_API int (*RedisModule_GetDbIdFromOptCtx)(RedisModuleKeyOptCtx *ctx)
|
||||
REDISMODULE_API int (*RedisModule_GetToDbIdFromOptCtx)(RedisModuleKeyOptCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromOptCtx)(RedisModuleKeyOptCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API const RedisModuleString * (*RedisModule_GetToKeyNameFromOptCtx)(RedisModuleKeyOptCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API long long (*RedisModule_Milliseconds)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API mstime_t (*RedisModule_Milliseconds)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API uint64_t (*RedisModule_MonotonicMicroseconds)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API ustime_t (*RedisModule_Microseconds)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API ustime_t (*RedisModule_CachedMicroseconds)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_DigestAddStringBuffer)(RedisModuleDigest *md, const char *ele, size_t len) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_DigestAddLongLong)(RedisModuleDigest *md, long long ele) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_DigestEndSequence)(RedisModuleDigest *md) REDISMODULE_ATTR;
|
||||
@ -1078,6 +1176,7 @@ REDISMODULE_API RedisModuleString * (*RedisModule_DictPrev)(RedisModuleCtx *ctx,
|
||||
REDISMODULE_API int (*RedisModule_DictCompareC)(RedisModuleDictIter *di, const char *op, void *key, size_t keylen) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_DictCompare)(RedisModuleDictIter *di, const char *op, RedisModuleString *key) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RegisterInfoFunc)(RedisModuleCtx *ctx, RedisModuleInfoFunc cb) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_RegisterAuthCallback)(RedisModuleCtx *ctx, RedisModuleAuthCallback cb) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_InfoAddSection)(RedisModuleInfoCtx *ctx, const char *name) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_InfoBeginDictField)(RedisModuleInfoCtx *ctx, const char *name) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_InfoEndDictField)(RedisModuleInfoCtx *ctx) REDISMODULE_ATTR;
|
||||
@ -1099,20 +1198,25 @@ REDISMODULE_API int (*RedisModule_GetLRU)(RedisModuleKey *key, mstime_t *lru_idl
|
||||
REDISMODULE_API int (*RedisModule_SetLFU)(RedisModuleKey *key, long long lfu_freq) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetLFU)(RedisModuleKey *key, long long *lfu_freq) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_BlockClientOnKeys)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(RedisModuleCtx*,void*), long long timeout_ms, RedisModuleString **keys, int numkeys, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_BlockClientOnKeysWithFlags)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(RedisModuleCtx*,void*), long long timeout_ms, RedisModuleString **keys, int numkeys, void *privdata, int flags) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_SignalKeyAsReady)(RedisModuleCtx *ctx, RedisModuleString *key) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_GetBlockedClientReadyKey)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleScanCursor * (*RedisModule_ScanCursorCreate)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleScanCursor * (*RedisModule_ScanCursorCreate)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_ScanCursorRestart)(RedisModuleScanCursor *cursor) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_ScanCursorDestroy)(RedisModuleScanCursor *cursor) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_Scan)(RedisModuleCtx *ctx, RedisModuleScanCursor *cursor, RedisModuleScanCB fn, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ScanKey)(RedisModuleKey *key, RedisModuleScanCursor *cursor, RedisModuleScanKeyCB fn, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetContextFlagsAll)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetKeyspaceNotificationFlagsAll)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetContextFlagsAll)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetModuleOptionsAll)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetKeyspaceNotificationFlagsAll)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_IsSubEventSupported)(RedisModuleEvent event, uint64_t subevent) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetServerVersion)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetTypeMethodVersion)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetServerVersion)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetTypeMethodVersion)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_Yield)(RedisModuleCtx *ctx, int flags, const char *busy_reply) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_BlockClient)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void (*free_privdata)(RedisModuleCtx*,void*), long long timeout_ms) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void * (*RedisModule_BlockClientGetPrivateData)(RedisModuleBlockedClient *blocked_client) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_BlockClientSetPrivateData)(RedisModuleBlockedClient *blocked_client, void *private_data) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleBlockedClient * (*RedisModule_BlockClientOnAuth)(RedisModuleCtx *ctx, RedisModuleAuthCallback reply_callback, void (*free_privdata)(RedisModuleCtx*,void*)) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
@ -1128,8 +1232,9 @@ REDISMODULE_API void (*RedisModule_ThreadSafeContextLock)(RedisModuleCtx *ctx) R
|
||||
REDISMODULE_API int (*RedisModule_ThreadSafeContextTryLock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_ThreadSafeContextUnlock)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_SubscribeToKeyspaceEvents)(RedisModuleCtx *ctx, int types, RedisModuleNotificationFunc cb) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_AddPostNotificationJob)(RedisModuleCtx *ctx, RedisModulePostNotificationJobFunc callback, void *pd, void (*free_pd)(void*)) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_NotifyKeyspaceEvent)(RedisModuleCtx *ctx, int type, const char *event, RedisModuleString *key) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetNotifyKeyspaceEvents)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_GetNotifyKeyspaceEvents)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_BlockedClientDisconnected)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_RegisterClusterMessageReceiver)(RedisModuleCtx *ctx, uint8_t type, RedisModuleClusterMessageReceiver callback) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_SendClusterMessage)(RedisModuleCtx *ctx, const char *target_id, uint8_t type, const char *msg, uint32_t len) REDISMODULE_ATTR;
|
||||
@ -1158,19 +1263,24 @@ REDISMODULE_API int (*RedisModule_Fork)(RedisModuleForkDoneHandler cb, void *use
|
||||
REDISMODULE_API void (*RedisModule_SendChildHeartbeat)(double progress) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ExitFromChild)(int retcode) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_KillForkChild)(int child_pid) REDISMODULE_ATTR;
|
||||
REDISMODULE_API float (*RedisModule_GetUsedMemoryRatio)() REDISMODULE_ATTR;
|
||||
REDISMODULE_API float (*RedisModule_GetUsedMemoryRatio)(void) REDISMODULE_ATTR;
|
||||
REDISMODULE_API size_t (*RedisModule_MallocSize)(void* ptr) REDISMODULE_ATTR;
|
||||
REDISMODULE_API size_t (*RedisModule_MallocUsableSize)(void *ptr) REDISMODULE_ATTR;
|
||||
REDISMODULE_API size_t (*RedisModule_MallocSizeString)(RedisModuleString* str) REDISMODULE_ATTR;
|
||||
REDISMODULE_API size_t (*RedisModule_MallocSizeDict)(RedisModuleDict* dict) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleUser * (*RedisModule_CreateModuleUser)(const char *name) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_FreeModuleUser)(RedisModuleUser *user) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_SetContextUser)(RedisModuleCtx *ctx, const RedisModuleUser *user) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_SetModuleUserACL)(RedisModuleUser *user, const char* acl) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_SetModuleUserACLString)(RedisModuleCtx * ctx, RedisModuleUser *user, const char* acl, RedisModuleString **error) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_GetModuleUserACLString)(RedisModuleUser *user) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleString * (*RedisModule_GetCurrentUserName)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleUser * (*RedisModule_GetModuleUserFromUserName)(RedisModuleString *name) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ACLCheckCommandPermissions)(RedisModuleUser *user, RedisModuleString **argv, int argc) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ACLCheckKeyPermissions)(RedisModuleUser *user, RedisModuleString *key, int flags) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_ACLCheckChannelPermissions)(RedisModuleUser *user, RedisModuleString *ch, int literal) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_ACLAddLogEntry)(RedisModuleCtx *ctx, RedisModuleUser *user, RedisModuleString *object, RedisModuleACLLogEntryReason reason) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_ACLAddLogEntryByUserName)(RedisModuleCtx *ctx, RedisModuleString *user, RedisModuleString *object, RedisModuleACLLogEntryReason reason) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_AuthenticateClientWithACLUser)(RedisModuleCtx *ctx, const char *name, size_t len, RedisModuleUserChangedFunc callback, void *privdata, uint64_t *client_id) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_AuthenticateClientWithUser)(RedisModuleCtx *ctx, RedisModuleUser *user, RedisModuleUserChangedFunc callback, void *privdata, uint64_t *client_id) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_DeauthenticateAndCloseClient)(RedisModuleCtx *ctx, uint64_t client_id) REDISMODULE_ATTR;
|
||||
@ -1190,11 +1300,15 @@ REDISMODULE_API const RedisModuleString * (*RedisModule_GetKeyNameFromDefragCtx)
|
||||
REDISMODULE_API int (*RedisModule_EventLoopAdd)(int fd, int mask, RedisModuleEventLoopFunc func, void *user_data) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_EventLoopDel)(int fd, int mask) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_EventLoopAddOneShot)(RedisModuleEventLoopOneShotFunc func, void *user_data) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RegisterBoolConfig)(RedisModuleCtx *ctx, char *name, int default_val, unsigned int flags, RedisModuleConfigGetBoolFunc getfn, RedisModuleConfigSetBoolFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RegisterBoolConfig)(RedisModuleCtx *ctx, const char *name, int default_val, unsigned int flags, RedisModuleConfigGetBoolFunc getfn, RedisModuleConfigSetBoolFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RegisterNumericConfig)(RedisModuleCtx *ctx, const char *name, long long default_val, unsigned int flags, long long min, long long max, RedisModuleConfigGetNumericFunc getfn, RedisModuleConfigSetNumericFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RegisterStringConfig)(RedisModuleCtx *ctx, const char *name, const char *default_val, unsigned int flags, RedisModuleConfigGetStringFunc getfn, RedisModuleConfigSetStringFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RegisterEnumConfig)(RedisModuleCtx *ctx, const char *name, int default_val, unsigned int flags, const char **enum_values, const int *int_values, int num_enum_vals, RedisModuleConfigGetEnumFunc getfn, RedisModuleConfigSetEnumFunc setfn, RedisModuleConfigApplyFunc applyfn, void *privdata) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_LoadConfigs)(RedisModuleCtx *ctx) REDISMODULE_ATTR;
|
||||
REDISMODULE_API RedisModuleRdbStream *(*RedisModule_RdbStreamCreateFromFile)(const char *filename) REDISMODULE_ATTR;
|
||||
REDISMODULE_API void (*RedisModule_RdbStreamFree)(RedisModuleRdbStream *stream) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RdbLoad)(RedisModuleCtx *ctx, RedisModuleRdbStream *stream, int flags) REDISMODULE_ATTR;
|
||||
REDISMODULE_API int (*RedisModule_RdbSave)(RedisModuleCtx *ctx, RedisModuleRdbStream *stream, int flags) REDISMODULE_ATTR;
|
||||
|
||||
#define RedisModule_IsAOFClient(id) ((id) == UINT64_MAX)
|
||||
|
||||
@ -1213,11 +1327,13 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(GetCommand);
|
||||
REDISMODULE_GET_API(CreateSubcommand);
|
||||
REDISMODULE_GET_API(SetCommandInfo);
|
||||
REDISMODULE_GET_API(SetCommandACLCategories);
|
||||
REDISMODULE_GET_API(SetModuleAttribs);
|
||||
REDISMODULE_GET_API(IsModuleNameBusy);
|
||||
REDISMODULE_GET_API(WrongArity);
|
||||
REDISMODULE_GET_API(ReplyWithLongLong);
|
||||
REDISMODULE_GET_API(ReplyWithError);
|
||||
REDISMODULE_GET_API(ReplyWithErrorFormat);
|
||||
REDISMODULE_GET_API(ReplyWithSimpleString);
|
||||
REDISMODULE_GET_API(ReplyWithArray);
|
||||
REDISMODULE_GET_API(ReplyWithMap);
|
||||
@ -1246,6 +1362,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(SelectDb);
|
||||
REDISMODULE_GET_API(KeyExists);
|
||||
REDISMODULE_GET_API(OpenKey);
|
||||
REDISMODULE_GET_API(GetOpenKeyModesAll);
|
||||
REDISMODULE_GET_API(CloseKey);
|
||||
REDISMODULE_GET_API(KeyType);
|
||||
REDISMODULE_GET_API(ValueLength);
|
||||
@ -1256,6 +1373,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(ListInsert);
|
||||
REDISMODULE_GET_API(ListDelete);
|
||||
REDISMODULE_GET_API(StringToLongLong);
|
||||
REDISMODULE_GET_API(StringToULongLong);
|
||||
REDISMODULE_GET_API(StringToDouble);
|
||||
REDISMODULE_GET_API(StringToLongDouble);
|
||||
REDISMODULE_GET_API(StringToStreamID);
|
||||
@ -1270,6 +1388,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(CallReplySetElement);
|
||||
REDISMODULE_GET_API(CallReplyMapElement);
|
||||
REDISMODULE_GET_API(CallReplyAttributeElement);
|
||||
REDISMODULE_GET_API(CallReplyPromiseSetUnblockHandler);
|
||||
REDISMODULE_GET_API(CallReplyPromiseAbort);
|
||||
REDISMODULE_GET_API(CallReplyAttribute);
|
||||
REDISMODULE_GET_API(CallReplyType);
|
||||
REDISMODULE_GET_API(CallReplyLength);
|
||||
@ -1278,6 +1398,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(CreateStringFromCallReply);
|
||||
REDISMODULE_GET_API(CreateString);
|
||||
REDISMODULE_GET_API(CreateStringFromLongLong);
|
||||
REDISMODULE_GET_API(CreateStringFromULongLong);
|
||||
REDISMODULE_GET_API(CreateStringFromDouble);
|
||||
REDISMODULE_GET_API(CreateStringFromLongDouble);
|
||||
REDISMODULE_GET_API(CreateStringFromString);
|
||||
@ -1380,6 +1501,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(GetToDbIdFromOptCtx);
|
||||
REDISMODULE_GET_API(Milliseconds);
|
||||
REDISMODULE_GET_API(MonotonicMicroseconds);
|
||||
REDISMODULE_GET_API(Microseconds);
|
||||
REDISMODULE_GET_API(CachedMicroseconds);
|
||||
REDISMODULE_GET_API(DigestAddStringBuffer);
|
||||
REDISMODULE_GET_API(DigestAddLongLong);
|
||||
REDISMODULE_GET_API(DigestEndSequence);
|
||||
@ -1408,6 +1531,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(DictCompare);
|
||||
REDISMODULE_GET_API(DictCompareC);
|
||||
REDISMODULE_GET_API(RegisterInfoFunc);
|
||||
REDISMODULE_GET_API(RegisterAuthCallback);
|
||||
REDISMODULE_GET_API(InfoAddSection);
|
||||
REDISMODULE_GET_API(InfoBeginDictField);
|
||||
REDISMODULE_GET_API(InfoEndDictField);
|
||||
@ -1424,6 +1548,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(ServerInfoGetFieldUnsigned);
|
||||
REDISMODULE_GET_API(ServerInfoGetFieldDouble);
|
||||
REDISMODULE_GET_API(GetClientInfoById);
|
||||
REDISMODULE_GET_API(GetClientNameById);
|
||||
REDISMODULE_GET_API(SetClientNameById);
|
||||
REDISMODULE_GET_API(PublishMessage);
|
||||
REDISMODULE_GET_API(PublishMessageShard);
|
||||
REDISMODULE_GET_API(SubscribeToServerEvent);
|
||||
@ -1432,6 +1558,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(SetLFU);
|
||||
REDISMODULE_GET_API(GetLFU);
|
||||
REDISMODULE_GET_API(BlockClientOnKeys);
|
||||
REDISMODULE_GET_API(BlockClientOnKeysWithFlags);
|
||||
REDISMODULE_GET_API(SignalKeyAsReady);
|
||||
REDISMODULE_GET_API(GetBlockedClientReadyKey);
|
||||
REDISMODULE_GET_API(ScanCursorCreate);
|
||||
@ -1440,6 +1567,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(Scan);
|
||||
REDISMODULE_GET_API(ScanKey);
|
||||
REDISMODULE_GET_API(GetContextFlagsAll);
|
||||
REDISMODULE_GET_API(GetModuleOptionsAll);
|
||||
REDISMODULE_GET_API(GetKeyspaceNotificationFlagsAll);
|
||||
REDISMODULE_GET_API(IsSubEventSupported);
|
||||
REDISMODULE_GET_API(GetServerVersion);
|
||||
@ -1452,6 +1580,9 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(ThreadSafeContextTryLock);
|
||||
REDISMODULE_GET_API(ThreadSafeContextUnlock);
|
||||
REDISMODULE_GET_API(BlockClient);
|
||||
REDISMODULE_GET_API(BlockClientGetPrivateData);
|
||||
REDISMODULE_GET_API(BlockClientSetPrivateData);
|
||||
REDISMODULE_GET_API(BlockClientOnAuth);
|
||||
REDISMODULE_GET_API(UnblockClient);
|
||||
REDISMODULE_GET_API(IsBlockedReplyRequest);
|
||||
REDISMODULE_GET_API(IsBlockedTimeoutRequest);
|
||||
@ -1462,6 +1593,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(BlockedClientMeasureTimeEnd);
|
||||
REDISMODULE_GET_API(SetDisconnectCallback);
|
||||
REDISMODULE_GET_API(SubscribeToKeyspaceEvents);
|
||||
REDISMODULE_GET_API(AddPostNotificationJob);
|
||||
REDISMODULE_GET_API(NotifyKeyspaceEvent);
|
||||
REDISMODULE_GET_API(GetNotifyKeyspaceEvents);
|
||||
REDISMODULE_GET_API(BlockedClientDisconnected);
|
||||
@ -1493,17 +1625,22 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(KillForkChild);
|
||||
REDISMODULE_GET_API(GetUsedMemoryRatio);
|
||||
REDISMODULE_GET_API(MallocSize);
|
||||
REDISMODULE_GET_API(MallocUsableSize);
|
||||
REDISMODULE_GET_API(MallocSizeString);
|
||||
REDISMODULE_GET_API(MallocSizeDict);
|
||||
REDISMODULE_GET_API(CreateModuleUser);
|
||||
REDISMODULE_GET_API(FreeModuleUser);
|
||||
REDISMODULE_GET_API(SetContextUser);
|
||||
REDISMODULE_GET_API(SetModuleUserACL);
|
||||
REDISMODULE_GET_API(SetModuleUserACLString);
|
||||
REDISMODULE_GET_API(GetModuleUserACLString);
|
||||
REDISMODULE_GET_API(GetCurrentUserName);
|
||||
REDISMODULE_GET_API(GetModuleUserFromUserName);
|
||||
REDISMODULE_GET_API(ACLCheckCommandPermissions);
|
||||
REDISMODULE_GET_API(ACLCheckKeyPermissions);
|
||||
REDISMODULE_GET_API(ACLCheckChannelPermissions);
|
||||
REDISMODULE_GET_API(ACLAddLogEntry);
|
||||
REDISMODULE_GET_API(ACLAddLogEntryByUserName);
|
||||
REDISMODULE_GET_API(DeauthenticateAndCloseClient);
|
||||
REDISMODULE_GET_API(AuthenticateClientWithACLUser);
|
||||
REDISMODULE_GET_API(AuthenticateClientWithUser);
|
||||
@ -1528,6 +1665,10 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
REDISMODULE_GET_API(RegisterStringConfig);
|
||||
REDISMODULE_GET_API(RegisterEnumConfig);
|
||||
REDISMODULE_GET_API(LoadConfigs);
|
||||
REDISMODULE_GET_API(RdbStreamCreateFromFile);
|
||||
REDISMODULE_GET_API(RdbStreamFree);
|
||||
REDISMODULE_GET_API(RdbLoad);
|
||||
REDISMODULE_GET_API(RdbSave);
|
||||
|
||||
if (RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR;
|
||||
RedisModule_SetModuleAttribs(ctx,name,ver,apiver);
|
||||
@ -1538,11 +1679,5 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
|
||||
|
||||
#define RMAPI_FUNC_SUPPORTED(func) (func != NULL)
|
||||
|
||||
#else
|
||||
|
||||
/* Things only defined for the modules core, not exported to modules
|
||||
* including this file. */
|
||||
#define RedisModuleString robj
|
||||
|
||||
#endif /* REDISMODULE_CORE */
|
||||
#endif /* REDISMODULE_H */
|
||||
|
Loading…
Reference in New Issue
Block a user