提供array和hashtable的存储引擎层的二进制安全支持,把入口函数修改为接收参数长度,将strlen、strcmp、strcpy替换。
This commit is contained in:
187
kvs_rw_tools.c
187
kvs_rw_tools.c
@@ -2,6 +2,18 @@
|
||||
#include "kvs_rw_tools.h"
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#if ENABLE_ARRAY
|
||||
extern kvs_array_t global_array;
|
||||
#endif
|
||||
|
||||
#if ENABLE_RBTREE
|
||||
extern kvs_rbtree_t global_rbtree;
|
||||
#endif
|
||||
|
||||
#if ENABLE_HASH
|
||||
extern kvs_hash_t global_hash;
|
||||
#endif
|
||||
|
||||
int kvs_need(const uint8_t *p, const uint8_t *end, size_t n) {
|
||||
return (p + n <= end) ? 0 : -1;
|
||||
}
|
||||
@@ -159,6 +171,181 @@ void kvs_free_request(kvs_req_t *req) {
|
||||
req->argc = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 输入:req
|
||||
* 输出:rsp
|
||||
*/
|
||||
int kvs_execute_one_cmd(const kvs_req_t *req, kvs_rsp_t *rsp_out) {
|
||||
if(!req || !rsp_out) return -1;
|
||||
rsp_out->op = req->op;
|
||||
rsp_out->status = KVS_STATUS_ERROR;
|
||||
rsp_out->data = NULL;
|
||||
rsp_out->dlen = 0;
|
||||
|
||||
int argc = req->argc;
|
||||
int op = req->op;
|
||||
kvs_arg_t *argv = req->args;
|
||||
|
||||
size_t key_len = 0;
|
||||
const void *key = NULL;
|
||||
size_t value_len = 0;
|
||||
const void *val = NULL;
|
||||
|
||||
if(argc == 1){
|
||||
key_len = argv[0].len;
|
||||
key = argv[0].data;
|
||||
}else if(argc == 2){
|
||||
key_len = argv[0].len;
|
||||
key = argv[0].data;
|
||||
value_len = argv[1].len;
|
||||
val = argv[1].data;
|
||||
}
|
||||
|
||||
// 基本参数校验(按你原有命令语义)
|
||||
switch (op) {
|
||||
case KVS_CMD_SET:
|
||||
case KVS_CMD_MOD:
|
||||
case KVS_CMD_RSET:
|
||||
case KVS_CMD_RMOD:
|
||||
case KVS_CMD_HSET:
|
||||
case KVS_CMD_HMOD:
|
||||
if (argc != 2 || !key || !val) { rsp_out->status = KVS_STATUS_BADREQ; return -1; }
|
||||
break;
|
||||
case KVS_CMD_GET:
|
||||
case KVS_CMD_DEL:
|
||||
case KVS_CMD_EXIST:
|
||||
case KVS_CMD_RGET:
|
||||
case KVS_CMD_RDEL:
|
||||
case KVS_CMD_REXIST:
|
||||
case KVS_CMD_HGET:
|
||||
case KVS_CMD_HDEL:
|
||||
case KVS_CMD_HEXIST:
|
||||
if (argc != 1 || !key) { rsp_out->status = KVS_STATUS_BADREQ; return -1; }
|
||||
break;
|
||||
default:
|
||||
rsp_out->status = KVS_STATUS_BADREQ;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
const char *result = NULL;
|
||||
|
||||
switch (op) {
|
||||
#if ENABLE_ARRAY
|
||||
case KVS_CMD_SET:
|
||||
ret = kvs_array_set_bin(&global_array, key, key_len, val, value_len);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_GET:
|
||||
result = kvs_array_get_bin(&global_array, key, key_len, &value_len);
|
||||
if (!result) { rsp_out->status = KVS_STATUS_NO_EXIST; return 0; }
|
||||
rsp_out->status = KVS_STATUS_OK;
|
||||
rsp_out->data = result;
|
||||
rsp_out->dlen = (uint32_t)value_len;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_DEL:
|
||||
ret = kvs_array_del_bin(&global_array, key, key_len);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_MOD:
|
||||
ret = kvs_array_mod_bin(&global_array, key, key_len, val, value_len);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_EXIST:
|
||||
ret = kvs_array_exist_bin(&global_array, key, key_len);
|
||||
rsp_out->status = (ret == 0) ? KVS_STATUS_EXIST : KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#if ENABLE_RBTREE
|
||||
case KVS_CMD_RSET:
|
||||
ret = kvs_rbtree_set(&global_rbtree, (char*)key, (char*)val);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_RGET:
|
||||
result = kvs_rbtree_get(&global_rbtree, (char*)key);
|
||||
if (!result) { rsp_out->status = KVS_STATUS_NO_EXIST; return 0; }
|
||||
rsp_out->status = KVS_STATUS_OK;
|
||||
rsp_out->data = result;
|
||||
rsp_out->dlen = (uint32_t)strlen(result);
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_RDEL:
|
||||
ret = kvs_rbtree_del(&global_rbtree, (char*)key);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_RMOD:
|
||||
ret = kvs_rbtree_mod(&global_rbtree, (char*)key, (char*)val);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_REXIST:
|
||||
ret = kvs_rbtree_exist(&global_rbtree, (char*)key);
|
||||
rsp_out->status = (ret == 0) ? KVS_STATUS_EXIST : KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#if ENABLE_HASH
|
||||
case KVS_CMD_HSET:
|
||||
ret = kvs_hash_set_bin(&global_hash, key, key_len, val, value_len);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_HGET:
|
||||
result = kvs_hash_get_bin(&global_hash, key, key_len, &value_len);
|
||||
if (!result) { rsp_out->status = KVS_STATUS_NO_EXIST; return 0; }
|
||||
rsp_out->status = KVS_STATUS_OK;
|
||||
rsp_out->data = result;
|
||||
rsp_out->dlen = (uint32_t)value_len;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_HDEL:
|
||||
ret = kvs_hash_del_bin(&global_hash, key, key_len);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_HMOD:
|
||||
ret = kvs_hash_mod_bin(&global_hash, key, key_len, val, value_len);
|
||||
if (ret < 0) rsp_out->status = KVS_STATUS_ERROR;
|
||||
else if (ret == 0) rsp_out->status = KVS_STATUS_OK;
|
||||
else rsp_out->status = KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
|
||||
case KVS_CMD_HEXIST:
|
||||
ret = kvs_hash_exist_bin(&global_hash, key, key_len);
|
||||
rsp_out->status = (ret == 0) ? KVS_STATUS_EXIST : KVS_STATUS_NO_EXIST;
|
||||
return 0;
|
||||
#endif
|
||||
default:
|
||||
rsp_out->status = KVS_STATUS_BADREQ;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int kvs_build_one_rsp(const kvs_rsp_t *results, uint8_t *response, size_t response_cap){
|
||||
if (!results || !response) return -1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user