command.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #ifndef __COMMAND_H_
  2. #define __COMMAND_H_
  3. #include <stdint.h>
  4. #include "hiredis.h"
  5. #include "adlist.h"
  6. typedef enum cmd_parse_result {
  7. CMD_PARSE_OK, /* parsing ok */
  8. CMD_PARSE_ENOMEM, /* out of memory */
  9. CMD_PARSE_ERROR, /* parsing error */
  10. CMD_PARSE_REPAIR, /* more to parse -> repair parsed & unparsed data */
  11. CMD_PARSE_AGAIN, /* incomplete -> parse again */
  12. } cmd_parse_result_t;
  13. #define CMD_TYPE_CODEC(ACTION) \
  14. ACTION( UNKNOWN ) \
  15. ACTION( REQ_REDIS_DEL ) /* redis commands - keys */ \
  16. ACTION( REQ_REDIS_EXISTS ) \
  17. ACTION( REQ_REDIS_EXPIRE ) \
  18. ACTION( REQ_REDIS_EXPIREAT ) \
  19. ACTION( REQ_REDIS_PEXPIRE ) \
  20. ACTION( REQ_REDIS_PEXPIREAT ) \
  21. ACTION( REQ_REDIS_PERSIST ) \
  22. ACTION( REQ_REDIS_PTTL ) \
  23. ACTION( REQ_REDIS_SORT ) \
  24. ACTION( REQ_REDIS_TTL ) \
  25. ACTION( REQ_REDIS_TYPE ) \
  26. ACTION( REQ_REDIS_APPEND ) /* redis requests - string */ \
  27. ACTION( REQ_REDIS_BITCOUNT ) \
  28. ACTION( REQ_REDIS_DECR ) \
  29. ACTION( REQ_REDIS_DECRBY ) \
  30. ACTION( REQ_REDIS_DUMP ) \
  31. ACTION( REQ_REDIS_GET ) \
  32. ACTION( REQ_REDIS_GETBIT ) \
  33. ACTION( REQ_REDIS_GETRANGE ) \
  34. ACTION( REQ_REDIS_GETSET ) \
  35. ACTION( REQ_REDIS_INCR ) \
  36. ACTION( REQ_REDIS_INCRBY ) \
  37. ACTION( REQ_REDIS_INCRBYFLOAT ) \
  38. ACTION( REQ_REDIS_MGET ) \
  39. ACTION( REQ_REDIS_MSET ) \
  40. ACTION( REQ_REDIS_PSETEX ) \
  41. ACTION( REQ_REDIS_RESTORE ) \
  42. ACTION( REQ_REDIS_SET ) \
  43. ACTION( REQ_REDIS_SETBIT ) \
  44. ACTION( REQ_REDIS_SETEX ) \
  45. ACTION( REQ_REDIS_SETNX ) \
  46. ACTION( REQ_REDIS_SETRANGE ) \
  47. ACTION( REQ_REDIS_STRLEN ) \
  48. ACTION( REQ_REDIS_HDEL ) /* redis requests - hashes */ \
  49. ACTION( REQ_REDIS_HEXISTS ) \
  50. ACTION( REQ_REDIS_HGET ) \
  51. ACTION( REQ_REDIS_HGETALL ) \
  52. ACTION( REQ_REDIS_HINCRBY ) \
  53. ACTION( REQ_REDIS_HINCRBYFLOAT ) \
  54. ACTION( REQ_REDIS_HKEYS ) \
  55. ACTION( REQ_REDIS_HLEN ) \
  56. ACTION( REQ_REDIS_HMGET ) \
  57. ACTION( REQ_REDIS_HMSET ) \
  58. ACTION( REQ_REDIS_HSET ) \
  59. ACTION( REQ_REDIS_HSETNX ) \
  60. ACTION( REQ_REDIS_HSCAN) \
  61. ACTION( REQ_REDIS_HVALS ) \
  62. ACTION( REQ_REDIS_LINDEX ) /* redis requests - lists */ \
  63. ACTION( REQ_REDIS_LINSERT ) \
  64. ACTION( REQ_REDIS_LLEN ) \
  65. ACTION( REQ_REDIS_LPOP ) \
  66. ACTION( REQ_REDIS_LPUSH ) \
  67. ACTION( REQ_REDIS_LPUSHX ) \
  68. ACTION( REQ_REDIS_LRANGE ) \
  69. ACTION( REQ_REDIS_LREM ) \
  70. ACTION( REQ_REDIS_LSET ) \
  71. ACTION( REQ_REDIS_LTRIM ) \
  72. ACTION( REQ_REDIS_PFADD ) /* redis requests - hyperloglog */ \
  73. ACTION( REQ_REDIS_PFCOUNT ) \
  74. ACTION( REQ_REDIS_PFMERGE ) \
  75. ACTION( REQ_REDIS_RPOP ) \
  76. ACTION( REQ_REDIS_RPOPLPUSH ) \
  77. ACTION( REQ_REDIS_RPUSH ) \
  78. ACTION( REQ_REDIS_RPUSHX ) \
  79. ACTION( REQ_REDIS_SADD ) /* redis requests - sets */ \
  80. ACTION( REQ_REDIS_SCARD ) \
  81. ACTION( REQ_REDIS_SDIFF ) \
  82. ACTION( REQ_REDIS_SDIFFSTORE ) \
  83. ACTION( REQ_REDIS_SINTER ) \
  84. ACTION( REQ_REDIS_SINTERSTORE ) \
  85. ACTION( REQ_REDIS_SISMEMBER ) \
  86. ACTION( REQ_REDIS_SMEMBERS ) \
  87. ACTION( REQ_REDIS_SMOVE ) \
  88. ACTION( REQ_REDIS_SPOP ) \
  89. ACTION( REQ_REDIS_SRANDMEMBER ) \
  90. ACTION( REQ_REDIS_SREM ) \
  91. ACTION( REQ_REDIS_SUNION ) \
  92. ACTION( REQ_REDIS_SUNIONSTORE ) \
  93. ACTION( REQ_REDIS_SSCAN) \
  94. ACTION( REQ_REDIS_ZADD ) /* redis requests - sorted sets */ \
  95. ACTION( REQ_REDIS_ZCARD ) \
  96. ACTION( REQ_REDIS_ZCOUNT ) \
  97. ACTION( REQ_REDIS_ZINCRBY ) \
  98. ACTION( REQ_REDIS_ZINTERSTORE ) \
  99. ACTION( REQ_REDIS_ZLEXCOUNT ) \
  100. ACTION( REQ_REDIS_ZRANGE ) \
  101. ACTION( REQ_REDIS_ZRANGEBYLEX ) \
  102. ACTION( REQ_REDIS_ZRANGEBYSCORE ) \
  103. ACTION( REQ_REDIS_ZRANK ) \
  104. ACTION( REQ_REDIS_ZREM ) \
  105. ACTION( REQ_REDIS_ZREMRANGEBYRANK ) \
  106. ACTION( REQ_REDIS_ZREMRANGEBYLEX ) \
  107. ACTION( REQ_REDIS_ZREMRANGEBYSCORE ) \
  108. ACTION( REQ_REDIS_ZREVRANGE ) \
  109. ACTION( REQ_REDIS_ZREVRANGEBYSCORE ) \
  110. ACTION( REQ_REDIS_ZREVRANK ) \
  111. ACTION( REQ_REDIS_ZSCORE ) \
  112. ACTION( REQ_REDIS_ZUNIONSTORE ) \
  113. ACTION( REQ_REDIS_ZSCAN) \
  114. ACTION( REQ_REDIS_EVAL ) /* redis requests - eval */ \
  115. ACTION( REQ_REDIS_EVALSHA ) \
  116. ACTION( REQ_REDIS_PING ) /* redis requests - ping/quit */ \
  117. ACTION( REQ_REDIS_QUIT) \
  118. ACTION( REQ_REDIS_AUTH) \
  119. ACTION( RSP_REDIS_STATUS ) /* redis response */ \
  120. ACTION( RSP_REDIS_ERROR ) \
  121. ACTION( RSP_REDIS_INTEGER ) \
  122. ACTION( RSP_REDIS_BULK ) \
  123. ACTION( RSP_REDIS_MULTIBULK ) \
  124. ACTION( SENTINEL ) \
  125. #define DEFINE_ACTION(_name) CMD_##_name,
  126. typedef enum cmd_type {
  127. CMD_TYPE_CODEC(DEFINE_ACTION)
  128. } cmd_type_t;
  129. #undef DEFINE_ACTION
  130. struct keypos {
  131. char *start; /* key start pos */
  132. char *end; /* key end pos */
  133. uint32_t remain_len; /* remain length after keypos->end for more key-value pairs in command, like mset */
  134. };
  135. struct cmd {
  136. uint64_t id; /* command id */
  137. cmd_parse_result_t result; /* command parsing result */
  138. char *errstr; /* error info when the command parse failed */
  139. cmd_type_t type; /* command type */
  140. char *cmd;
  141. uint32_t clen; /* command length */
  142. struct hiarray *keys; /* array of keypos, for req */
  143. char *narg_start; /* narg start (redis) */
  144. char *narg_end; /* narg end (redis) */
  145. uint32_t narg; /* # arguments (redis) */
  146. unsigned quit:1; /* quit request? */
  147. unsigned noforward:1; /* not need forward (example: ping) */
  148. int slot_num; /* this command should send to witch slot?
  149. * -1:the keys in this command cross different slots*/
  150. struct cmd **frag_seq; /* sequence of fragment command, map from keys to fragments*/
  151. redisReply *reply;
  152. hilist *sub_commands; /* just for pipeline and multi-key commands */
  153. };
  154. void redis_parse_cmd(struct cmd *r);
  155. struct cmd *command_get(void);
  156. void command_destroy(struct cmd *command);
  157. #endif