mirror of
http://github.com/valkey-io/valkey
synced 2024-11-22 18:54:58 +00:00
104 lines
3.0 KiB
C
104 lines
3.0 KiB
C
|
|
#define REDISMODULE_EXPERIMENTAL_API
|
|
#include "redismodule.h"
|
|
|
|
static void timer_callback(RedisModuleCtx *ctx, void *data)
|
|
{
|
|
RedisModuleString *keyname = data;
|
|
RedisModuleCallReply *reply;
|
|
|
|
reply = RedisModule_Call(ctx, "INCR", "s", keyname);
|
|
if (reply != NULL)
|
|
RedisModule_FreeCallReply(reply);
|
|
RedisModule_FreeString(ctx, keyname);
|
|
}
|
|
|
|
int test_createtimer(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
|
{
|
|
if (argc != 3) {
|
|
RedisModule_WrongArity(ctx);
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
long long period;
|
|
if (RedisModule_StringToLongLong(argv[1], &period) == REDISMODULE_ERR) {
|
|
RedisModule_ReplyWithError(ctx, "Invalid time specified.");
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
RedisModuleString *keyname = argv[2];
|
|
RedisModule_RetainString(ctx, keyname);
|
|
|
|
RedisModuleTimerID id = RedisModule_CreateTimer(ctx, period, timer_callback, keyname);
|
|
RedisModule_ReplyWithLongLong(ctx, id);
|
|
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
int test_gettimer(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
|
{
|
|
if (argc != 2) {
|
|
RedisModule_WrongArity(ctx);
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
long long id;
|
|
if (RedisModule_StringToLongLong(argv[1], &id) == REDISMODULE_ERR) {
|
|
RedisModule_ReplyWithError(ctx, "Invalid id specified.");
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
uint64_t remaining;
|
|
RedisModuleString *keyname;
|
|
if (RedisModule_GetTimerInfo(ctx, id, &remaining, (void **)&keyname) == REDISMODULE_ERR) {
|
|
RedisModule_ReplyWithNull(ctx);
|
|
} else {
|
|
RedisModule_ReplyWithArray(ctx, 2);
|
|
RedisModule_ReplyWithString(ctx, keyname);
|
|
RedisModule_ReplyWithLongLong(ctx, remaining);
|
|
}
|
|
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
int test_stoptimer(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
|
{
|
|
if (argc != 2) {
|
|
RedisModule_WrongArity(ctx);
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
long long id;
|
|
if (RedisModule_StringToLongLong(argv[1], &id) == REDISMODULE_ERR) {
|
|
RedisModule_ReplyWithError(ctx, "Invalid id specified.");
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
int ret = 0;
|
|
RedisModuleString *keyname;
|
|
if (RedisModule_StopTimer(ctx, id, (void **) &keyname) == REDISMODULE_OK) {
|
|
RedisModule_FreeString(ctx, keyname);
|
|
ret = 1;
|
|
}
|
|
|
|
RedisModule_ReplyWithLongLong(ctx, ret);
|
|
return REDISMODULE_OK;
|
|
}
|
|
|
|
|
|
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
|
REDISMODULE_NOT_USED(argv);
|
|
REDISMODULE_NOT_USED(argc);
|
|
if (RedisModule_Init(ctx,"timer",1,REDISMODULE_APIVER_1)== REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
|
|
if (RedisModule_CreateCommand(ctx,"test.createtimer", test_createtimer,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
if (RedisModule_CreateCommand(ctx,"test.gettimer", test_gettimer,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
if (RedisModule_CreateCommand(ctx,"test.stoptimer", test_stoptimer,"",0,0,0) == REDISMODULE_ERR)
|
|
return REDISMODULE_ERR;
|
|
|
|
return REDISMODULE_OK;
|
|
}
|