Files
ldb/kvstore.h
2026-03-05 08:45:23 +00:00

305 lines
8.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __KV_STORE_H__
#define __KV_STORE_H__
#include "diskuring/diskuring.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include "server.h"
#define NETWORK_REACTOR 0
#define NETWORK_PROACTOR 1
#define NETWORK_NTYCO 2
#define NETWORK_SELECT NETWORK_REACTOR
#define KVS_MAX_TOKENS 128
#define ENABLE_ARRAY 1
#define ENABLE_RBTREE 1
#define ENABLE_HASH 1
#define NEW_KVSTORE 1
#define BIN_SAFE 1
// #define KVS_CMD_LOG_FILE "kvs_wal.db"
// #define KVS_ARRAY_FILE "kvs_array.db"
// #define KVS_RBTREE_FILE "kvs_rbtree.db"
// #define KVS_HASH_FILE "kvs_hash.db"
// typedef int (*msg_handler)(char *msg, int length, char *response);
// typedef int (*msg_handler)(char *request, int request_length, char *response, int *response_length);
typedef int (*msg_handler)(struct conn* conn);
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);
#if ENABLE_ARRAY
#if BIN_SAFE
#define KVS_ARRAY_SIZE 1024
typedef struct kvs_array_item_s {
uint8_t *key;
uint32_t key_len;
uint8_t *value;
uint32_t value_len;
} kvs_array_item_t;
typedef struct kvs_array_s {
kvs_array_item_t *table;
int total; // 元素上界
} kvs_array_t;
int kvs_array_create(kvs_array_t *inst);
void kvs_array_destroy(kvs_array_t *inst);
int kvs_array_set_bin(kvs_array_t *inst,
const void *key, uint32_t key_len,
const void *value, uint32_t value_len);
void *kvs_array_get_bin(kvs_array_t *inst,
const void *key, uint32_t key_len,
uint32_t *out_value_len);
int kvs_array_del_bin(kvs_array_t *inst, const void *key, uint32_t key_len);
int kvs_array_mod_bin(kvs_array_t *inst,
const void *key, uint32_t key_len,
const void *value, uint32_t value_len);
int kvs_array_exist_bin(kvs_array_t *inst, const void *key, uint32_t key_len);
int kvs_array_save(iouring_ctx_t *uring, kvs_array_t *inst, const char* filename);
int kvs_array_load(kvs_array_t *inst, const char* filename);
#else
typedef struct kvs_array_item_s {
char *key;
char *value;
} kvs_array_item_t;
#define KVS_ARRAY_SIZE 1024
typedef struct kvs_array_s {
kvs_array_item_t *table;
int idx;
int total;
} kvs_array_t;
int kvs_array_create(kvs_array_t *inst);
void kvs_array_destroy(kvs_array_t *inst);
int kvs_array_set(kvs_array_t *inst, char *key, char *value);
char* kvs_array_get(kvs_array_t *inst, char *key);
int kvs_array_del(kvs_array_t *inst, char *key);
int kvs_array_mod(kvs_array_t *inst, char *key, char *value);
int kvs_array_exist(kvs_array_t *inst, char *key);
#endif
#endif
#if ENABLE_RBTREE
#define RED 1
#define BLACK 2
#if BIN_SAFE
typedef uint8_t KEY_TYPE; // key
// 固定部分结构
typedef struct {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
uint32_t key_len;
uint32_t value_len;
} rbtree_node_fixed;
// 完整节点结构(用于类型定义,实际内存大小由分配时确定)
typedef struct _rbtree_node {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
uint32_t key_len;
uint32_t value_len;
// 动态数据key[key_len] + value[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(iouring_ctx_t *uring, 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
typedef char* KEY_TYPE;
#else
typedef int KEY_TYPE; // key
#endif
typedef struct _rbtree_node {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
KEY_TYPE key;
void *value;
} 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, char *key, char *value);
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
#if ENABLE_HASH
#if BIN_SAFE
typedef struct hashnode_s {
uint32_t key_len; // key 长度
uint32_t value_len; // value 长度
struct hashnode_s *next; // 链表指针
// 动态数据key[key_len] + value[value_len]
// 不存储为结构体成员,通过指针运算访问
} hashnode_t;
typedef struct hashbucket_s {
hashnode_t *head; // 桶内链表
uint32_t local_depth; // 桶的局部深度
uint32_t item_count; // 桶内元素数量
struct hashbucket_s *next_all; // 用于统一释放/遍历所有桶
} hashbucket_t;
typedef struct hashtable_s {
hashbucket_t **directory; // 目录,指向桶
uint32_t dir_size; // 目录大小2^global_depth
uint32_t global_depth; // 全局深度
int count; // 当前元素总数
hashbucket_t *bucket_list;// 所有唯一桶链表
} hashtable_t;
typedef struct hashtable_s kvs_hash_t;
int kvs_hash_create(kvs_hash_t *hash);
void kvs_hash_destroy(kvs_hash_t *hash);
int kvs_hash_set_bin(kvs_hash_t *h, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
void *kvs_hash_get_bin(kvs_hash_t *h, const void *key, uint32_t key_len, uint32_t *out_value_len);
int kvs_hash_get_copy_bin(kvs_hash_t *h, const void *key, uint32_t key_len, void **out_buf, uint32_t *out_len);
int kvs_hash_mod_bin(kvs_hash_t *h, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
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 kvs_hash_save(iouring_ctx_t *uring, 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
typedef struct hashnode_s {
#if ENABLE_KEY_POINTER
char *key;
char *value;
#else
char key[MAX_KEY_LEN];
char value[MAX_VALUE_LEN];
#endif
struct hashnode_s *next;
} hashnode_t;
typedef struct hashtable_s {
hashnode_t **nodes; //* change **,
int max_slots;
int count;
} hashtable_t;
typedef struct hashtable_s kvs_hash_t;
int kvs_hash_create(kvs_hash_t *hash);
void kvs_hash_destroy(kvs_hash_t *hash);
int kvs_hash_set(hashtable_t *hash, char *key, char *value);
char * kvs_hash_get(kvs_hash_t *hash, char *key);
int kvs_hash_mod(kvs_hash_t *hash, char *key, char *value);
int kvs_hash_del(kvs_hash_t *hash, char *key);
int kvs_hash_exist(kvs_hash_t *hash, char *key);
#endif
#endif
#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
#endif