rbtree和hash的全量持久化操作。rbtree的二进制安全。

粗略测试。
This commit is contained in:
2026-01-08 21:42:20 +08:00
parent de21fe94ec
commit 4b4e06b33d
16 changed files with 1997 additions and 1450 deletions

View File

@@ -31,7 +31,10 @@
#define BIN_SAFE 1
#define KVS_CMD_LOG_FILE "kvs_cmd_log.db"
#define KVS_ARRAY_FILE "kvs_array.db"
#define KVS_ARRAY_FILE "kvs_snap_array.db"
#define KVS_RBTREE_FILE "kvs_snap_rbtree.db"
#define KVS_HASH_FILE "kvs_snap_hash.db"
// typedef int (*msg_handler)(char *msg, int length, char *response);
@@ -41,7 +44,11 @@ extern int reactor_start(unsigned short port, msg_handler handler);
extern int proactor_start(unsigned short port, msg_handler handler);
extern int ntyco_start(unsigned short port, msg_handler handler);
extern int init_cmd_log(const char *file, int *logfd);
extern int destroy_cmd_log(int logfd);
extern int kvs_save_cmd_to_logfile(const uint8_t *cmd, size_t len, int logfd);
extern int kvs_replay_log(const char *logfile, int logfd);
extern int ksv_clear_log(int logfd);
#if ENABLE_ARRAY
@@ -112,6 +119,38 @@ int kvs_array_exist(kvs_array_t *inst, char *key);
#define RED 1
#define BLACK 2
#if BIN_SAFE
typedef uint8_t KEY_TYPE; // key
typedef struct _rbtree_node {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
KEY_TYPE *key;
uint32_t key_len;
KEY_TYPE *value;
uint32_t value_len;
} rbtree_node;
typedef struct _rbtree {
rbtree_node *root;
rbtree_node *nil;
} rbtree;
typedef struct _rbtree kvs_rbtree_t;
int kvs_rbtree_create(kvs_rbtree_t *inst);
void kvs_rbtree_destroy(kvs_rbtree_t *inst);
int kvs_rbtree_set(kvs_rbtree_t *inst, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
void* kvs_rbtree_get(kvs_rbtree_t *inst, const void *key, uint32_t key_len, uint32_t *out_valuelen);
int kvs_rbtree_del(rbtree *inst, const void *key, uint32_t key_len);
int kvs_rbtree_mod(kvs_rbtree_t *inst, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
int kvs_rbtree_exist(kvs_rbtree_t *inst, const void *key, uint32_t key_len);
int kvs_rbtree_save(kvs_rbtree_t *inst, const char* filename);
int kvs_rbtree_load(kvs_rbtree_t *inst, const char* filename);
#else
#define ENABLE_KEY_CHAR 1
#if ENABLE_KEY_CHAR
@@ -144,7 +183,7 @@ char* kvs_rbtree_get(kvs_rbtree_t *inst, char *key);
int kvs_rbtree_del(kvs_rbtree_t *inst, char *key);
int kvs_rbtree_mod(kvs_rbtree_t *inst, char *key, char *value);
int kvs_rbtree_exist(kvs_rbtree_t *inst, char *key);
#endif
#endif
@@ -152,9 +191,6 @@ int kvs_rbtree_exist(kvs_rbtree_t *inst, char *key);
#if ENABLE_HASH
#define MAX_KEY_LEN 128
#define MAX_VALUE_LEN 512
#define MAX_TABLE_SIZE 1024
#if BIN_SAFE
#define MAX_TABLE_SIZE 1024
@@ -186,9 +222,14 @@ int kvs_hash_del_bin(kvs_hash_t *h, const void *key, uint32_t key_len);
int kvs_hash_exist_bin(kvs_hash_t *h, const void *key, uint32_t key_len);
int kvs_hash_count(kvs_hash_t *h);
int save(kvs_hash_t *h, const char* filename);
int kvs_hash_save(kvs_hash_t *inst, const char* filename);
int kvs_hash_load(kvs_hash_t *inst, const char* filename);
#else
#define MAX_KEY_LEN 128
#define MAX_VALUE_LEN 512
#define MAX_TABLE_SIZE 1024
#define ENABLE_KEY_POINTER 1