mirror of
https://github.com/hanzoai/redis.git
synced 2026-10-30 18:25:12 +00:00
Each command having subcommands needs a HELP subcommand which is currently missing for HOTKEYS. Also the newly added section "Hotkeys" for INFO was messing up modules INFOs in some cases. Fixed both issues in this PR.
122 lines
4.6 KiB
C
122 lines
4.6 KiB
C
#include "redismodule.h"
|
|
|
|
#include <string.h>
|
|
|
|
void InfoFunc(RedisModuleInfoCtx *ctx, int for_crash_report) {
|
|
static int info_func_calls = 0;
|
|
RedisModule_InfoAddSection(ctx, "");
|
|
RedisModule_InfoAddFieldLongLong(ctx, "global", -2);
|
|
RedisModule_InfoAddFieldULongLong(ctx, "uglobal", (unsigned long long)-2);
|
|
RedisModule_InfoAddFieldLongLong(ctx, "info_calls", ++info_func_calls);
|
|
|
|
RedisModule_InfoAddSection(ctx, "Spanish");
|
|
RedisModule_InfoAddFieldCString(ctx, "uno", "one");
|
|
RedisModule_InfoAddFieldLongLong(ctx, "dos", 2);
|
|
|
|
RedisModule_InfoAddSection(ctx, "Italian");
|
|
RedisModule_InfoAddFieldLongLong(ctx, "due", 2);
|
|
RedisModule_InfoAddFieldDouble(ctx, "tre", 3.3);
|
|
|
|
RedisModule_InfoAddSection(ctx, "keyspace");
|
|
RedisModule_InfoBeginDictField(ctx, "db0");
|
|
RedisModule_InfoAddFieldLongLong(ctx, "keys", 3);
|
|
RedisModule_InfoAddFieldLongLong(ctx, "expires", 1);
|
|
RedisModule_InfoEndDictField(ctx);
|
|
|
|
RedisModule_InfoAddSection(ctx, "unsafe");
|
|
RedisModule_InfoBeginDictField(ctx, "unsafe:field");
|
|
RedisModule_InfoAddFieldLongLong(ctx, "value", 1);
|
|
RedisModule_InfoEndDictField(ctx);
|
|
|
|
if (for_crash_report) {
|
|
RedisModule_InfoAddSection(ctx, "Klingon");
|
|
RedisModule_InfoAddFieldCString(ctx, "one", "wa'");
|
|
RedisModule_InfoAddFieldCString(ctx, "two", "cha'");
|
|
RedisModule_InfoAddFieldCString(ctx, "three", "wej");
|
|
}
|
|
|
|
}
|
|
|
|
int info_get(RedisModuleCtx *ctx, RedisModuleString **argv, int argc, char field_type)
|
|
{
|
|
if (argc != 3 && argc != 4) {
|
|
RedisModule_WrongArity(ctx);
|
|
return REDISMODULE_OK;
|
|
}
|
|
int err = REDISMODULE_OK;
|
|
const char *section, *field;
|
|
section = RedisModule_StringPtrLen(argv[1], NULL);
|
|
field = RedisModule_StringPtrLen(argv[2], NULL);
|
|
RedisModuleServerInfoData *info = RedisModule_GetServerInfo(ctx, section);
|
|
if (field_type=='i') {
|
|
long long ll = RedisModule_ServerInfoGetFieldSigned(info, field, &err);
|
|
if (err==REDISMODULE_OK)
|
|
RedisModule_ReplyWithLongLong(ctx, ll);
|
|
} else if (field_type=='u') {
|
|
unsigned long long ll = (unsigned long long)RedisModule_ServerInfoGetFieldUnsigned(info, field, &err);
|
|
if (err==REDISMODULE_OK)
|
|
RedisModule_ReplyWithLongLong(ctx, ll);
|
|
} else if (field_type=='d') {
|
|
double d = RedisModule_ServerInfoGetFieldDouble(info, field, &err);
|
|
if (err==REDISMODULE_OK)
|
|
RedisModule_ReplyWithDouble(ctx, d);
|
|
} else if (field_type=='c') {
|
|
const char *str = RedisModule_ServerInfoGetFieldC(info, field);
|
|
if (str)
|
|
RedisModule_ReplyWithCString(ctx, str);
|
|
} else {
|
|
RedisModuleString *str = RedisModule_ServerInfoGetField(ctx, info, field);
|
|
if (str) {
|
|
RedisModule_ReplyWithString(ctx, str);
|
|
RedisModule_FreeString(ctx, str);
|
|
} else
|
|
err=REDISMODULE_ERR;
|
|
}
|
|
if (err!=REDISMODULE_OK)
|
|
RedisModule_ReplyWithError(ctx, "not found");
|
|
RedisModule_FreeServerInfo(ctx, info);
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
int info_gets(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
return info_get(ctx, argv, argc, 's');
|
|
}
|
|
|
|
int info_getc(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
return info_get(ctx, argv, argc, 'c');
|
|
}
|
|
|
|
int info_geti(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
return info_get(ctx, argv, argc, 'i');
|
|
}
|
|
|
|
int info_getu(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
return info_get(ctx, argv, argc, 'u');
|
|
}
|
|
|
|
int info_getd(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
return info_get(ctx, argv, argc, 'd');
|
|
}
|
|
|
|
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
REDISMODULE_NOT_USED(argv);
|
|
REDISMODULE_NOT_USED(argc);
|
|
if (RedisModule_Init(ctx,"infotest",1,REDISMODULE_APIVER_1)
|
|
== REDISMODULE_ERR) return REDISMODULE_ERR;
|
|
|
|
if (RedisModule_RegisterInfoFunc(ctx, InfoFunc) == REDISMODULE_ERR) return REDISMODULE_ERR;
|
|
|
|
if (RedisModule_CreateCommand(ctx,"info.gets", info_gets,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
if (RedisModule_CreateCommand(ctx,"info.getc", info_getc,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
if (RedisModule_CreateCommand(ctx,"info.geti", info_geti,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
if (RedisModule_CreateCommand(ctx,"info.getu", info_getu,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
if (RedisModule_CreateCommand(ctx,"info.getd", info_getd,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
|
|
return REDISMODULE_OK;
|
|
}
|