timer.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #define REDISMODULE_EXPERIMENTAL_API
  2. #include "redismodule.h"
  3. static void timer_callback(RedisModuleCtx *ctx, void *data)
  4. {
  5. RedisModuleString *keyname = data;
  6. RedisModuleCallReply *reply;
  7. reply = RedisModule_Call(ctx, "INCR", "s", keyname);
  8. if (reply != NULL)
  9. RedisModule_FreeCallReply(reply);
  10. RedisModule_FreeString(ctx, keyname);
  11. }
  12. int test_createtimer(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  13. {
  14. if (argc != 3) {
  15. RedisModule_WrongArity(ctx);
  16. return REDISMODULE_OK;
  17. }
  18. long long period;
  19. if (RedisModule_StringToLongLong(argv[1], &period) == REDISMODULE_ERR) {
  20. RedisModule_ReplyWithError(ctx, "Invalid time specified.");
  21. return REDISMODULE_OK;
  22. }
  23. RedisModuleString *keyname = argv[2];
  24. RedisModule_RetainString(ctx, keyname);
  25. RedisModuleTimerID id = RedisModule_CreateTimer(ctx, period, timer_callback, keyname);
  26. RedisModule_ReplyWithLongLong(ctx, id);
  27. return REDISMODULE_OK;
  28. }
  29. int test_gettimer(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  30. {
  31. if (argc != 2) {
  32. RedisModule_WrongArity(ctx);
  33. return REDISMODULE_OK;
  34. }
  35. long long id;
  36. if (RedisModule_StringToLongLong(argv[1], &id) == REDISMODULE_ERR) {
  37. RedisModule_ReplyWithError(ctx, "Invalid id specified.");
  38. return REDISMODULE_OK;
  39. }
  40. uint64_t remaining;
  41. RedisModuleString *keyname;
  42. if (RedisModule_GetTimerInfo(ctx, id, &remaining, (void **)&keyname) == REDISMODULE_ERR) {
  43. RedisModule_ReplyWithNull(ctx);
  44. } else {
  45. RedisModule_ReplyWithArray(ctx, 2);
  46. RedisModule_ReplyWithString(ctx, keyname);
  47. RedisModule_ReplyWithLongLong(ctx, remaining);
  48. }
  49. return REDISMODULE_OK;
  50. }
  51. int test_stoptimer(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  52. {
  53. if (argc != 2) {
  54. RedisModule_WrongArity(ctx);
  55. return REDISMODULE_OK;
  56. }
  57. long long id;
  58. if (RedisModule_StringToLongLong(argv[1], &id) == REDISMODULE_ERR) {
  59. RedisModule_ReplyWithError(ctx, "Invalid id specified.");
  60. return REDISMODULE_OK;
  61. }
  62. int ret = 0;
  63. RedisModuleString *keyname;
  64. if (RedisModule_StopTimer(ctx, id, (void **) &keyname) == REDISMODULE_OK) {
  65. RedisModule_FreeString(ctx, keyname);
  66. ret = 1;
  67. }
  68. RedisModule_ReplyWithLongLong(ctx, ret);
  69. return REDISMODULE_OK;
  70. }
  71. int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
  72. REDISMODULE_NOT_USED(argv);
  73. REDISMODULE_NOT_USED(argc);
  74. if (RedisModule_Init(ctx,"timer",1,REDISMODULE_APIVER_1)== REDISMODULE_ERR)
  75. return REDISMODULE_ERR;
  76. if (RedisModule_CreateCommand(ctx,"test.createtimer", test_createtimer,"",0,0,0) == REDISMODULE_ERR)
  77. return REDISMODULE_ERR;
  78. if (RedisModule_CreateCommand(ctx,"test.gettimer", test_gettimer,"",0,0,0) == REDISMODULE_ERR)
  79. return REDISMODULE_ERR;
  80. if (RedisModule_CreateCommand(ctx,"test.stoptimer", test_stoptimer,"",0,0,0) == REDISMODULE_ERR)
  81. return REDISMODULE_ERR;
  82. return REDISMODULE_OK;
  83. }