main 08642e0feeb3 cached
8 files
31.3 KB
9.1k tokens
26 symbols
1 requests
Download .txt
Repository: 0671/RedisModules-ExecuteCommand-for-Windows
Branch: main
Commit: 08642e0feeb3
Files: 8
Total size: 31.3 KB

Directory structure:
gitextract_igflip0z/

├── README.md
├── exp/
│   ├── exp.c
│   ├── exp.vcxproj
│   ├── exp.vcxproj.filters
│   ├── exp.vcxproj.user
│   ├── redismodule.h
│   └── win32_port.h
└── exp.sln

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# RedisModules ExecuteCommand for Windows
可在Windows下执行系统命令的Redis模块 。   
可在Linux下执行系统命令的Redis模块在 ![这里](https://github.com/puckiestyle/RedisModules-ExecuteCommand)

## 快速开始
已经有编译好了的模块`exp.dll`,你也可以自行修改、编译,以下是可参考的的步骤:  
1.  用vs2017打开exp.sln文件。
2.  修改exp.c源文件。
2.  编译生成模块`exp.dll`  。
4.  在Redis中加载`exp.dll`,并使用模块的命令  。

## 模块命令  
该模块有一个命令`e`,可以执行系统命令。
在redis-cli命令行下,执行如下命令:

```
127.0.0.1:6379> module load exp.dll
127.0.0.1:6379> exp.e whoami
127.0.0.1:6379> exp.e net user
```

![62556355199](pic/1625563551991.png)  

## 反馈
Mail:h.vi@qq.com   
或者 [issue](https://github.com/0671/RedisModules-ExecuteCommand-for-Windows/issues/new)、PR  

## Stargazers over time

[![Stargazers over time](https://starchart.cc/0671/RedisModules-ExecuteCommand-for-Windows.svg)](https://github.com/0671/RedisModules-ExecuteCommand-for-Windows)


================================================
FILE: exp/exp.c
================================================
#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdlib.h>
#include "win32_port.h"
#include "redismodule.h"
#ifdef _WIN32
#define strncasecmp(s1, s2, len) _strnicmp(s1, s2, len)
#define strcasecmp(s1, s2) _stricmp(s1, s2)
#endif



char * join(char*s1, char*s2) {
	char *result = malloc(strlen(s1) + strlen(s2) + 1 + 1);
	if (result == NULL) exit(1);
	strcpy(result, s1);
	strcat(result, " ");
	strcat(result, s2);
	return result;
}


int DoCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {

	char *_cmd;
	size_t _cmd_len;
	size_t size = 1024; //µ¥Î»
	char *all_cmd = "";
	if (argc >= 2)
	{
		for (size_t i = 1; i < argc; i++)
		{
			_cmd = RedisModule_StringPtrLen(argv[i], &_cmd_len);
			all_cmd = join(all_cmd, _cmd);
		}

		FILE *fp = _popen(all_cmd, "r");
		char *buf, *output;
		buf = (char *)malloc(size);
		output = "{";

		while (fgets(buf, sizeof(buf), fp) != 0) {
			output = join(output, buf);
		}
		output = join(output, "}");
		RedisModuleString *ret = RedisModule_CreateString(ctx, output, strlen(output));
		RedisModule_ReplyWithString(ctx, ret);
		_pclose(fp);
	}
	return REDISMODULE_OK;
}

#ifdef _WIN32
__declspec(dllexport)
#endif
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
	// Register the module
	if (RedisModule_Init(ctx, "exp", 1, REDISMODULE_APIVER_1) ==
		REDISMODULE_ERR)
		return REDISMODULE_ERR;

	if (RedisModule_CreateCommand(ctx, "exp.e", DoCommand, "readonly", 1, 1, 1) ==
		REDISMODULE_ERR)
		return REDISMODULE_ERR;

	return REDISMODULE_OK;
}

================================================
FILE: exp/exp.vcxproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <VCProjectVersion>15.0</VCProjectVersion>
    <ProjectGuid>{D9081C23-553E-47EA-80C8-FE534EF58EAB}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>exp</RootNamespace>
    <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
    <SpectreMitigation>false</SpectreMitigation>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;_DEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>_DEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;NDEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <PrecompiledHeader>NotUsing</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>NDEBUG;EXP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="exp.c" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="redismodule.h" />
    <ClInclude Include="win32_port.h" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>

================================================
FILE: exp/exp.vcxproj.filters
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Filter Include="源文件">
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
    </Filter>
    <Filter Include="头文件">
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
    </Filter>
    <Filter Include="资源文件">
      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
    </Filter>
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="win32_port.h">
      <Filter>头文件</Filter>
    </ClInclude>
    <ClInclude Include="redismodule.h">
      <Filter>头文件</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="exp.c">
      <Filter>源文件</Filter>
    </ClCompile>
  </ItemGroup>
</Project>

================================================
FILE: exp/exp.vcxproj.user
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
</Project>

================================================
FILE: exp/redismodule.h
================================================
#ifndef REDISMODULE_H
#define REDISMODULE_H

#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>

#include "win32_port.h"

/* ---------------- Defines common between core and modules --------------- */

/* Error status return values. */
#define REDISMODULE_OK 0
#define REDISMODULE_ERR 1

/* API versions. */
#define REDISMODULE_APIVER_1 1

/* API flags and constants */
#define REDISMODULE_READ (1<<0)
#define REDISMODULE_WRITE (1<<1)

#define REDISMODULE_LIST_HEAD 0
#define REDISMODULE_LIST_TAIL 1

/* Key types. */
#define REDISMODULE_KEYTYPE_EMPTY 0
#define REDISMODULE_KEYTYPE_STRING 1
#define REDISMODULE_KEYTYPE_LIST 2
#define REDISMODULE_KEYTYPE_HASH 3
#define REDISMODULE_KEYTYPE_SET 4
#define REDISMODULE_KEYTYPE_ZSET 5
#define REDISMODULE_KEYTYPE_MODULE 6

/* Reply types. */
#define REDISMODULE_REPLY_UNKNOWN -1
#define REDISMODULE_REPLY_STRING 0
#define REDISMODULE_REPLY_ERROR 1
#define REDISMODULE_REPLY_INTEGER 2
#define REDISMODULE_REPLY_ARRAY 3
#define REDISMODULE_REPLY_NULL 4

/* Postponed array length. */
#define REDISMODULE_POSTPONED_ARRAY_LEN -1

/* Expire */
#define REDISMODULE_NO_EXPIRE -1

/* Sorted set API flags. */
#define REDISMODULE_ZADD_XX      (1<<0)
#define REDISMODULE_ZADD_NX      (1<<1)
#define REDISMODULE_ZADD_ADDED   (1<<2)
#define REDISMODULE_ZADD_UPDATED (1<<3)
#define REDISMODULE_ZADD_NOP     (1<<4)

/* Hash API flags. */
#define REDISMODULE_HASH_NONE       0
#define REDISMODULE_HASH_NX         (1<<0)
#define REDISMODULE_HASH_XX         (1<<1)
#define REDISMODULE_HASH_CFIELDS    (1<<2)
#define REDISMODULE_HASH_EXISTS     (1<<3)

/* A special pointer that we can use between the core and the module to signal
 * field deletion, and that is impossible to be a valid pointer. */
#define REDISMODULE_HASH_DELETE ((RedisModuleString*)(PORT_LONG)1)

 /* Error messages. */
#define REDISMODULE_ERRORMSG_WRONGTYPE "WRONGTYPE Operation against a key holding the wrong kind of value"

#define REDISMODULE_POSITIVE_INFINITE (1.0/0.0)
#define REDISMODULE_NEGATIVE_INFINITE (-1.0/0.0)

#define REDISMODULE_NOT_USED(V) ((void) V)

/* ------------------------- End of common defines ------------------------ */

#ifndef REDISMODULE_CORE

typedef PORT_LONGLONG mstime_t;

/* Incomplete structures for compiler checks but opaque access. */
typedef struct RedisModuleCtx RedisModuleCtx;
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 int(*RedisModuleCmdFunc) (RedisModuleCtx *ctx, RedisModuleString **argv, int argc);

typedef void *(*RedisModuleTypeLoadFunc)(RedisModuleIO *rdb, int encver);
typedef void(*RedisModuleTypeSaveFunc)(RedisModuleIO *rdb, void *value);
typedef void(*RedisModuleTypeRewriteFunc)(RedisModuleIO *aof, RedisModuleString *key, void *value);
typedef size_t(*RedisModuleTypeMemUsageFunc)(const void *value);
typedef void(*RedisModuleTypeDigestFunc)(RedisModuleDigest *digest, void *value);
typedef void(*RedisModuleTypeFreeFunc)(void *value);

#define REDISMODULE_TYPE_METHOD_VERSION 1
typedef struct RedisModuleTypeMethods {
	uint64_t version;
	RedisModuleTypeLoadFunc rdb_load;
	RedisModuleTypeSaveFunc rdb_save;
	RedisModuleTypeRewriteFunc aof_rewrite;
	RedisModuleTypeMemUsageFunc mem_usage;
	RedisModuleTypeDigestFunc digest;
	RedisModuleTypeFreeFunc free;
} RedisModuleTypeMethods;

#define REDISMODULE_GET_API(name) \
    RedisModule_GetApi("RedisModule_" #name, ((void **)&RedisModule_ ## name))

#define REDISMODULE_API_FUNC(x) (*x)


void *REDISMODULE_API_FUNC(RedisModule_Alloc)(size_t bytes);
void *REDISMODULE_API_FUNC(RedisModule_Realloc)(void *ptr, size_t bytes);
void REDISMODULE_API_FUNC(RedisModule_Free)(void *ptr);
void *REDISMODULE_API_FUNC(RedisModule_Calloc)(size_t nmemb, size_t size);
char *REDISMODULE_API_FUNC(RedisModule_Strdup)(const char *str);
int REDISMODULE_API_FUNC(RedisModule_GetApi)(const char *, void *);
int REDISMODULE_API_FUNC(RedisModule_CreateCommand)(RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep);
int REDISMODULE_API_FUNC(RedisModule_SetModuleAttribs)(RedisModuleCtx *ctx, const char *name, int ver, int apiver);
int REDISMODULE_API_FUNC(RedisModule_WrongArity)(RedisModuleCtx *ctx);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithLongLong)(RedisModuleCtx *ctx, PORT_LONGLONG ll);
int REDISMODULE_API_FUNC(RedisModule_GetSelectedDb)(RedisModuleCtx *ctx);
int REDISMODULE_API_FUNC(RedisModule_SelectDb)(RedisModuleCtx *ctx, int newid);
void *REDISMODULE_API_FUNC(RedisModule_OpenKey)(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode);
void REDISMODULE_API_FUNC(RedisModule_CloseKey)(RedisModuleKey *kp);
int REDISMODULE_API_FUNC(RedisModule_KeyType)(RedisModuleKey *kp);
size_t REDISMODULE_API_FUNC(RedisModule_ValueLength)(RedisModuleKey *kp);
int REDISMODULE_API_FUNC(RedisModule_ListPush)(RedisModuleKey *kp, int where, RedisModuleString *ele);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ListPop)(RedisModuleKey *key, int where);
RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_Call)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...);
const char *REDISMODULE_API_FUNC(RedisModule_CallReplyProto)(RedisModuleCallReply *reply, size_t *len);
void REDISMODULE_API_FUNC(RedisModule_FreeCallReply)(RedisModuleCallReply *reply);
int REDISMODULE_API_FUNC(RedisModule_CallReplyType)(RedisModuleCallReply *reply);
PORT_LONGLONG REDISMODULE_API_FUNC(RedisModule_CallReplyInteger)(RedisModuleCallReply *reply);
size_t REDISMODULE_API_FUNC(RedisModule_CallReplyLength)(RedisModuleCallReply *reply);
RedisModuleCallReply *REDISMODULE_API_FUNC(RedisModule_CallReplyArrayElement)(RedisModuleCallReply *reply, size_t idx);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateString)(RedisModuleCtx *ctx, const char *ptr, size_t len);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromLongLong)(RedisModuleCtx *ctx, PORT_LONGLONG ll);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromString)(RedisModuleCtx *ctx, const RedisModuleString *str);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringPrintf)(RedisModuleCtx *ctx, const char *fmt, ...);
void REDISMODULE_API_FUNC(RedisModule_FreeString)(RedisModuleCtx *ctx, RedisModuleString *str);
const char *REDISMODULE_API_FUNC(RedisModule_StringPtrLen)(const RedisModuleString *str, size_t *len);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithError)(RedisModuleCtx *ctx, const char *err);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithSimpleString)(RedisModuleCtx *ctx, const char *msg);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithArray)(RedisModuleCtx *ctx, PORT_LONG len);
void REDISMODULE_API_FUNC(RedisModule_ReplySetArrayLength)(RedisModuleCtx *ctx, PORT_LONG len);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithStringBuffer)(RedisModuleCtx *ctx, const char *buf, size_t len);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithString)(RedisModuleCtx *ctx, RedisModuleString *str);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithNull)(RedisModuleCtx *ctx);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithDouble)(RedisModuleCtx *ctx, PORT_LONGDOUBLE d);
int REDISMODULE_API_FUNC(RedisModule_ReplyWithCallReply)(RedisModuleCtx *ctx, RedisModuleCallReply *reply);
int REDISMODULE_API_FUNC(RedisModule_StringToLongLong)(const RedisModuleString *str, PORT_LONGLONG *ll);
int REDISMODULE_API_FUNC(RedisModule_StringToDouble)(const RedisModuleString *str, PORT_LONGDOUBLE *d);
void REDISMODULE_API_FUNC(RedisModule_AutoMemory)(RedisModuleCtx *ctx);
int REDISMODULE_API_FUNC(RedisModule_Replicate)(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...);
int REDISMODULE_API_FUNC(RedisModule_ReplicateVerbatim)(RedisModuleCtx *ctx);
const char *REDISMODULE_API_FUNC(RedisModule_CallReplyStringPtr)(RedisModuleCallReply *reply, size_t *len);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_CreateStringFromCallReply)(RedisModuleCallReply *reply);
int REDISMODULE_API_FUNC(RedisModule_DeleteKey)(RedisModuleKey *key);
int REDISMODULE_API_FUNC(RedisModule_StringSet)(RedisModuleKey *key, RedisModuleString *str);
char *REDISMODULE_API_FUNC(RedisModule_StringDMA)(RedisModuleKey *key, size_t *len, int mode);
int REDISMODULE_API_FUNC(RedisModule_StringTruncate)(RedisModuleKey *key, size_t newlen);
mstime_t REDISMODULE_API_FUNC(RedisModule_GetExpire)(RedisModuleKey *key);
int REDISMODULE_API_FUNC(RedisModule_SetExpire)(RedisModuleKey *key, mstime_t expire);
int REDISMODULE_API_FUNC(RedisModule_ZsetAdd)(RedisModuleKey *key, PORT_LONGDOUBLE score, RedisModuleString *ele, int *flagsptr);
int REDISMODULE_API_FUNC(RedisModule_ZsetIncrby)(RedisModuleKey *key, PORT_LONGDOUBLE score, RedisModuleString *ele, int *flagsptr, PORT_LONGDOUBLE *newscore);
int REDISMODULE_API_FUNC(RedisModule_ZsetScore)(RedisModuleKey *key, RedisModuleString *ele, PORT_LONGDOUBLE *score);
int REDISMODULE_API_FUNC(RedisModule_ZsetRem)(RedisModuleKey *key, RedisModuleString *ele, int *deleted);
void REDISMODULE_API_FUNC(RedisModule_ZsetRangeStop)(RedisModuleKey *key);
int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInScoreRange)(RedisModuleKey *key, PORT_LONGDOUBLE min, PORT_LONGDOUBLE max, int minex, int maxex);
int REDISMODULE_API_FUNC(RedisModule_ZsetLastInScoreRange)(RedisModuleKey *key, PORT_LONGDOUBLE min, PORT_LONGDOUBLE max, int minex, int maxex);
int REDISMODULE_API_FUNC(RedisModule_ZsetFirstInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max);
int REDISMODULE_API_FUNC(RedisModule_ZsetLastInLexRange)(RedisModuleKey *key, RedisModuleString *min, RedisModuleString *max);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_ZsetRangeCurrentElement)(RedisModuleKey *key, PORT_LONGDOUBLE *score);
int REDISMODULE_API_FUNC(RedisModule_ZsetRangeNext)(RedisModuleKey *key);
int REDISMODULE_API_FUNC(RedisModule_ZsetRangePrev)(RedisModuleKey *key);
int REDISMODULE_API_FUNC(RedisModule_ZsetRangeEndReached)(RedisModuleKey *key);
int REDISMODULE_API_FUNC(RedisModule_HashSet)(RedisModuleKey *key, int flags, ...);
int REDISMODULE_API_FUNC(RedisModule_HashGet)(RedisModuleKey *key, int flags, ...);
int REDISMODULE_API_FUNC(RedisModule_IsKeysPositionRequest)(RedisModuleCtx *ctx);
void REDISMODULE_API_FUNC(RedisModule_KeyAtPos)(RedisModuleCtx *ctx, int pos);
PORT_ULONGLONG REDISMODULE_API_FUNC(RedisModule_GetClientId)(RedisModuleCtx *ctx);
void *REDISMODULE_API_FUNC(RedisModule_PoolAlloc)(RedisModuleCtx *ctx, size_t bytes);
RedisModuleType *REDISMODULE_API_FUNC(RedisModule_CreateDataType)(RedisModuleCtx *ctx, const char *name, int encver, RedisModuleTypeMethods *typemethods);
int REDISMODULE_API_FUNC(RedisModule_ModuleTypeSetValue)(RedisModuleKey *key, RedisModuleType *mt, void *value);
RedisModuleType *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetType)(RedisModuleKey *key);
void *REDISMODULE_API_FUNC(RedisModule_ModuleTypeGetValue)(RedisModuleKey *key);
void REDISMODULE_API_FUNC(RedisModule_SaveUnsigned)(RedisModuleIO *io, uint64_t value);
uint64_t REDISMODULE_API_FUNC(RedisModule_LoadUnsigned)(RedisModuleIO *io);
void REDISMODULE_API_FUNC(RedisModule_SaveSigned)(RedisModuleIO *io, int64_t value);
int64_t REDISMODULE_API_FUNC(RedisModule_LoadSigned)(RedisModuleIO *io);
void REDISMODULE_API_FUNC(RedisModule_EmitAOF)(RedisModuleIO *io, const char *cmdname, const char *fmt, ...);
void REDISMODULE_API_FUNC(RedisModule_SaveString)(RedisModuleIO *io, RedisModuleString *s);
void REDISMODULE_API_FUNC(RedisModule_SaveStringBuffer)(RedisModuleIO *io, const char *str, size_t len);
RedisModuleString *REDISMODULE_API_FUNC(RedisModule_LoadString)(RedisModuleIO *io);
char *REDISMODULE_API_FUNC(RedisModule_LoadStringBuffer)(RedisModuleIO *io, size_t *lenptr);
void REDISMODULE_API_FUNC(RedisModule_SaveDouble)(RedisModuleIO *io, PORT_LONGDOUBLE value);
PORT_LONGDOUBLE REDISMODULE_API_FUNC(RedisModule_LoadDouble)(RedisModuleIO *io);
void REDISMODULE_API_FUNC(RedisModule_SaveFloat)(RedisModuleIO *io, float value);
float REDISMODULE_API_FUNC(RedisModule_LoadFloat)(RedisModuleIO *io);
void REDISMODULE_API_FUNC(RedisModule_Log)(RedisModuleCtx *ctx, const char *level, const char *fmt, ...);
void REDISMODULE_API_FUNC(RedisModule_LogIOError)(RedisModuleIO *io, const char *levelstr, const char *fmt, ...);
int REDISMODULE_API_FUNC(RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, RedisModuleString *str, const char *buf, size_t len);
void REDISMODULE_API_FUNC(RedisModule_RetainString)(RedisModuleCtx *ctx, RedisModuleString *str);
int REDISMODULE_API_FUNC(RedisModule_StringCompare)(RedisModuleString *a, RedisModuleString *b);
RedisModuleCtx *REDISMODULE_API_FUNC(RedisModule_GetContextFromIO)(RedisModuleIO *io);
RedisModuleBlockedClient *REDISMODULE_API_FUNC(RedisModule_BlockClient)(RedisModuleCtx *ctx, RedisModuleCmdFunc reply_callback, RedisModuleCmdFunc timeout_callback, void(*free_privdata)(void*), PORT_LONGLONG timeout_ms);
int REDISMODULE_API_FUNC(RedisModule_UnblockClient)(RedisModuleBlockedClient *bc, void *privdata);
int REDISMODULE_API_FUNC(RedisModule_IsBlockedReplyRequest)(RedisModuleCtx *ctx);
int REDISMODULE_API_FUNC(RedisModule_IsBlockedTimeoutRequest)(RedisModuleCtx *ctx);
void *REDISMODULE_API_FUNC(RedisModule_GetBlockedClientPrivateData)(RedisModuleCtx *ctx);
int REDISMODULE_API_FUNC(RedisModule_AbortBlock)(RedisModuleBlockedClient *bc);
PORT_LONGLONG REDISMODULE_API_FUNC(RedisModule_Milliseconds)(void);

/* This is included inline inside each Redis module. */
static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver)
#ifndef _WIN32
__attribute__((unused));
#else
;
#endif
static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int apiver) {
	void *getapifuncptr = ((void**)ctx)[0];
	RedisModule_GetApi = (int(*)(const char *, void *)) (PORT_ULONG)getapifuncptr;
	REDISMODULE_GET_API(Alloc);
	REDISMODULE_GET_API(Calloc);
	REDISMODULE_GET_API(Free);
	REDISMODULE_GET_API(Realloc);
	REDISMODULE_GET_API(Strdup);
	REDISMODULE_GET_API(CreateCommand);
	REDISMODULE_GET_API(SetModuleAttribs);
	REDISMODULE_GET_API(WrongArity);
	REDISMODULE_GET_API(ReplyWithLongLong);
	REDISMODULE_GET_API(ReplyWithError);
	REDISMODULE_GET_API(ReplyWithSimpleString);
	REDISMODULE_GET_API(ReplyWithArray);
	REDISMODULE_GET_API(ReplySetArrayLength);
	REDISMODULE_GET_API(ReplyWithStringBuffer);
	REDISMODULE_GET_API(ReplyWithString);
	REDISMODULE_GET_API(ReplyWithNull);
	REDISMODULE_GET_API(ReplyWithCallReply);
	REDISMODULE_GET_API(ReplyWithDouble);
	REDISMODULE_GET_API(ReplySetArrayLength);
	REDISMODULE_GET_API(GetSelectedDb);
	REDISMODULE_GET_API(SelectDb);
	REDISMODULE_GET_API(OpenKey);
	REDISMODULE_GET_API(CloseKey);
	REDISMODULE_GET_API(KeyType);
	REDISMODULE_GET_API(ValueLength);
	REDISMODULE_GET_API(ListPush);
	REDISMODULE_GET_API(ListPop);
	REDISMODULE_GET_API(StringToLongLong);
	REDISMODULE_GET_API(StringToDouble);
	REDISMODULE_GET_API(Call);
	REDISMODULE_GET_API(CallReplyProto);
	REDISMODULE_GET_API(FreeCallReply);
	REDISMODULE_GET_API(CallReplyInteger);
	REDISMODULE_GET_API(CallReplyType);
	REDISMODULE_GET_API(CallReplyLength);
	REDISMODULE_GET_API(CallReplyArrayElement);
	REDISMODULE_GET_API(CallReplyStringPtr);
	REDISMODULE_GET_API(CreateStringFromCallReply);
	REDISMODULE_GET_API(CreateString);
	REDISMODULE_GET_API(CreateStringFromLongLong);
	REDISMODULE_GET_API(CreateStringFromString);
	REDISMODULE_GET_API(CreateStringPrintf);
	REDISMODULE_GET_API(FreeString);
	REDISMODULE_GET_API(StringPtrLen);
	REDISMODULE_GET_API(AutoMemory);
	REDISMODULE_GET_API(Replicate);
	REDISMODULE_GET_API(ReplicateVerbatim);
	REDISMODULE_GET_API(DeleteKey);
	REDISMODULE_GET_API(StringSet);
	REDISMODULE_GET_API(StringDMA);
	REDISMODULE_GET_API(StringTruncate);
	REDISMODULE_GET_API(GetExpire);
	REDISMODULE_GET_API(SetExpire);
	REDISMODULE_GET_API(ZsetAdd);
	REDISMODULE_GET_API(ZsetIncrby);
	REDISMODULE_GET_API(ZsetScore);
	REDISMODULE_GET_API(ZsetRem);
	REDISMODULE_GET_API(ZsetRangeStop);
	REDISMODULE_GET_API(ZsetFirstInScoreRange);
	REDISMODULE_GET_API(ZsetLastInScoreRange);
	REDISMODULE_GET_API(ZsetFirstInLexRange);
	REDISMODULE_GET_API(ZsetLastInLexRange);
	REDISMODULE_GET_API(ZsetRangeCurrentElement);
	REDISMODULE_GET_API(ZsetRangeNext);
	REDISMODULE_GET_API(ZsetRangePrev);
	REDISMODULE_GET_API(ZsetRangeEndReached);
	REDISMODULE_GET_API(HashSet);
	REDISMODULE_GET_API(HashGet);
	REDISMODULE_GET_API(IsKeysPositionRequest);
	REDISMODULE_GET_API(KeyAtPos);
	REDISMODULE_GET_API(GetClientId);
	REDISMODULE_GET_API(PoolAlloc);
	REDISMODULE_GET_API(CreateDataType);
	REDISMODULE_GET_API(ModuleTypeSetValue);
	REDISMODULE_GET_API(ModuleTypeGetType);
	REDISMODULE_GET_API(ModuleTypeGetValue);
	REDISMODULE_GET_API(SaveUnsigned);
	REDISMODULE_GET_API(LoadUnsigned);
	REDISMODULE_GET_API(SaveSigned);
	REDISMODULE_GET_API(LoadSigned);
	REDISMODULE_GET_API(SaveString);
	REDISMODULE_GET_API(SaveStringBuffer);
	REDISMODULE_GET_API(LoadString);
	REDISMODULE_GET_API(LoadStringBuffer);
	REDISMODULE_GET_API(SaveDouble);
	REDISMODULE_GET_API(LoadDouble);
	REDISMODULE_GET_API(SaveFloat);
	REDISMODULE_GET_API(LoadFloat);
	REDISMODULE_GET_API(EmitAOF);
	REDISMODULE_GET_API(Log);
	REDISMODULE_GET_API(LogIOError);
	REDISMODULE_GET_API(StringAppendBuffer);
	REDISMODULE_GET_API(RetainString);
	REDISMODULE_GET_API(StringCompare);
	REDISMODULE_GET_API(GetContextFromIO);
	REDISMODULE_GET_API(BlockClient);
	REDISMODULE_GET_API(UnblockClient);
	REDISMODULE_GET_API(IsBlockedReplyRequest);
	REDISMODULE_GET_API(IsBlockedTimeoutRequest);
	REDISMODULE_GET_API(GetBlockedClientPrivateData);
	REDISMODULE_GET_API(AbortBlock);
	REDISMODULE_GET_API(Milliseconds);

	RedisModule_SetModuleAttribs(ctx, name, ver, apiver);
	return REDISMODULE_OK;
}

#else

/* Things only defined for the modules core, not exported to modules
 * including this file. */
#define RedisModuleString robj

#endif /* REDISMODULE_CORE */
#endif /* REDISMOUDLE_H */

================================================
FILE: exp/win32_port.h
================================================
/*
 * Unification of type definitions with the ones used in Redis for Windows.
 * Based on:
 * - https://github.com/tporadowski/redis/blob/win-4.0.2/src/Win32_Interop/win32_types_hiredis.h
 * - https://github.com/tporadowski/redis/blob/win-4.0.2/src/Win32_Interop/Win32_Portability.h
 */
#ifndef WIN32_PORT_H
#define WIN32_PORT_H

#ifdef _WIN32

typedef __int64 PORT_LONGLONG;
typedef unsigned __int64 PORT_ULONGLONG;
typedef double PORT_LONGDOUBLE;

#define IF_WIN32(x, y) x
#define WIN32_ONLY(x) x
#define POSIX_ONLY(x)
#define inline __inline

#ifdef _WIN64
typedef __int64 ssize_t;
typedef __int64 PORT_LONG;
typedef unsigned __int64 PORT_ULONG;
#else
typedef long ssize_t;
typedef long PORT_LONG;
typedef unsigned long PORT_ULONG;
#endif

#ifdef _WIN64
#define PORT_LONG_MAX _I64_MAX
#define PORT_LONG_MIN _I64_MIN
#define PORT_ULONG_MAX _UI64_MAX
#else
#define PORT_LONG_MAX LONG_MAX
#define PORT_LONG_MIN LONG_MIN
#define PORT_ULONG_MAX ULONG_MAX
#endif

#else //not(_WIN32)

typedef long long PORT_LONGLONG;
typedef unsigned long long PORT_ULONGLONG;
typedef double PORT_LONGDOUBLE;
typedef long PORT_LONG;
typedef unsigned long PORT_ULONG;

#define IF_WIN32(x, y) y
#define WIN32_ONLY(x)
#define POSIX_ONLY(x) x

#endif

#endif

================================================
FILE: exp.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.489
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exp", "exp\exp.vcxproj", "{D9081C23-553E-47EA-80C8-FE534EF58EAB}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|x64 = Debug|x64
		Debug|x86 = Debug|x86
		Release|x64 = Release|x64
		Release|x86 = Release|x86
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x64.ActiveCfg = Debug|x64
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x64.Build.0 = Debug|x64
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x86.ActiveCfg = Debug|Win32
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Debug|x86.Build.0 = Debug|Win32
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x64.ActiveCfg = Release|x64
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x64.Build.0 = Release|x64
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x86.ActiveCfg = Release|Win32
		{D9081C23-553E-47EA-80C8-FE534EF58EAB}.Release|x86.Build.0 = Release|Win32
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {D3DED947-B683-4C24-9AFB-2CC3B9BF1B49}
	EndGlobalSection
EndGlobal
Download .txt
gitextract_igflip0z/

├── README.md
├── exp/
│   ├── exp.c
│   ├── exp.vcxproj
│   ├── exp.vcxproj.filters
│   ├── exp.vcxproj.user
│   ├── redismodule.h
│   └── win32_port.h
└── exp.sln
Download .txt
SYMBOL INDEX (26 symbols across 3 files)

FILE: exp/exp.c
  function DoCommand (line 23) | int DoCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
  function RedisModule_OnLoad (line 56) | int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, in...

FILE: exp/redismodule.h
  type PORT_LONGLONG (line 79) | typedef PORT_LONGLONG mstime_t;
  type RedisModuleCtx (line 82) | typedef struct RedisModuleCtx RedisModuleCtx;
  type RedisModuleKey (line 83) | typedef struct RedisModuleKey RedisModuleKey;
  type RedisModuleString (line 84) | typedef struct RedisModuleString RedisModuleString;
  type RedisModuleCallReply (line 85) | typedef struct RedisModuleCallReply RedisModuleCallReply;
  type RedisModuleIO (line 86) | typedef struct RedisModuleIO RedisModuleIO;
  type RedisModuleType (line 87) | typedef struct RedisModuleType RedisModuleType;
  type RedisModuleDigest (line 88) | typedef struct RedisModuleDigest RedisModuleDigest;
  type RedisModuleBlockedClient (line 89) | typedef struct RedisModuleBlockedClient RedisModuleBlockedClient;
  type RedisModuleTypeMethods (line 101) | typedef struct RedisModuleTypeMethods {
  function RedisModule_Init (line 227) | static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int v...

FILE: exp/win32_port.h
  type __int64 (line 12) | typedef __int64 PORT_LONGLONG;
  type PORT_ULONGLONG (line 13) | typedef unsigned __int64 PORT_ULONGLONG;
  type PORT_LONGDOUBLE (line 14) | typedef double PORT_LONGDOUBLE;
  type __int64 (line 22) | typedef __int64 ssize_t;
  type __int64 (line 23) | typedef __int64 PORT_LONG;
  type PORT_ULONG (line 24) | typedef unsigned __int64 PORT_ULONG;
  type PORT_LONG (line 27) | typedef long PORT_LONG;
  type PORT_ULONG (line 28) | typedef unsigned long PORT_ULONG;
  type PORT_LONGLONG (line 43) | typedef long long PORT_LONGLONG;
  type PORT_ULONGLONG (line 44) | typedef unsigned long long PORT_ULONGLONG;
  type PORT_LONGDOUBLE (line 45) | typedef double PORT_LONGDOUBLE;
  type PORT_LONG (line 46) | typedef long PORT_LONG;
  type PORT_ULONG (line 47) | typedef unsigned long PORT_ULONG;
Condensed preview — 8 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (34K chars).
[
  {
    "path": "README.md",
    "chars": 824,
    "preview": "# RedisModules ExecuteCommand for Windows\n可在Windows下执行系统命令的Redis模块 。   \n可在Linux下执行系统命令的Redis模块在 ![这里](https://github.com"
  },
  {
    "path": "exp/exp.c",
    "chars": 1547,
    "preview": "#define _CRT_SECURE_NO_WARNINGS\n#include <string.h>\n#include <stdlib.h>\n#include \"win32_port.h\"\n#include \"redismodule.h"
  },
  {
    "path": "exp/exp.vcxproj",
    "chars": 7695,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "exp/exp.vcxproj.filters",
    "chars": 1093,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuil"
  },
  {
    "path": "exp/exp.vcxproj.user",
    "chars": 160,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbui"
  },
  {
    "path": "exp/redismodule.h",
    "chars": 18095,
    "preview": "#ifndef REDISMODULE_H\n#define REDISMODULE_H\n\n#include <sys/types.h>\n#include <stdint.h>\n#include <stdio.h>\n\n#include \"wi"
  },
  {
    "path": "exp/win32_port.h",
    "chars": 1236,
    "preview": "/*\n * Unification of type definitions with the ones used in Redis for Windows.\n * Based on:\n * - https://github.com/tpor"
  },
  {
    "path": "exp.sln",
    "chars": 1389,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.489\nMi"
  }
]

About this extraction

This page contains the full source code of the 0671/RedisModules-ExecuteCommand-for-Windows GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 8 files (31.3 KB), approximately 9.1k tokens, and a symbol index with 26 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!