diff options
Diffstat (limited to 'command.h')
| -rw-r--r-- | command.h | 179 |
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 |
