pikapython/package/flashdb/_flashdb_KVDB.c

278 lines
7.8 KiB
C
Raw Normal View History

2023-12-07 22:22:42 +08:00
#include "_flashdb_KVDB.h"
#include "_flashdb_KVDB_CTRL.h"
2024-07-01 22:43:27 +08:00
#include <stdio.h>
2023-10-09 09:43:50 +08:00
#include "flashdb.h"
// #include "fdb_def.h"
2023-10-09 09:43:50 +08:00
#define PIKA_USING_FLASHDB1 1
#if PIKA_USING_FLASHDB1
// #include <pthread.h>
2023-10-09 09:43:50 +08:00
#include "flashdb.h"
#define FDB_LOG_TAG "[main]"
2023-10-09 13:56:14 +08:00
#define _FDBBUFFS (Args*)obj_getPtr(self, "FDBBUFFS")
#define strdup(x) strsCopy(_FDBBUFFS, x)
2023-10-09 09:43:50 +08:00
/* TSDB object */
2023-10-09 21:25:20 +08:00
// struct fdb_tsdb tsdb = { 0 };
2023-10-09 09:43:50 +08:00
/* counts for simulated timestamp */
2023-10-09 21:25:20 +08:00
// static int counts = 0;
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
// extern void kvdb_basic_sample(fdb_kvdb_t kvdb);
// extern void kvdb_type_string_sample(fdb_kvdb_t kvdb);
// extern void kvdb_type_blob_sample(fdb_kvdb_t kvdb);
// extern void tsdb_sample(fdb_tsdb_t tsdb);
2023-10-09 09:43:50 +08:00
/*
static void lock(fdb_db_t db)
{
pthread_mutex_lock((pthread_mutex_t *)db->user_data);
}
static void unlock(fdb_db_t db)
{
pthread_mutex_unlock((pthread_mutex_t *)db->user_data);
}
*/
2023-10-09 21:25:20 +08:00
static fdb_time_t get_time(void) {
2023-12-06 23:16:31 +08:00
// ms to s
return pika_platform_get_tick() / 1000;
2023-10-09 09:43:50 +08:00
}
#endif
/* KVDB object */
2023-12-07 22:22:42 +08:00
typedef struct _fdb_kvdb_context {
struct fdb_kvdb kvdb;
pika_bool path_inited;
} fdb_kvdb_context;
#define _OBJ2KVDB_CONTEXT(x) ((fdb_kvdb_context*)obj_getStruct(x, "kvdbctx"))
#define _OBJ2KVDB(x) (&_OBJ2KVDB_CONTEXT(x)->kvdb)
2023-10-09 09:43:50 +08:00
typedef struct fdb_kvdb FDB_KVDB;
typedef struct fdb_default_kv_node FDB_DEFAULT_KV_NODE;
2023-10-09 13:56:14 +08:00
int g_def_kv_table_idx;
2023-10-09 09:43:50 +08:00
/*
2023-12-07 22:22:42 +08:00
Arg* _flashdb_KVDB_blob_make(PikaObj *self, Arg* blob, Arg* value_buf, int
2023-10-09 21:25:20 +08:00
buf_len){ return NULL;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
Arg* _flashdb_KVDB_blob_read(PikaObj *self, Arg* db, Arg* blob){
2023-10-09 09:43:50 +08:00
return NULL;
}
2023-12-07 22:22:42 +08:00
int _flashdb_KVDB_kv_del(PikaObj *self, Arg* kvdb, char* key){
2023-10-09 09:43:50 +08:00
return 0;
}
2023-12-07 22:22:42 +08:00
Arg* _flashdb_KVDB_kv_get(PikaObj *self, Arg* kvdb, char* key){
2023-10-09 09:43:50 +08:00
return NULL;
}
*/
2023-12-07 22:22:42 +08:00
PikaObj* _flashdb_KVDB_get_blob(PikaObj* self, char* key, int size) {
2023-10-09 21:25:20 +08:00
struct fdb_blob blob;
2023-12-07 22:22:42 +08:00
FDB_KVDB* kvdb = _OBJ2KVDB(self);
2023-10-09 21:25:20 +08:00
blob.size = size;
uint8_t* buf = (uint8_t*)pikaMalloc(size + 1);
if (!buf) {
2023-12-06 23:16:31 +08:00
pika_platform_printf("alloc fail\n");
2023-10-09 21:25:20 +08:00
return NULL;
}
blob.buf = buf;
size_t len = fdb_kv_get_blob(kvdb, key, &blob);
if (len != size) {
2023-12-06 23:16:31 +08:00
pika_platform_printf("size error\n");
2023-10-09 21:25:20 +08:00
pikaFree(buf, size + 1);
return NULL;
}
PikaList* list = New_pikaList();
for (int i = 0; i < len; i++) {
pikaList_append(list, arg_newInt(buf[i]));
}
pikaFree(buf, size + 1);
return list;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
Arg* _flashdb_KVDB_get_obj(PikaObj* self, Arg* kvdb, char* key, Arg* kv) {
2023-10-09 21:25:20 +08:00
return NULL;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
Arg* _flashdb_KVDB_iterate(PikaObj* self, Arg* kvdb, Arg* itr) {
2023-10-09 21:25:20 +08:00
return NULL;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
Arg* _flashdb_KVDB_iterator_init(PikaObj* self, Arg* kvdb, Arg* itr) {
2023-10-09 21:25:20 +08:00
return NULL;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
void _flashdb_KVDB_print(PikaObj* self) {
FDB_KVDB* kvdb = _OBJ2KVDB(self);
2023-10-09 21:25:20 +08:00
fdb_kv_print(kvdb);
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
int _flashdb_KVDB_set(PikaObj* self, Arg* kvdb, char* key, char* value) {
2023-10-09 21:25:20 +08:00
return 0;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
int _flashdb_KVDB_set_blob(PikaObj* self, char* key, Arg* blob_in) {
2023-10-09 21:25:20 +08:00
fdb_err_t res = FDB_NO_ERR;
2023-12-07 22:22:42 +08:00
FDB_KVDB* kvdb = _OBJ2KVDB(self);
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
ArgType argt_blob_in = arg_getType(blob_in);
if (argt_blob_in != ARG_TYPE_BYTES) {
2023-12-06 23:16:31 +08:00
pika_platform_printf("blob must be bytes but got:%d", argt_blob_in);
2023-10-09 21:25:20 +08:00
}
size_t len = arg_getBytesSize(blob_in);
uint8_t* bytes = (uint8_t*)arg_getBytes(blob_in);
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
struct fdb_blob blob;
blob.size = len;
blob.buf = bytes;
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
res = fdb_kv_set_blob(kvdb, key, &blob);
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
return res;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
int _flashdb_KVDB_set_default(PikaObj* self, Arg* kvdb) {
2023-10-09 21:25:20 +08:00
return 0;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
Arg* _flashdb_KVDB_to_blob(PikaObj* self, Arg* kv, Arg* blob) {
2023-10-09 21:25:20 +08:00
return NULL;
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
int _flashdb_KVDB_control(PikaObj* self, int cmd, Arg* arg) {
return -1;
2023-10-09 21:25:20 +08:00
}
2023-12-07 22:22:42 +08:00
void _flashdb_KVDB_deinit(PikaObj* self) {
fdb_kvdb_deinit(_OBJ2KVDB(self));
2023-12-07 18:53:30 +08:00
}
2024-07-02 11:30:59 +08:00
struct _kvdb_foreach_context {
struct fdb_default_kv_node* def_kv_table;
PikaObj* self;
};
2024-07-01 22:43:27 +08:00
int32_t _flashdb_foreach(PikaObj* self_dict,
2023-10-09 21:25:20 +08:00
Arg* keyEach,
Arg* valEach,
void* context) {
char* key = arg_getStr(keyEach);
ArgType argt_val = arg_getType(valEach);
2024-07-02 11:30:59 +08:00
struct _kvdb_foreach_context* foreach_context =
(struct _kvdb_foreach_context*)context;
struct fdb_default_kv_node* def_kv_table = foreach_context->def_kv_table;
PikaObj* self = foreach_context->self;
2023-10-09 21:25:20 +08:00
if (argt_val == ARG_TYPE_STRING) {
char* val = arg_getStr(valEach);
def_kv_table[g_def_kv_table_idx].key = strdup(key);
def_kv_table[g_def_kv_table_idx].value = strdup(val);
def_kv_table[g_def_kv_table_idx].value_len = 0;
g_def_kv_table_idx++;
} else if (argt_val == ARG_TYPE_BYTES) {
size_t bytes_size = arg_getBytesSize(valEach);
uint8_t* bytes = arg_getBytes(valEach);
uint8_t* pbytes =
(uint8_t*)args_getBuff(_FDBBUFFS, bytes_size * sizeof(uint8_t));
2023-10-09 21:25:20 +08:00
memcpy(pbytes, bytes, bytes_size);
/*
for (size_t i=0; i < bytes_size; i++) {
2023-12-06 23:16:31 +08:00
pika_platform_printf("%02x", bytes[i]);
2023-10-09 21:25:20 +08:00
}
2023-12-06 23:16:31 +08:00
pika_platform_printf("\n");
2023-10-09 21:25:20 +08:00
*/
def_kv_table[g_def_kv_table_idx].key = strdup(key);
def_kv_table[g_def_kv_table_idx].value = pbytes;
def_kv_table[g_def_kv_table_idx].value_len = bytes_size;
g_def_kv_table_idx++;
2023-10-09 09:43:50 +08:00
}
2023-10-09 21:25:20 +08:00
return 0;
}
2023-12-07 22:22:42 +08:00
void _flashdb_KVDB___init__(PikaObj* self,
char* name,
char* path,
PikaObj* default_kv_in,
Arg* user_data) {
2023-12-06 23:16:31 +08:00
pika_platform_printf("kvdb_init \n");
2023-12-07 22:22:42 +08:00
if (NULL == _OBJ2KVDB_CONTEXT(self)) {
Args* buffs = New_strBuff();
obj_setPtr(self, "FDBBUFFS", buffs);
// create kvdb context if not exist
fdb_kvdb_context kvdb_initial = {
.kvdb = {0},
.path_inited = pika_false,
};
obj_setStruct(self, "kvdbctx", kvdb_initial);
}
fdb_kvdb_context* kvdb_context = _OBJ2KVDB_CONTEXT(self);
fdb_kvdb_t kvdb_this = &kvdb_context->kvdb;
2023-10-09 21:25:20 +08:00
fdb_err_t result;
2023-12-07 22:22:42 +08:00
if (!kvdb_context->path_inited) {
2023-12-07 01:45:29 +08:00
pika_bool file_mode = pika_true;
2023-10-09 21:25:20 +08:00
uint32_t sec_size = 4096, db_size = sec_size * 4;
2023-12-07 22:22:42 +08:00
fdb_kvdb_control(kvdb_this, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);
fdb_kvdb_control(kvdb_this, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
2023-10-09 21:25:20 +08:00
/* enable file mode */
2023-12-07 22:22:42 +08:00
fdb_kvdb_control(kvdb_this, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
2023-10-09 21:25:20 +08:00
/* create database directory */
2023-12-06 23:16:31 +08:00
pika_platform_mkdir(path, 0777);
2023-12-07 22:22:42 +08:00
kvdb_context->path_inited = pika_true;
2023-10-09 21:25:20 +08:00
}
// int len =pikaDict_getSize(default_kv_in);
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
struct fdb_default_kv_node* def_kv_table =
(struct fdb_default_kv_node*)args_getBuff(
_FDBBUFFS, (4 * sizeof(struct fdb_default_kv_node)));
2023-10-09 21:25:20 +08:00
g_def_kv_table_idx = 0;
2024-07-02 11:30:59 +08:00
struct _kvdb_foreach_context context = {
.def_kv_table = def_kv_table,
.self = self,
};
pikaDict_forEach(default_kv_in, _flashdb_foreach, &context);
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
struct fdb_default_kv default_kv;
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
default_kv.kvs = def_kv_table;
default_kv.num = 4;
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
result =
2023-12-07 22:22:42 +08:00
fdb_kvdb_init(kvdb_this, strdup(name), strdup(path), &default_kv, NULL);
2023-10-09 09:43:50 +08:00
2023-10-09 21:25:20 +08:00
if (result != FDB_NO_ERR) {
2023-12-07 22:22:42 +08:00
obj_setSysOut(self, "kvdb_init fail");
obj_setErrorCode(self, result);
2023-10-09 21:25:20 +08:00
}
2023-10-09 09:43:50 +08:00
}
2023-12-07 22:22:42 +08:00
void _flashdb_KVDB___del__(PikaObj* self) {
Args* buffs = _FDBBUFFS;
if (NULL != buffs) {
args_deinit(_FDBBUFFS);
}
2023-12-07 22:22:42 +08:00
if (NULL != _OBJ2KVDB_CONTEXT(self)) {
fdb_kvdb_deinit(_OBJ2KVDB(self));
}
}
void _flashdb_KVDB_CTRL___init__(PikaObj* self) {
obj_setInt(self, "SET_SEC_SIZE", FDB_KVDB_CTRL_SET_SEC_SIZE);
obj_setInt(self, "GET_SEC_SIZE", FDB_KVDB_CTRL_GET_SEC_SIZE);
obj_setInt(self, "SET_LOCK", FDB_KVDB_CTRL_SET_LOCK);
obj_setInt(self, "SET_UNLOCK", FDB_KVDB_CTRL_SET_UNLOCK);
obj_setInt(self, "SET_FILE_MODE", FDB_KVDB_CTRL_SET_FILE_MODE);
obj_setInt(self, "SET_MAX_SIZE", FDB_KVDB_CTRL_SET_MAX_SIZE);
obj_setInt(self, "SET_NOT_FORMAT", FDB_KVDB_CTRL_SET_NOT_FORMAT);
}
#undef strudp