简化协议,
/**
* Request
* Cmd: | OP(1) | argc(1) | repeat { arglen(4) | arg } |
*
* Response
* Rsp: | OP(1) | status(1) | datalen(4) | data |
*/
封装客户端进行批处理和单条命令测试。
This commit is contained in:
@@ -14,26 +14,20 @@ int kvs_write_u32(uint8_t **pp, const uint8_t *end, uint32_t v);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Header: | magic(4) | type(1) | payloadLen(4) | reqId(4) | flag1(1) | flag2(2) |
|
||||
*
|
||||
/**
|
||||
* Request
|
||||
* Payload: | opcount(4) | repeat Cmd |
|
||||
* Cmd: | OP(1) | argc(4) | repeat Arg |
|
||||
* Arg: | arglen(4) | arg |
|
||||
* Cmd: | OP(1) | argc(1) | repeat { arglen(4) | arg } |
|
||||
*
|
||||
* Response
|
||||
* Payload: | opcount(4) | repeat Cmd |
|
||||
* Cmd: | status(1) | datalen(4) | data |
|
||||
* Rsp: | OP(1) | status(1) | datalen(4) | data |
|
||||
*/
|
||||
|
||||
#define KVS_HDR_LEN 16 // | magic(4) | type(1) | payloadLen(4) | reqId(4) | flag1(1) | flag2(2) |
|
||||
#define KVS_MAGIC 0x4B565331u
|
||||
#define KVS_TYPE_REQ 1
|
||||
#define KVS_TYPE_RESP 2
|
||||
|
||||
#define KVS_MAX_OPCOUNT 1024
|
||||
#define KVS_MAX_RESPONSE (64 * 1024)
|
||||
#define KVS_MAX_CMDS_PER_CALL 64
|
||||
// 1MB
|
||||
#define KVS_MAX_RESPONSE (1024u * 1024u)
|
||||
#define KVS_MAX_ARGC 64
|
||||
#define KVS_MAX_ARGLEN (1024u * 1024u)
|
||||
#define KVS_MAX_CMD_BYTES (4u * 1024u * 1024u)
|
||||
|
||||
enum {
|
||||
KVS_STATUS_OK = 0,
|
||||
@@ -43,43 +37,34 @@ enum {
|
||||
KVS_STATUS_BADREQ = 4
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
KVS_OK = 1,
|
||||
KVS_NEED_MORE = 0,
|
||||
KVS_ERROR = -1
|
||||
}kvs_rc_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t op;
|
||||
uint32_t argc;
|
||||
char **argv;
|
||||
} kvs_op_t;
|
||||
typedef struct kvs_arg_s{
|
||||
uint32_t len;
|
||||
const uint8_t *data;
|
||||
} kvs_arg_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t magic;
|
||||
uint8_t type;
|
||||
uint32_t payloadLen;
|
||||
uint32_t reqId;
|
||||
uint8_t flag1;
|
||||
uint16_t flag2;
|
||||
typedef struct kvs_req_s{
|
||||
uint8_t op;
|
||||
uint8_t argc;
|
||||
kvs_arg_t *args;
|
||||
}kvs_req_t;
|
||||
|
||||
// payload ops
|
||||
uint32_t opcount;
|
||||
kvs_op_t *ops;
|
||||
|
||||
// consumed bytes (header+payload)
|
||||
uint32_t consumed;
|
||||
} kvs_request_t;
|
||||
|
||||
typedef struct {
|
||||
typedef struct kvs_rsp_s{
|
||||
uint8_t op;
|
||||
uint8_t status;
|
||||
uint32_t datalen;
|
||||
const char *data_ptr;
|
||||
} kvs_response_t;
|
||||
uint32_t dlen;
|
||||
const uint8_t *data;
|
||||
} kvs_rsp_t;
|
||||
|
||||
int kvs_parse_one_cmd(const uint8_t *request, int request_length, kvs_req_t *req_out);
|
||||
void kvs_free_request(kvs_req_t *req);
|
||||
int kvs_execute_one_cmd(const kvs_req_t *req, kvs_rsp_t *rsp_out);
|
||||
int kvs_build_one_rsp(const kvs_rsp_t *results, uint8_t *response, size_t response_cap);
|
||||
|
||||
int kvs_parse_request(const uint8_t *msg, int length, kvs_request_t *req_out);
|
||||
int kvs_execute_request(const kvs_request_t *req, kvs_response_t *results);
|
||||
int kvs_build_response(const kvs_request_t *req,
|
||||
const kvs_response_t *results,
|
||||
uint8_t *response, int response_cap);
|
||||
void kvs_free_request(kvs_request_t *req);
|
||||
void kvs_exec_one_op(uint8_t op, uint32_t argc, char **argv,
|
||||
uint8_t *status_out,
|
||||
const char **data_out, uint32_t *dlen_out);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user