2
0

misc.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #define REDISMODULE_EXPERIMENTAL_API
  2. #include "redismodule.h"
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #define UNUSED(x) (void)(x)
  8. int test_call_generic(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  9. {
  10. if (argc<2) {
  11. RedisModule_WrongArity(ctx);
  12. return REDISMODULE_OK;
  13. }
  14. const char* cmdname = RedisModule_StringPtrLen(argv[1], NULL);
  15. RedisModuleCallReply *reply = RedisModule_Call(ctx, cmdname, "v", argv+2, argc-2);
  16. if (reply) {
  17. RedisModule_ReplyWithCallReply(ctx, reply);
  18. RedisModule_FreeCallReply(reply);
  19. } else {
  20. RedisModule_ReplyWithError(ctx, strerror(errno));
  21. }
  22. return REDISMODULE_OK;
  23. }
  24. int test_call_info(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  25. {
  26. RedisModuleCallReply *reply;
  27. if (argc>1)
  28. reply = RedisModule_Call(ctx, "info", "s", argv[1]);
  29. else
  30. reply = RedisModule_Call(ctx, "info", "");
  31. if (reply) {
  32. RedisModule_ReplyWithCallReply(ctx, reply);
  33. RedisModule_FreeCallReply(reply);
  34. } else {
  35. RedisModule_ReplyWithError(ctx, strerror(errno));
  36. }
  37. return REDISMODULE_OK;
  38. }
  39. int test_ld_conv(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
  40. UNUSED(argv);
  41. UNUSED(argc);
  42. long double ld = 0.00000000000000001L;
  43. const char *ldstr = "0.00000000000000001";
  44. RedisModuleString *s1 = RedisModule_CreateStringFromLongDouble(ctx, ld, 1);
  45. RedisModuleString *s2 =
  46. RedisModule_CreateString(ctx, ldstr, strlen(ldstr));
  47. if (RedisModule_StringCompare(s1, s2) != 0) {
  48. char err[4096];
  49. snprintf(err, 4096,
  50. "Failed to convert long double to string ('%s' != '%s')",
  51. RedisModule_StringPtrLen(s1, NULL),
  52. RedisModule_StringPtrLen(s2, NULL));
  53. RedisModule_ReplyWithError(ctx, err);
  54. goto final;
  55. }
  56. long double ld2 = 0;
  57. if (RedisModule_StringToLongDouble(s2, &ld2) == REDISMODULE_ERR) {
  58. RedisModule_ReplyWithError(ctx,
  59. "Failed to convert string to long double");
  60. goto final;
  61. }
  62. if (ld2 != ld) {
  63. char err[4096];
  64. snprintf(err, 4096,
  65. "Failed to convert string to long double (%.40Lf != %.40Lf)",
  66. ld2,
  67. ld);
  68. RedisModule_ReplyWithError(ctx, err);
  69. goto final;
  70. }
  71. /* Make sure we can't convert a string that has \0 in it */
  72. char buf[4] = "123";
  73. buf[1] = '\0';
  74. RedisModuleString *s3 = RedisModule_CreateString(ctx, buf, 3);
  75. long double ld3;
  76. if (RedisModule_StringToLongDouble(s3, &ld3) == REDISMODULE_OK) {
  77. RedisModule_ReplyWithError(ctx, "Invalid string successfully converted to long double");
  78. RedisModule_FreeString(ctx, s3);
  79. goto final;
  80. }
  81. RedisModule_FreeString(ctx, s3);
  82. RedisModule_ReplyWithLongDouble(ctx, ld2);
  83. final:
  84. RedisModule_FreeString(ctx, s1);
  85. RedisModule_FreeString(ctx, s2);
  86. return REDISMODULE_OK;
  87. }
  88. int test_flushall(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  89. {
  90. REDISMODULE_NOT_USED(argv);
  91. REDISMODULE_NOT_USED(argc);
  92. RedisModule_ResetDataset(1, 0);
  93. RedisModule_ReplyWithCString(ctx, "Ok");
  94. return REDISMODULE_OK;
  95. }
  96. int test_dbsize(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  97. {
  98. REDISMODULE_NOT_USED(argv);
  99. REDISMODULE_NOT_USED(argc);
  100. long long ll = RedisModule_DbSize(ctx);
  101. RedisModule_ReplyWithLongLong(ctx, ll);
  102. return REDISMODULE_OK;
  103. }
  104. int test_randomkey(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  105. {
  106. REDISMODULE_NOT_USED(argv);
  107. REDISMODULE_NOT_USED(argc);
  108. RedisModuleString *str = RedisModule_RandomKey(ctx);
  109. RedisModule_ReplyWithString(ctx, str);
  110. RedisModule_FreeString(ctx, str);
  111. return REDISMODULE_OK;
  112. }
  113. RedisModuleKey *open_key_or_reply(RedisModuleCtx *ctx, RedisModuleString *keyname, int mode) {
  114. RedisModuleKey *key = RedisModule_OpenKey(ctx, keyname, mode);
  115. if (!key) {
  116. RedisModule_ReplyWithError(ctx, "key not found");
  117. return NULL;
  118. }
  119. return key;
  120. }
  121. int test_getlru(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  122. {
  123. if (argc<2) {
  124. RedisModule_WrongArity(ctx);
  125. return REDISMODULE_OK;
  126. }
  127. RedisModuleKey *key = open_key_or_reply(ctx, argv[1], REDISMODULE_READ|REDISMODULE_OPEN_KEY_NOTOUCH);
  128. mstime_t lru;
  129. RedisModule_GetLRU(key, &lru);
  130. RedisModule_ReplyWithLongLong(ctx, lru);
  131. RedisModule_CloseKey(key);
  132. return REDISMODULE_OK;
  133. }
  134. int test_setlru(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  135. {
  136. if (argc<3) {
  137. RedisModule_WrongArity(ctx);
  138. return REDISMODULE_OK;
  139. }
  140. RedisModuleKey *key = open_key_or_reply(ctx, argv[1], REDISMODULE_READ|REDISMODULE_OPEN_KEY_NOTOUCH);
  141. mstime_t lru;
  142. if (RedisModule_StringToLongLong(argv[2], &lru) != REDISMODULE_OK) {
  143. RedisModule_ReplyWithError(ctx, "invalid idle time");
  144. return REDISMODULE_OK;
  145. }
  146. int was_set = RedisModule_SetLRU(key, lru)==REDISMODULE_OK;
  147. RedisModule_ReplyWithLongLong(ctx, was_set);
  148. RedisModule_CloseKey(key);
  149. return REDISMODULE_OK;
  150. }
  151. int test_getlfu(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  152. {
  153. if (argc<2) {
  154. RedisModule_WrongArity(ctx);
  155. return REDISMODULE_OK;
  156. }
  157. RedisModuleKey *key = open_key_or_reply(ctx, argv[1], REDISMODULE_READ|REDISMODULE_OPEN_KEY_NOTOUCH);
  158. mstime_t lfu;
  159. RedisModule_GetLFU(key, &lfu);
  160. RedisModule_ReplyWithLongLong(ctx, lfu);
  161. RedisModule_CloseKey(key);
  162. return REDISMODULE_OK;
  163. }
  164. int test_setlfu(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
  165. {
  166. if (argc<3) {
  167. RedisModule_WrongArity(ctx);
  168. return REDISMODULE_OK;
  169. }
  170. RedisModuleKey *key = open_key_or_reply(ctx, argv[1], REDISMODULE_READ|REDISMODULE_OPEN_KEY_NOTOUCH);
  171. mstime_t lfu;
  172. if (RedisModule_StringToLongLong(argv[2], &lfu) != REDISMODULE_OK) {
  173. RedisModule_ReplyWithError(ctx, "invalid freq");
  174. return REDISMODULE_OK;
  175. }
  176. int was_set = RedisModule_SetLFU(key, lfu)==REDISMODULE_OK;
  177. RedisModule_ReplyWithLongLong(ctx, was_set);
  178. RedisModule_CloseKey(key);
  179. return REDISMODULE_OK;
  180. }
  181. int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
  182. REDISMODULE_NOT_USED(argv);
  183. REDISMODULE_NOT_USED(argc);
  184. if (RedisModule_Init(ctx,"misc",1,REDISMODULE_APIVER_1)== REDISMODULE_ERR)
  185. return REDISMODULE_ERR;
  186. if (RedisModule_CreateCommand(ctx,"test.call_generic", test_call_generic,"",0,0,0) == REDISMODULE_ERR)
  187. return REDISMODULE_ERR;
  188. if (RedisModule_CreateCommand(ctx,"test.call_info", test_call_info,"",0,0,0) == REDISMODULE_ERR)
  189. return REDISMODULE_ERR;
  190. if (RedisModule_CreateCommand(ctx,"test.ld_conversion", test_ld_conv, "",0,0,0) == REDISMODULE_ERR)
  191. return REDISMODULE_ERR;
  192. if (RedisModule_CreateCommand(ctx,"test.flushall", test_flushall,"",0,0,0) == REDISMODULE_ERR)
  193. return REDISMODULE_ERR;
  194. if (RedisModule_CreateCommand(ctx,"test.dbsize", test_dbsize,"",0,0,0) == REDISMODULE_ERR)
  195. return REDISMODULE_ERR;
  196. if (RedisModule_CreateCommand(ctx,"test.randomkey", test_randomkey,"",0,0,0) == REDISMODULE_ERR)
  197. return REDISMODULE_ERR;
  198. if (RedisModule_CreateCommand(ctx,"test.setlru", test_setlru,"",0,0,0) == REDISMODULE_ERR)
  199. return REDISMODULE_ERR;
  200. if (RedisModule_CreateCommand(ctx,"test.getlru", test_getlru,"",0,0,0) == REDISMODULE_ERR)
  201. return REDISMODULE_ERR;
  202. if (RedisModule_CreateCommand(ctx,"test.setlfu", test_setlfu,"",0,0,0) == REDISMODULE_ERR)
  203. return REDISMODULE_ERR;
  204. if (RedisModule_CreateCommand(ctx,"test.getlfu", test_getlfu,"",0,0,0) == REDISMODULE_ERR)
  205. return REDISMODULE_ERR;
  206. return REDISMODULE_OK;
  207. }