summaryrefslogtreecommitdiff
path: root/command.h
diff options
context:
space:
mode:
Diffstat (limited to 'command.h')
-rw-r--r--command.h179
1 files changed, 179 insertions, 0 deletions
diff --git a/command.h b/command.h
new file mode 100644
index 0000000..b7c388a
--- /dev/null
+++ b/command.h
@@ -0,0 +1,179 @@
+#ifndef __COMMAND_H_
+#define __COMMAND_H_
+
+#include <stdint.h>
+
+#include "hiredis.h"
+#include "adlist.h"
+
+typedef enum cmd_parse_result {
+ CMD_PARSE_OK, /* parsing ok */
+ CMD_PARSE_ENOMEM, /* out of memory */
+ CMD_PARSE_ERROR, /* parsing error */
+ CMD_PARSE_REPAIR, /* more to parse -> repair parsed & unparsed data */
+ CMD_PARSE_AGAIN, /* incomplete -> parse again */
+} cmd_parse_result_t;
+
+#define CMD_TYPE_CODEC(ACTION) \
+ ACTION( UNKNOWN ) \
+ ACTION( REQ_REDIS_DEL ) /* redis commands - keys */ \
+ ACTION( REQ_REDIS_EXISTS ) \
+ ACTION( REQ_REDIS_EXPIRE ) \
+ ACTION( REQ_REDIS_EXPIREAT ) \
+ ACTION( REQ_REDIS_PEXPIRE ) \
+ ACTION( REQ_REDIS_PEXPIREAT ) \
+ ACTION( REQ_REDIS_PERSIST ) \
+ ACTION( REQ_REDIS_PTTL ) \
+ ACTION( REQ_REDIS_SORT ) \
+ ACTION( REQ_REDIS_TTL ) \
+ ACTION( REQ_REDIS_TYPE ) \
+ ACTION( REQ_REDIS_APPEND ) /* redis requests - string */ \
+ ACTION( REQ_REDIS_BITCOUNT ) \
+ ACTION( REQ_REDIS_DECR ) \
+ ACTION( REQ_REDIS_DECRBY ) \
+ ACTION( REQ_REDIS_DUMP ) \
+ ACTION( REQ_REDIS_GET ) \
+ ACTION( REQ_REDIS_GETBIT ) \
+ ACTION( REQ_REDIS_GETRANGE ) \
+ ACTION( REQ_REDIS_GETSET ) \
+ ACTION( REQ_REDIS_INCR ) \
+ ACTION( REQ_REDIS_INCRBY ) \
+ ACTION( REQ_REDIS_INCRBYFLOAT ) \
+ ACTION( REQ_REDIS_MGET ) \
+ ACTION( REQ_REDIS_MSET ) \
+ ACTION( REQ_REDIS_PSETEX ) \
+ ACTION( REQ_REDIS_RESTORE ) \
+ ACTION( REQ_REDIS_SET ) \
+ ACTION( REQ_REDIS_SETBIT ) \
+ ACTION( REQ_REDIS_SETEX ) \
+ ACTION( REQ_REDIS_SETNX ) \
+ ACTION( REQ_REDIS_SETRANGE ) \
+ ACTION( REQ_REDIS_STRLEN ) \
+ ACTION( REQ_REDIS_HDEL ) /* redis requests - hashes */ \
+ ACTION( REQ_REDIS_HEXISTS ) \
+ ACTION( REQ_REDIS_HGET ) \
+ ACTION( REQ_REDIS_HGETALL ) \
+ ACTION( REQ_REDIS_HINCRBY ) \
+ ACTION( REQ_REDIS_HINCRBYFLOAT ) \
+ ACTION( REQ_REDIS_HKEYS ) \
+ ACTION( REQ_REDIS_HLEN ) \
+ ACTION( REQ_REDIS_HMGET ) \
+ ACTION( REQ_REDIS_HMSET ) \
+ ACTION( REQ_REDIS_HSET ) \
+ ACTION( REQ_REDIS_HSETNX ) \
+ ACTION( REQ_REDIS_HSCAN) \
+ ACTION( REQ_REDIS_HVALS ) \
+ ACTION( REQ_REDIS_LINDEX ) /* redis requests - lists */ \
+ ACTION( REQ_REDIS_LINSERT ) \
+ ACTION( REQ_REDIS_LLEN ) \
+ ACTION( REQ_REDIS_LPOP ) \
+ ACTION( REQ_REDIS_LPUSH ) \
+ ACTION( REQ_REDIS_LPUSHX ) \
+ ACTION( REQ_REDIS_LRANGE ) \
+ ACTION( REQ_REDIS_LREM ) \
+ ACTION( REQ_REDIS_LSET ) \
+ ACTION( REQ_REDIS_LTRIM ) \
+ ACTION( REQ_REDIS_PFADD ) /* redis requests - hyperloglog */ \
+ ACTION( REQ_REDIS_PFCOUNT ) \
+ ACTION( REQ_REDIS_PFMERGE ) \
+ ACTION( REQ_REDIS_RPOP ) \
+ ACTION( REQ_REDIS_RPOPLPUSH ) \
+ ACTION( REQ_REDIS_RPUSH ) \
+ ACTION( REQ_REDIS_RPUSHX ) \
+ ACTION( REQ_REDIS_SADD ) /* redis requests - sets */ \
+ ACTION( REQ_REDIS_SCARD ) \
+ ACTION( REQ_REDIS_SDIFF ) \
+ ACTION( REQ_REDIS_SDIFFSTORE ) \
+ ACTION( REQ_REDIS_SINTER ) \
+ ACTION( REQ_REDIS_SINTERSTORE ) \
+ ACTION( REQ_REDIS_SISMEMBER ) \
+ ACTION( REQ_REDIS_SMEMBERS ) \
+ ACTION( REQ_REDIS_SMOVE ) \
+ ACTION( REQ_REDIS_SPOP ) \
+ ACTION( REQ_REDIS_SRANDMEMBER ) \
+ ACTION( REQ_REDIS_SREM ) \
+ ACTION( REQ_REDIS_SUNION ) \
+ ACTION( REQ_REDIS_SUNIONSTORE ) \
+ ACTION( REQ_REDIS_SSCAN) \
+ ACTION( REQ_REDIS_ZADD ) /* redis requests - sorted sets */ \
+ ACTION( REQ_REDIS_ZCARD ) \
+ ACTION( REQ_REDIS_ZCOUNT ) \
+ ACTION( REQ_REDIS_ZINCRBY ) \
+ ACTION( REQ_REDIS_ZINTERSTORE ) \
+ ACTION( REQ_REDIS_ZLEXCOUNT ) \
+ ACTION( REQ_REDIS_ZRANGE ) \
+ ACTION( REQ_REDIS_ZRANGEBYLEX ) \
+ ACTION( REQ_REDIS_ZRANGEBYSCORE ) \
+ ACTION( REQ_REDIS_ZRANK ) \
+ ACTION( REQ_REDIS_ZREM ) \
+ ACTION( REQ_REDIS_ZREMRANGEBYRANK ) \
+ ACTION( REQ_REDIS_ZREMRANGEBYLEX ) \
+ ACTION( REQ_REDIS_ZREMRANGEBYSCORE ) \
+ ACTION( REQ_REDIS_ZREVRANGE ) \
+ ACTION( REQ_REDIS_ZREVRANGEBYSCORE ) \
+ ACTION( REQ_REDIS_ZREVRANK ) \
+ ACTION( REQ_REDIS_ZSCORE ) \
+ ACTION( REQ_REDIS_ZUNIONSTORE ) \
+ ACTION( REQ_REDIS_ZSCAN) \
+ ACTION( REQ_REDIS_EVAL ) /* redis requests - eval */ \
+ ACTION( REQ_REDIS_EVALSHA ) \
+ ACTION( REQ_REDIS_PING ) /* redis requests - ping/quit */ \
+ ACTION( REQ_REDIS_QUIT) \
+ ACTION( REQ_REDIS_AUTH) \
+ ACTION( RSP_REDIS_STATUS ) /* redis response */ \
+ ACTION( RSP_REDIS_ERROR ) \
+ ACTION( RSP_REDIS_INTEGER ) \
+ ACTION( RSP_REDIS_BULK ) \
+ ACTION( RSP_REDIS_MULTIBULK ) \
+ ACTION( SENTINEL ) \
+
+
+#define DEFINE_ACTION(_name) CMD_##_name,
+typedef enum cmd_type {
+ CMD_TYPE_CODEC(DEFINE_ACTION)
+} cmd_type_t;
+#undef DEFINE_ACTION
+
+
+struct keypos {
+ char *start; /* key start pos */
+ char *end; /* key end pos */
+ uint32_t remain_len; /* remain length after keypos->end for more key-value pairs in command, like mset */
+};
+
+struct cmd {
+
+ uint64_t id; /* command id */
+
+ cmd_parse_result_t result; /* command parsing result */
+ char *errstr; /* error info when the command parse failed */
+
+ cmd_type_t type; /* command type */
+
+ char *cmd;
+ uint32_t clen; /* command length */
+
+ struct hiarray *keys; /* array of keypos, for req */
+
+ char *narg_start; /* narg start (redis) */
+ char *narg_end; /* narg end (redis) */
+ uint32_t narg; /* # arguments (redis) */
+
+ unsigned quit:1; /* quit request? */
+ unsigned noforward:1; /* not need forward (example: ping) */
+
+ int slot_num; /* this command should send to witch slot?
+ * -1:the keys in this command cross different slots*/
+ struct cmd **frag_seq; /* sequence of fragment command, map from keys to fragments*/
+
+ redisReply *reply;
+
+ hilist *sub_commands; /* just for pipeline and multi-key commands */
+};
+
+void redis_parse_cmd(struct cmd *r);
+
+struct cmd *command_get(void);
+void command_destroy(struct cmd *command);
+
+#endif