├── README.md ├── exp.dll ├── exp.sln ├── exp ├── exp.c ├── exp.vcxproj ├── exp.vcxproj.filters ├── exp.vcxproj.user ├── redismodule.h └── win32_port.h └── pic └── 1625563551991.png /README.md: -------------------------------------------------------------------------------- 1 | # RedisModules ExecuteCommand for Windows 2 | 可在Windows下执行系统命令的Redis模块 。 3 | 可在Linux下执行系统命令的Redis模块在 ![这里](https://github.com/puckiestyle/RedisModules-ExecuteCommand) 4 | 5 | ## 快速开始 6 | 已经有编译好了的模块`exp.dll`,你也可以自行修改、编译,以下是可参考的的步骤: 7 | 1. 用vs2017打开exp.sln文件。 8 | 2. 修改exp.c源文件。 9 | 2. 编译生成模块`exp.dll` 。 10 | 4. 在Redis中加载`exp.dll`,并使用模块的命令 。 11 | 12 | ## 模块命令 13 | 该模块有一个命令`e`,可以执行系统命令。 14 | 在redis-cli命令行下,执行如下命令: 15 | 16 | ``` 17 | 127.0.0.1:6379> module load exp.dll 18 | 127.0.0.1:6379> exp.e whoami 19 | 127.0.0.1:6379> exp.e net user 20 | ``` 21 | 22 | ![62556355199](pic/1625563551991.png) 23 | 24 | ## 反馈 25 | Mail:h.vi@qq.com 26 | 或者 [issue](https://github.com/0671/RedisModules-ExecuteCommand-for-Windows/issues/new)、PR 27 | 28 | ## Stargazers over time 29 | 30 | [![Stargazers over time](https://starchart.cc/0671/RedisModules-ExecuteCommand-for-Windows.svg)](https://github.com/0671/RedisModules-ExecuteCommand-for-Windows) 31 | -------------------------------------------------------------------------------- /exp.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0671/RedisModules-ExecuteCommand-for-Windows/08642e0feeb392eecbb5974a2190693fcd9330ba/exp.dll -------------------------------------------------------------------------------- /exp.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28307.489 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exp", "exp\exp.vcxproj", "{D9081C23-553E-47EA-80C8-FE534EF58EAB}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x64.ActiveCfg = Debug|x64 17 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x64.Build.0 = Debug|x64 18 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x86.ActiveCfg = Debug|Win32 19 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x86.Build.0 = Debug|Win32 20 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x64.ActiveCfg = Release|x64 21 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x64.Build.0 = Release|x64 22 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x86.ActiveCfg = Release|Win32 23 | {D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {D3DED947-B683-4C24-9AFB-2CC3B9BF1B49} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /exp/exp.c: -------------------------------------------------------------------------------- 1 | #define _CRT_SECURE_NO_WARNINGS 2 | #include 3 | #include 4 | #include "win32_port.h" 5 | #include "redismodule.h" 6 | #ifdef _WIN32 7 | #define strncasecmp(s1, s2, len) _strnicmp(s1, s2, len) 8 | #define strcasecmp(s1, s2) _stricmp(s1, s2) 9 | #endif 10 | 11 | 12 | 13 | char * join(char*s1, char*s2) { 14 | char *result = malloc(strlen(s1) + strlen(s2) + 1 + 1); 15 | if (result == NULL) exit(1); 16 | strcpy(result, s1); 17 | strcat(result, " "); 18 | strcat(result, s2); 19 | return result; 20 | } 21 | 22 | 23 | int DoCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { 24 | 25 | char *_cmd; 26 | size_t _cmd_len; 27 | size_t size = 1024; //µ¥Î» 28 | char *all_cmd = ""; 29 | if (argc >= 2) 30 | { 31 | for (size_t i = 1; i < argc; i++) 32 | { 33 | _cmd = RedisModule_StringPtrLen(argv[i], &_cmd_len); 34 | all_cmd = join(all_cmd, _cmd); 35 | } 36 | 37 | FILE *fp = _popen(all_cmd, "r"); 38 | char *buf, *output; 39 | buf = (char *)malloc(size); 40 | output = "{"; 41 | 42 | while (fgets(buf, sizeof(buf), fp) != 0) { 43 | output = join(output, buf); 44 | } 45 | output = join(output, "}"); 46 | RedisModuleString *ret = RedisModule_CreateString(ctx, output, strlen(output)); 47 | RedisModule_ReplyWithString(ctx, ret); 48 | _pclose(fp); 49 | } 50 | return REDISMODULE_OK; 51 | } 52 | 53 | #ifdef _WIN32 54 | __declspec(dllexport) 55 | #endif 56 | int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { 57 | // Register the module 58 | if (RedisModule_Init(ctx, "exp", 1, REDISMODULE_APIVER_1) == 59 | REDISMODULE_ERR) 60 | return REDISMODULE_ERR; 61 | 62 | if (RedisModule_CreateCommand(ctx, "exp.e", DoCommand, "readonly", 1, 1, 1) == 63 | REDISMODULE_ERR) 64 | return REDISMODULE_ERR; 65 | 66 | return REDISMODULE_OK; 67 | } -------------------------------------------------------------------------------- /exp/exp.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {D9081C23-553E-47EA-80C8-FE534EF58EAB} 24 | Win32Proj 25 | exp 26 | 10.0.17763.0 27 | 28 | 29 | 30 | DynamicLibrary 31 | true 32 | v141 33 | Unicode 34 | 35 | 36 | DynamicLibrary 37 | false 38 | v141 39 | true 40 | Unicode 41 | 42 | 43 | DynamicLibrary 44 | true 45 | v141 46 | Unicode 47 | 48 | 49 | DynamicLibrary 50 | false 51 | v141 52 | true 53 | Unicode 54 | false 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | true 76 | 77 | 78 | true 79 | 80 | 81 | false 82 | 83 | 84 | false 85 | 86 | 87 | 88 | Use 89 | Level3 90 | Disabled 91 | true 92 | WIN32;_DEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 93 | true 94 | 95 | 96 | Windows 97 | true 98 | 99 | 100 | 101 | 102 | Use 103 | Level3 104 | Disabled 105 | true 106 | _DEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 107 | true 108 | 109 | 110 | Windows 111 | true 112 | 113 | 114 | 115 | 116 | Use 117 | Level3 118 | MaxSpeed 119 | true 120 | true 121 | true 122 | WIN32;NDEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 123 | true 124 | 125 | 126 | Windows 127 | true 128 | true 129 | true 130 | 131 | 132 | 133 | 134 | NotUsing 135 | Level3 136 | MaxSpeed 137 | true 138 | true 139 | true 140 | NDEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 141 | true 142 | 143 | 144 | Windows 145 | true 146 | true 147 | true 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /exp/exp.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 头文件 20 | 21 | 22 | 头文件 23 | 24 | 25 | 26 | 27 | 源文件 28 | 29 | 30 | -------------------------------------------------------------------------------- /exp/exp.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /exp/redismodule.h: -------------------------------------------------------------------------------- 1 | #ifndef REDISMODULE_H 2 | #define REDISMODULE_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include "win32_port.h" 9 | 10 | /* ---------------- Defines common between core and modules --------------- */ 11 | 12 | /* Error status return values. */ 13 | #define REDISMODULE_OK 0 14 | #define REDISMODULE_ERR 1 15 | 16 | /* API versions. */ 17 | #define REDISMODULE_APIVER_1 1 18 | 19 | /* API flags and constants */ 20 | #define REDISMODULE_READ (1<<0) 21 | #define REDISMODULE_WRITE (1<<1) 22 | 23 | #define REDISMODULE_LIST_HEAD 0 24 | #define REDISMODULE_LIST_TAIL 1 25 | 26 | /* Key types. */ 27 | #define REDISMODULE_KEYTYPE_EMPTY 0 28 | #define REDISMODULE_KEYTYPE_STRING 1 29 | #define REDISMODULE_KEYTYPE_LIST 2 30 | #define REDISMODULE_KEYTYPE_HASH 3 31 | #define REDISMODULE_KEYTYPE_SET 4 32 | #define REDISMODULE_KEYTYPE_ZSET 5 33 | #define REDISMODULE_KEYTYPE_MODULE 6 34 | 35 | /* Reply types. */ 36 | #define REDISMODULE_REPLY_UNKNOWN -1 37 | #define REDISMODULE_REPLY_STRING 0 38 | #define REDISMODULE_REPLY_ERROR 1 39 | #define REDISMODULE_REPLY_INTEGER 2 40 | #define REDISMODULE_REPLY_ARRAY 3 41 | #define REDISMODULE_REPLY_NULL 4 42 | 43 | /* Postponed array length. */ 44 | #define REDISMODULE_POSTPONED_ARRAY_LEN -1 45 | 46 | /* Expire */ 47 | #define REDISMODULE_NO_EXPIRE -1 48 | 49 | /* Sorted set API flags. */ 50 | #define REDISMODULE_ZADD_XX (1<<0) 51 | #define REDISMODULE_ZADD_NX (1<<1) 52 | #define REDISMODULE_ZADD_ADDED (1<<2) 53 | #define REDISMODULE_ZADD_UPDATED (1<<3) 54 | #define REDISMODULE_ZADD_NOP (1<<4) 55 | 56 | /* Hash API flags. */ 57 | #define REDISMODULE_HASH_NONE 0 58 | #define REDISMODULE_HASH_NX (1<<0) 59 | #define REDISMODULE_HASH_XX (1<<1) 60 | #define REDISMODULE_HASH_CFIELDS (1<<2) 61 | #define REDISMODULE_HASH_EXISTS (1<<3) 62 | 63 | /* A special pointer that we can use between the core and the module to signal 64 | * field deletion, and that is impossible to be a valid pointer. */ 65 | #define REDISMODULE_HASH_DELETE ((RedisModuleString*)(PORT_LONG)1) 66 | 67 | /* Error messages. */ 68 | #define REDISMODULE_ERRORMSG_WRONGTYPE "WRONGTYPE Operation against a key holding the wrong kind of value" 69 | 70 | #define REDISMODULE_POSITIVE_INFINITE (1.0/0.0) 71 | #define REDISMODULE_NEGATIVE_INFINITE (-1.0/0.0) 72 | 73 | #define REDISMODULE_NOT_USED(V) ((void) V) 74 | 75 | /* ------------------------- End of common defines ------------------------ */ 76 | 77 | #ifndef REDISMODULE_CORE 78 | 79 | typedef PORT_LONGLONG mstime_t; 80 | 81 | /* Incomplete structures for compiler checks but opaque access. */ 82 | typedef struct RedisModuleCtx RedisModuleCtx; 83 | typedef struct RedisModuleKey RedisModuleKey; 84 | typedef struct RedisModuleString RedisModuleString; 85 | typedef struct RedisModuleCallReply RedisModuleCallReply; 86 | typedef struct RedisModuleIO RedisModuleIO; 87 | typedef struct RedisModuleType RedisModuleType; 88 | typedef struct RedisModuleDigest RedisModuleDigest; 89 | typedef struct RedisModuleBlockedClient RedisModuleBlockedClient; 90 | 91 | typedef int(*RedisModuleCmdFunc) (RedisModuleCtx *ctx, RedisModuleString **argv, int argc); 92 | 93 | typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver); 94 | typedef void(*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value); 95 | typedef void(*RedisModuleTypeRewriteFunc)(RedisModuleIO *aof, RedisModuleString *key, void *value); 96 | typedef size_t(*RedisModuleTypeMemUsageFunc)(const void *value); 97 | typedef void(*RedisModuleTypeDigestFunc)(RedisModuleDigest *digest, void *value); 98 | typedef void(*RedisModuleTypeFreeFunc)(void *value); 99 | 100 | #define REDISMODULE_TYPE_METHOD_VERSION 1 101 | typedef struct RedisModuleTypeMethods { 102 | uint64_t version; 103 | RedisModuleTypeLoadFunc rdb_load; 104 | RedisModuleTypeSaveFunc rdb_save; 105 | RedisModuleTypeRewriteFunc aof_rewrite; 106 | RedisModuleTypeMemUsageFunc mem_usage; 107 | RedisModuleTypeDigestFunc digest; 108 | RedisModuleTypeFreeFunc free; 109 | } RedisModuleTypeMethods; 110 | 111 | #define REDISMODULE_GET_API(name) \ 112 | RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name)) 113 | 114 | #define REDISMODULE_API_FUNC(x) (*x) 115 | 116 | 117 | void *REDISMODULE_API_FUNC(RedisModule_Alloc)(size_t bytes); 118 | void *REDISMODULE_API_FUNC(RedisModule_Realloc)(void *ptr, size_t bytes); 119 | void REDISMODULE_API_FUNC(RedisModule_Free)(void *ptr); 120 | void *REDISMODULE_API_FUNC(RedisModule_Calloc)(size_t nmemb, size_t size); 121 | char *REDISMODULE_API_FUNC(RedisModule_Strdup)(const char *str); 122 | int REDISMODULE_API_FUNC(RedisModule_GetApi)(const char *, void *); 123 | int REDISMODULE_API_FUNC(RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep); 124 | int REDISMODULE_API_FUNC(RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name, int ver, int apiver); 125 | int REDISMODULE_API_FUNC(RedisModule_WrongArity)(RedisModuleCtx *ctx); 126 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithLongLong)(RedisModuleCtx *ctx, PORT_LONGLONG ll); 127 | int REDISMODULE_API_FUNC(RedisModule_GetSelectedDb)(RedisModuleCtx *ctx); 128 | int REDISMODULE_API_FUNC(RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid); 129 | void *REDISMODULE_API_FUNC(RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode); 130 | void REDISMODULE_API_FUNC(RedisModule_CloseKey)(RedisModuleKey *kp); 131 | int REDISMODULE_API_FUNC(RedisModule_KeyType)(RedisModuleKey *kp); 132 | size_t REDISMODULE_API_FUNC(RedisModule_ValueLength)(RedisModuleKey *kp); 133 | int REDISMODULE_API_FUNC(RedisModule_ListPush)(RedisModuleKey *kp, int where, RedisModuleString *ele); 134 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ListPop)(RedisModuleKey *key, int where); 135 | RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_Call)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...); 136 | const char *REDISMODULE_API_FUNC(RedisModule_CallReplyProto)(RedisModuleCallReply *reply, size_t *len); 137 | void REDISMODULE_API_FUNC(RedisModule_FreeCallReply)(RedisModuleCallReply *reply); 138 | int REDISMODULE_API_FUNC(RedisModule_CallReplyType)(RedisModuleCallReply *reply); 139 | PORT_LONGLONG REDISMODULE_API_FUNC(RedisModule_CallReplyInteger)(RedisModuleCallReply *reply); 140 | size_t REDISMODULE_API_FUNC(RedisModule_CallReplyLength)(RedisModuleCallReply *reply); 141 | RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx); 142 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len); 143 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, PORT_LONGLONG ll); 144 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str); 145 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...); 146 | void REDISMODULE_API_FUNC(RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str); 147 | const char *REDISMODULE_API_FUNC(RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len); 148 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err); 149 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg); 150 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, PORT_LONG len); 151 | void REDISMODULE_API_FUNC(RedisModule_ReplySetArrayLength)(RedisModuleCtx *ctx, PORT_LONG len); 152 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithStringBuffer)(RedisModuleCtx *ctx, const char *buf, size_t len); 153 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithString)(RedisModuleCtx *ctx, RedisModuleString *str); 154 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithNull)(RedisModuleCtx *ctx); 155 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, PORT_LONGDOUBLE d); 156 | int REDISMODULE_API_FUNC(RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx, RedisModuleCallReply *reply); 157 | int REDISMODULE_API_FUNC(RedisModule_StringToLongLong)(const RedisModuleString *str, PORT_LONGLONG *ll); 158 | int REDISMODULE_API_FUNC(RedisModule_StringToDouble)(const RedisModuleString *str, PORT_LONGDOUBLE *d); 159 | void REDISMODULE_API_FUNC(RedisModule_AutoMemory)(RedisModuleCtx *ctx); 160 | int REDISMODULE_API_FUNC(RedisModule_Replicate)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...); 161 | int REDISMODULE_API_FUNC(RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx); 162 | const char *REDISMODULE_API_FUNC(RedisModule_CallReplyStringPtr)(RedisModuleCallReply *reply, size_t *len); 163 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromCallReply)(RedisModuleCallReply *reply); 164 | int REDISMODULE_API_FUNC(RedisModule_DeleteKey)(RedisModuleKey *key); 165 | int REDISMODULE_API_FUNC(RedisModule_StringSet)(RedisModuleKey *key, RedisModuleString *str); 166 | char *REDISMODULE_API_FUNC(RedisModule_StringDMA)(RedisModuleKey *key, size_t *len, int mode); 167 | int REDISMODULE_API_FUNC(RedisModule_StringTruncate)(RedisModuleKey *key, size_t newlen); 168 | mstime_t REDISMODULE_API_FUNC(RedisModule_GetExpire)(RedisModuleKey *key); 169 | int REDISMODULE_API_FUNC(RedisModule_SetExpire)(RedisModuleKey *key, mstime_t expire); 170 | int REDISMODULE_API_FUNC(RedisModule_ZsetAdd)(RedisModuleKey *key, PORT_LONGDOUBLE score, RedisModuleString *ele, int *flagsptr); 171 | int REDISMODULE_API_FUNC(RedisModule_ZsetIncrby)(RedisModuleKey *key, PORT_LONGDOUBLE score, RedisModuleString *ele, int *flagsptr, PORT_LONGDOUBLE *newscore); 172 | int REDISMODULE_API_FUNC(RedisModule_ZsetScore)(RedisModuleKey *key, RedisModuleString *ele, PORT_LONGDOUBLE *score); 173 | int REDISMODULE_API_FUNC(RedisModule_ZsetRem)(RedisModuleKey *key, RedisModuleString *ele, int *deleted); 174 | void REDISMODULE_API_FUNC(RedisModule_ZsetRangeStop)(RedisModuleKey *key); 175 | int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInScoreRange)(RedisModuleKey *key, PORT_LONGDOUBLE min, PORT_LONGDOUBLE max, int minex, int maxex); 176 | int REDISMODULE_API_FUNC(RedisModule_ZsetLastInScoreRange)(RedisModuleKey *key, PORT_LONGDOUBLE min, PORT_LONGDOUBLE max, int minex, int maxex); 177 | int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max); 178 | int REDISMODULE_API_FUNC(RedisModule_ZsetLastInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max); 179 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ZsetRangeCurrentElement)(RedisModuleKey *key, PORT_LONGDOUBLE *score); 180 | int REDISMODULE_API_FUNC(RedisModule_ZsetRangeNext)(RedisModuleKey *key); 181 | int REDISMODULE_API_FUNC(RedisModule_ZsetRangePrev)(RedisModuleKey *key); 182 | int REDISMODULE_API_FUNC(RedisModule_ZsetRangeEndReached)(RedisModuleKey *key); 183 | int REDISMODULE_API_FUNC(RedisModule_HashSet)(RedisModuleKey *key, int flags, ...); 184 | int REDISMODULE_API_FUNC(RedisModule_HashGet)(RedisModuleKey *key, int flags, ...); 185 | int REDISMODULE_API_FUNC(RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx); 186 | void REDISMODULE_API_FUNC(RedisModule_KeyAtPos)(RedisModuleCtx *ctx, int pos); 187 | PORT_ULONGLONG REDISMODULE_API_FUNC(RedisModule_GetClientId)(RedisModuleCtx *ctx); 188 | void *REDISMODULE_API_FUNC(RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes); 189 | RedisModuleType *REDISMODULE_API_FUNC(RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods); 190 | int REDISMODULE_API_FUNC(RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value); 191 | RedisModuleType *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetType)(RedisModuleKey *key); 192 | void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetValue)(RedisModuleKey *key); 193 | void REDISMODULE_API_FUNC(RedisModule_SaveUnsigned)(RedisModuleIO *io, uint64_t value); 194 | uint64_t REDISMODULE_API_FUNC(RedisModule_LoadUnsigned)(RedisModuleIO *io); 195 | void REDISMODULE_API_FUNC(RedisModule_SaveSigned)(RedisModuleIO *io, int64_t value); 196 | int64_t REDISMODULE_API_FUNC(RedisModule_LoadSigned)(RedisModuleIO *io); 197 | void REDISMODULE_API_FUNC(RedisModule_EmitAOF)(RedisModuleIO *io, const char *cmdname, const char *fmt, ...); 198 | void REDISMODULE_API_FUNC(RedisModule_SaveString)(RedisModuleIO *io, RedisModuleString *s); 199 | void REDISMODULE_API_FUNC(RedisModule_SaveStringBuffer)(RedisModuleIO *io, const char *str, size_t len); 200 | RedisModuleString *REDISMODULE_API_FUNC(RedisModule_LoadString)(RedisModuleIO *io); 201 | char *REDISMODULE_API_FUNC(RedisModule_LoadStringBuffer)(RedisModuleIO *io, size_t *lenptr); 202 | void REDISMODULE_API_FUNC(RedisModule_SaveDouble)(RedisModuleIO *io, PORT_LONGDOUBLE value); 203 | PORT_LONGDOUBLE REDISMODULE_API_FUNC(RedisModule_LoadDouble)(RedisModuleIO *io); 204 | void REDISMODULE_API_FUNC(RedisModule_SaveFloat)(RedisModuleIO *io, float value); 205 | float REDISMODULE_API_FUNC(RedisModule_LoadFloat)(RedisModuleIO *io); 206 | void REDISMODULE_API_FUNC(RedisModule_Log)(RedisModuleCtx *ctx, const char *level, const char *fmt, ...); 207 | void REDISMODULE_API_FUNC(RedisModule_LogIOError)(RedisModuleIO *io, const char *levelstr, const char *fmt, ...); 208 | int REDISMODULE_API_FUNC(RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, RedisModuleString *str, const char *buf, size_t len); 209 | void REDISMODULE_API_FUNC(RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str); 210 | int REDISMODULE_API_FUNC(RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b); 211 | RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetContextFromIO)(RedisModuleIO *io); 212 | RedisModuleBlockedClient *REDISMODULE_API_FUNC(RedisModule_BlockClient)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void(*free_privdata)(void*), PORT_LONGLONG timeout_ms); 213 | int REDISMODULE_API_FUNC(RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata); 214 | int REDISMODULE_API_FUNC(RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx); 215 | int REDISMODULE_API_FUNC(RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx); 216 | void *REDISMODULE_API_FUNC(RedisModule_GetBlockedClientPrivateData)(RedisModuleCtx *ctx); 217 | int REDISMODULE_API_FUNC(RedisModule_AbortBlock)(RedisModuleBlockedClient *bc); 218 | PORT_LONGLONG REDISMODULE_API_FUNC(RedisModule_Milliseconds)(void); 219 | 220 | /* This is included inline inside each Redis module. */ 221 | static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) 222 | #ifndef _WIN32 223 | __attribute__((unused)); 224 | #else 225 | ; 226 | #endif 227 | static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) { 228 | void *getapifuncptr = ((void**)ctx)[0]; 229 | RedisModule_GetApi = (int(*)(const char *, void *)) (PORT_ULONG)getapifuncptr; 230 | REDISMODULE_GET_API(Alloc); 231 | REDISMODULE_GET_API(Calloc); 232 | REDISMODULE_GET_API(Free); 233 | REDISMODULE_GET_API(Realloc); 234 | REDISMODULE_GET_API(Strdup); 235 | REDISMODULE_GET_API(CreateCommand); 236 | REDISMODULE_GET_API(SetModuleAttribs); 237 | REDISMODULE_GET_API(WrongArity); 238 | REDISMODULE_GET_API(ReplyWithLongLong); 239 | REDISMODULE_GET_API(ReplyWithError); 240 | REDISMODULE_GET_API(ReplyWithSimpleString); 241 | REDISMODULE_GET_API(ReplyWithArray); 242 | REDISMODULE_GET_API(ReplySetArrayLength); 243 | REDISMODULE_GET_API(ReplyWithStringBuffer); 244 | REDISMODULE_GET_API(ReplyWithString); 245 | REDISMODULE_GET_API(ReplyWithNull); 246 | REDISMODULE_GET_API(ReplyWithCallReply); 247 | REDISMODULE_GET_API(ReplyWithDouble); 248 | REDISMODULE_GET_API(ReplySetArrayLength); 249 | REDISMODULE_GET_API(GetSelectedDb); 250 | REDISMODULE_GET_API(SelectDb); 251 | REDISMODULE_GET_API(OpenKey); 252 | REDISMODULE_GET_API(CloseKey); 253 | REDISMODULE_GET_API(KeyType); 254 | REDISMODULE_GET_API(ValueLength); 255 | REDISMODULE_GET_API(ListPush); 256 | REDISMODULE_GET_API(ListPop); 257 | REDISMODULE_GET_API(StringToLongLong); 258 | REDISMODULE_GET_API(StringToDouble); 259 | REDISMODULE_GET_API(Call); 260 | REDISMODULE_GET_API(CallReplyProto); 261 | REDISMODULE_GET_API(FreeCallReply); 262 | REDISMODULE_GET_API(CallReplyInteger); 263 | REDISMODULE_GET_API(CallReplyType); 264 | REDISMODULE_GET_API(CallReplyLength); 265 | REDISMODULE_GET_API(CallReplyArrayElement); 266 | REDISMODULE_GET_API(CallReplyStringPtr); 267 | REDISMODULE_GET_API(CreateStringFromCallReply); 268 | REDISMODULE_GET_API(CreateString); 269 | REDISMODULE_GET_API(CreateStringFromLongLong); 270 | REDISMODULE_GET_API(CreateStringFromString); 271 | REDISMODULE_GET_API(CreateStringPrintf); 272 | REDISMODULE_GET_API(FreeString); 273 | REDISMODULE_GET_API(StringPtrLen); 274 | REDISMODULE_GET_API(AutoMemory); 275 | REDISMODULE_GET_API(Replicate); 276 | REDISMODULE_GET_API(ReplicateVerbatim); 277 | REDISMODULE_GET_API(DeleteKey); 278 | REDISMODULE_GET_API(StringSet); 279 | REDISMODULE_GET_API(StringDMA); 280 | REDISMODULE_GET_API(StringTruncate); 281 | REDISMODULE_GET_API(GetExpire); 282 | REDISMODULE_GET_API(SetExpire); 283 | REDISMODULE_GET_API(ZsetAdd); 284 | REDISMODULE_GET_API(ZsetIncrby); 285 | REDISMODULE_GET_API(ZsetScore); 286 | REDISMODULE_GET_API(ZsetRem); 287 | REDISMODULE_GET_API(ZsetRangeStop); 288 | REDISMODULE_GET_API(ZsetFirstInScoreRange); 289 | REDISMODULE_GET_API(ZsetLastInScoreRange); 290 | REDISMODULE_GET_API(ZsetFirstInLexRange); 291 | REDISMODULE_GET_API(ZsetLastInLexRange); 292 | REDISMODULE_GET_API(ZsetRangeCurrentElement); 293 | REDISMODULE_GET_API(ZsetRangeNext); 294 | REDISMODULE_GET_API(ZsetRangePrev); 295 | REDISMODULE_GET_API(ZsetRangeEndReached); 296 | REDISMODULE_GET_API(HashSet); 297 | REDISMODULE_GET_API(HashGet); 298 | REDISMODULE_GET_API(IsKeysPositionRequest); 299 | REDISMODULE_GET_API(KeyAtPos); 300 | REDISMODULE_GET_API(GetClientId); 301 | REDISMODULE_GET_API(PoolAlloc); 302 | REDISMODULE_GET_API(CreateDataType); 303 | REDISMODULE_GET_API(ModuleTypeSetValue); 304 | REDISMODULE_GET_API(ModuleTypeGetType); 305 | REDISMODULE_GET_API(ModuleTypeGetValue); 306 | REDISMODULE_GET_API(SaveUnsigned); 307 | REDISMODULE_GET_API(LoadUnsigned); 308 | REDISMODULE_GET_API(SaveSigned); 309 | REDISMODULE_GET_API(LoadSigned); 310 | REDISMODULE_GET_API(SaveString); 311 | REDISMODULE_GET_API(SaveStringBuffer); 312 | REDISMODULE_GET_API(LoadString); 313 | REDISMODULE_GET_API(LoadStringBuffer); 314 | REDISMODULE_GET_API(SaveDouble); 315 | REDISMODULE_GET_API(LoadDouble); 316 | REDISMODULE_GET_API(SaveFloat); 317 | REDISMODULE_GET_API(LoadFloat); 318 | REDISMODULE_GET_API(EmitAOF); 319 | REDISMODULE_GET_API(Log); 320 | REDISMODULE_GET_API(LogIOError); 321 | REDISMODULE_GET_API(StringAppendBuffer); 322 | REDISMODULE_GET_API(RetainString); 323 | REDISMODULE_GET_API(StringCompare); 324 | REDISMODULE_GET_API(GetContextFromIO); 325 | REDISMODULE_GET_API(BlockClient); 326 | REDISMODULE_GET_API(UnblockClient); 327 | REDISMODULE_GET_API(IsBlockedReplyRequest); 328 | REDISMODULE_GET_API(IsBlockedTimeoutRequest); 329 | REDISMODULE_GET_API(GetBlockedClientPrivateData); 330 | REDISMODULE_GET_API(AbortBlock); 331 | REDISMODULE_GET_API(Milliseconds); 332 | 333 | RedisModule_SetModuleAttribs(ctx, name, ver, apiver); 334 | return REDISMODULE_OK; 335 | } 336 | 337 | #else 338 | 339 | /* Things only defined for the modules core, not exported to modules 340 | * including this file. */ 341 | #define RedisModuleString robj 342 | 343 | #endif /* REDISMODULE_CORE */ 344 | #endif /* REDISMOUDLE_H */ -------------------------------------------------------------------------------- /exp/win32_port.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Unification of type definitions with the ones used in Redis for Windows. 3 | * Based on: 4 | * - https://github.com/tporadowski/redis/blob/win-4.0.2/src/Win32_Interop/win32_types_hiredis.h 5 | * - https://github.com/tporadowski/redis/blob/win-4.0.2/src/Win32_Interop/Win32_Portability.h 6 | */ 7 | #ifndef WIN32_PORT_H 8 | #define WIN32_PORT_H 9 | 10 | #ifdef _WIN32 11 | 12 | typedef __int64 PORT_LONGLONG; 13 | typedef unsigned __int64 PORT_ULONGLONG; 14 | typedef double PORT_LONGDOUBLE; 15 | 16 | #define IF_WIN32(x, y) x 17 | #define WIN32_ONLY(x) x 18 | #define POSIX_ONLY(x) 19 | #define inline __inline 20 | 21 | #ifdef _WIN64 22 | typedef __int64 ssize_t; 23 | typedef __int64 PORT_LONG; 24 | typedef unsigned __int64 PORT_ULONG; 25 | #else 26 | typedef long ssize_t; 27 | typedef long PORT_LONG; 28 | typedef unsigned long PORT_ULONG; 29 | #endif 30 | 31 | #ifdef _WIN64 32 | #define PORT_LONG_MAX _I64_MAX 33 | #define PORT_LONG_MIN _I64_MIN 34 | #define PORT_ULONG_MAX _UI64_MAX 35 | #else 36 | #define PORT_LONG_MAX LONG_MAX 37 | #define PORT_LONG_MIN LONG_MIN 38 | #define PORT_ULONG_MAX ULONG_MAX 39 | #endif 40 | 41 | #else //not(_WIN32) 42 | 43 | typedef long long PORT_LONGLONG; 44 | typedef unsigned long long PORT_ULONGLONG; 45 | typedef double PORT_LONGDOUBLE; 46 | typedef long PORT_LONG; 47 | typedef unsigned long PORT_ULONG; 48 | 49 | #define IF_WIN32(x, y) y 50 | #define WIN32_ONLY(x) 51 | #define POSIX_ONLY(x) x 52 | 53 | #endif 54 | 55 | #endif -------------------------------------------------------------------------------- /pic/1625563551991.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0671/RedisModules-ExecuteCommand-for-Windows/08642e0feeb392eecbb5974a2190693fcd9330ba/pic/1625563551991.png --------------------------------------------------------------------------------