1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#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;
}
|