_flashdb_KVDB.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #include "_flashdb_KVDB.h"
  2. #include "_flashdb_KVDB_CTRL.h"
  3. #include <stdio.h>
  4. #include "flashdb.h"
  5. // #include "fdb_def.h"
  6. #define PIKA_USING_FLASHDB1 1
  7. #if PIKA_USING_FLASHDB1
  8. // #include <pthread.h>
  9. #include "flashdb.h"
  10. #define FDB_LOG_TAG "[main]"
  11. #define _FDBBUFFS (Args*)obj_getPtr(self, "FDBBUFFS")
  12. #define strdup(x) strsCopy(_FDBBUFFS, x)
  13. /* TSDB object */
  14. // struct fdb_tsdb tsdb = { 0 };
  15. /* counts for simulated timestamp */
  16. // static int counts = 0;
  17. // extern void kvdb_basic_sample(fdb_kvdb_t kvdb);
  18. // extern void kvdb_type_string_sample(fdb_kvdb_t kvdb);
  19. // extern void kvdb_type_blob_sample(fdb_kvdb_t kvdb);
  20. // extern void tsdb_sample(fdb_tsdb_t tsdb);
  21. /*
  22. static void lock(fdb_db_t db)
  23. {
  24. pthread_mutex_lock((pthread_mutex_t *)db->user_data);
  25. }
  26. static void unlock(fdb_db_t db)
  27. {
  28. pthread_mutex_unlock((pthread_mutex_t *)db->user_data);
  29. }
  30. */
  31. static fdb_time_t get_time(void) {
  32. // ms to s
  33. return pika_platform_get_tick() / 1000;
  34. }
  35. #endif
  36. /* KVDB object */
  37. typedef struct _fdb_kvdb_context {
  38. struct fdb_kvdb kvdb;
  39. pika_bool path_inited;
  40. } fdb_kvdb_context;
  41. #define _OBJ2KVDB_CONTEXT(x) ((fdb_kvdb_context*)obj_getStruct(x, "kvdbctx"))
  42. #define _OBJ2KVDB(x) (&_OBJ2KVDB_CONTEXT(x)->kvdb)
  43. typedef struct fdb_kvdb FDB_KVDB;
  44. typedef struct fdb_default_kv_node FDB_DEFAULT_KV_NODE;
  45. int g_def_kv_table_idx;
  46. /*
  47. Arg* _flashdb_KVDB_blob_make(PikaObj *self, Arg* blob, Arg* value_buf, int
  48. buf_len){ return NULL;
  49. }
  50. Arg* _flashdb_KVDB_blob_read(PikaObj *self, Arg* db, Arg* blob){
  51. return NULL;
  52. }
  53. int _flashdb_KVDB_kv_del(PikaObj *self, Arg* kvdb, char* key){
  54. return 0;
  55. }
  56. Arg* _flashdb_KVDB_kv_get(PikaObj *self, Arg* kvdb, char* key){
  57. return NULL;
  58. }
  59. */
  60. PikaObj* _flashdb_KVDB_get_blob(PikaObj* self, char* key, int size) {
  61. struct fdb_blob blob;
  62. FDB_KVDB* kvdb = _OBJ2KVDB(self);
  63. blob.size = size;
  64. uint8_t* buf = (uint8_t*)pikaMalloc(size + 1);
  65. if (!buf) {
  66. pika_platform_printf("alloc fail\n");
  67. return NULL;
  68. }
  69. blob.buf = buf;
  70. size_t len = fdb_kv_get_blob(kvdb, key, &blob);
  71. if (len != size) {
  72. pika_platform_printf("size error\n");
  73. pikaFree(buf, size + 1);
  74. return NULL;
  75. }
  76. PikaList* list = New_pikaList();
  77. for (int i = 0; i < len; i++) {
  78. pikaList_append(list, arg_newInt(buf[i]));
  79. }
  80. pikaFree(buf, size + 1);
  81. return list;
  82. }
  83. Arg* _flashdb_KVDB_get_obj(PikaObj* self, Arg* kvdb, char* key, Arg* kv) {
  84. return NULL;
  85. }
  86. Arg* _flashdb_KVDB_iterate(PikaObj* self, Arg* kvdb, Arg* itr) {
  87. return NULL;
  88. }
  89. Arg* _flashdb_KVDB_iterator_init(PikaObj* self, Arg* kvdb, Arg* itr) {
  90. return NULL;
  91. }
  92. void _flashdb_KVDB_print(PikaObj* self) {
  93. FDB_KVDB* kvdb = _OBJ2KVDB(self);
  94. fdb_kv_print(kvdb);
  95. }
  96. int _flashdb_KVDB_set(PikaObj* self, Arg* kvdb, char* key, char* value) {
  97. return 0;
  98. }
  99. int _flashdb_KVDB_set_blob(PikaObj* self, char* key, Arg* blob_in) {
  100. fdb_err_t res = FDB_NO_ERR;
  101. FDB_KVDB* kvdb = _OBJ2KVDB(self);
  102. ArgType argt_blob_in = arg_getType(blob_in);
  103. if (argt_blob_in != ARG_TYPE_BYTES) {
  104. pika_platform_printf("blob must be bytes but got:%d", argt_blob_in);
  105. }
  106. size_t len = arg_getBytesSize(blob_in);
  107. uint8_t* bytes = (uint8_t*)arg_getBytes(blob_in);
  108. struct fdb_blob blob;
  109. blob.size = len;
  110. blob.buf = bytes;
  111. res = fdb_kv_set_blob(kvdb, key, &blob);
  112. return res;
  113. }
  114. int _flashdb_KVDB_set_default(PikaObj* self, Arg* kvdb) {
  115. return 0;
  116. }
  117. Arg* _flashdb_KVDB_to_blob(PikaObj* self, Arg* kv, Arg* blob) {
  118. return NULL;
  119. }
  120. int _flashdb_KVDB_control(PikaObj* self, int cmd, Arg* arg) {
  121. return -1;
  122. }
  123. void _flashdb_KVDB_deinit(PikaObj* self) {
  124. fdb_kvdb_deinit(_OBJ2KVDB(self));
  125. }
  126. struct _kvdb_foreach_context {
  127. struct fdb_default_kv_node* def_kv_table;
  128. PikaObj* self;
  129. };
  130. int32_t _flashdb_foreach(PikaObj* self_dict,
  131. Arg* keyEach,
  132. Arg* valEach,
  133. void* context) {
  134. char* key = arg_getStr(keyEach);
  135. ArgType argt_val = arg_getType(valEach);
  136. struct _kvdb_foreach_context* foreach_context =
  137. (struct _kvdb_foreach_context*)context;
  138. struct fdb_default_kv_node* def_kv_table = foreach_context->def_kv_table;
  139. PikaObj* self = foreach_context->self;
  140. if (argt_val == ARG_TYPE_STRING) {
  141. char* val = arg_getStr(valEach);
  142. def_kv_table[g_def_kv_table_idx].key = strdup(key);
  143. def_kv_table[g_def_kv_table_idx].value = strdup(val);
  144. def_kv_table[g_def_kv_table_idx].value_len = 0;
  145. g_def_kv_table_idx++;
  146. } else if (argt_val == ARG_TYPE_BYTES) {
  147. size_t bytes_size = arg_getBytesSize(valEach);
  148. uint8_t* bytes = arg_getBytes(valEach);
  149. uint8_t* pbytes =
  150. (uint8_t*)args_getBuff(_FDBBUFFS, bytes_size * sizeof(uint8_t));
  151. memcpy(pbytes, bytes, bytes_size);
  152. /*
  153. for (size_t i=0; i < bytes_size; i++) {
  154. pika_platform_printf("%02x", bytes[i]);
  155. }
  156. pika_platform_printf("\n");
  157. */
  158. def_kv_table[g_def_kv_table_idx].key = strdup(key);
  159. def_kv_table[g_def_kv_table_idx].value = pbytes;
  160. def_kv_table[g_def_kv_table_idx].value_len = bytes_size;
  161. g_def_kv_table_idx++;
  162. }
  163. return 0;
  164. }
  165. void _flashdb_KVDB___init__(PikaObj* self,
  166. char* name,
  167. char* path,
  168. PikaObj* default_kv_in,
  169. Arg* user_data) {
  170. pika_platform_printf("kvdb_init \n");
  171. if (NULL == _OBJ2KVDB_CONTEXT(self)) {
  172. Args* buffs = New_strBuff();
  173. obj_setPtr(self, "FDBBUFFS", buffs);
  174. // create kvdb context if not exist
  175. fdb_kvdb_context kvdb_initial = {
  176. .kvdb = {0},
  177. .path_inited = pika_false,
  178. };
  179. obj_setStruct(self, "kvdbctx", kvdb_initial);
  180. }
  181. fdb_kvdb_context* kvdb_context = _OBJ2KVDB_CONTEXT(self);
  182. fdb_kvdb_t kvdb_this = &kvdb_context->kvdb;
  183. fdb_err_t result;
  184. if (!kvdb_context->path_inited) {
  185. pika_bool file_mode = pika_true;
  186. uint32_t sec_size = 4096, db_size = sec_size * 4;
  187. fdb_kvdb_control(kvdb_this, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);
  188. fdb_kvdb_control(kvdb_this, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
  189. /* enable file mode */
  190. fdb_kvdb_control(kvdb_this, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
  191. /* create database directory */
  192. pika_platform_mkdir(path, 0777);
  193. kvdb_context->path_inited = pika_true;
  194. }
  195. // int len =pikaDict_getSize(default_kv_in);
  196. struct fdb_default_kv_node* def_kv_table =
  197. (struct fdb_default_kv_node*)args_getBuff(
  198. _FDBBUFFS, (4 * sizeof(struct fdb_default_kv_node)));
  199. g_def_kv_table_idx = 0;
  200. struct _kvdb_foreach_context context = {
  201. .def_kv_table = def_kv_table,
  202. .self = self,
  203. };
  204. pikaDict_forEach(default_kv_in, _flashdb_foreach, &context);
  205. struct fdb_default_kv default_kv;
  206. default_kv.kvs = def_kv_table;
  207. default_kv.num = 4;
  208. result =
  209. fdb_kvdb_init(kvdb_this, strdup(name), strdup(path), &default_kv, NULL);
  210. if (result != FDB_NO_ERR) {
  211. obj_setSysOut(self, "kvdb_init fail");
  212. obj_setErrorCode(self, result);
  213. }
  214. }
  215. void _flashdb_KVDB___del__(PikaObj* self) {
  216. Args* buffs = _FDBBUFFS;
  217. if (NULL != buffs) {
  218. args_deinit(_FDBBUFFS);
  219. }
  220. if (NULL != _OBJ2KVDB_CONTEXT(self)) {
  221. fdb_kvdb_deinit(_OBJ2KVDB(self));
  222. }
  223. }
  224. void _flashdb_KVDB_CTRL___init__(PikaObj* self) {
  225. obj_setInt(self, "SET_SEC_SIZE", FDB_KVDB_CTRL_SET_SEC_SIZE);
  226. obj_setInt(self, "GET_SEC_SIZE", FDB_KVDB_CTRL_GET_SEC_SIZE);
  227. obj_setInt(self, "SET_LOCK", FDB_KVDB_CTRL_SET_LOCK);
  228. obj_setInt(self, "SET_UNLOCK", FDB_KVDB_CTRL_SET_UNLOCK);
  229. obj_setInt(self, "SET_FILE_MODE", FDB_KVDB_CTRL_SET_FILE_MODE);
  230. obj_setInt(self, "SET_MAX_SIZE", FDB_KVDB_CTRL_SET_MAX_SIZE);
  231. obj_setInt(self, "SET_NOT_FORMAT", FDB_KVDB_CTRL_SET_NOT_FORMAT);
  232. }
  233. #undef strudp