_flashdb_FlashDB.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include "_flashdb_FlashDB.h"
  2. #include <stdio.h>
  3. #include "flashdb.h"
  4. #include "pikaScript.h"
  5. #include "_flashdb_kvdb_t.h"
  6. //#include "fdb_def.h"
  7. #define PIKA_USING_FLASHDB1 1
  8. #if PIKA_USING_FLASHDB1
  9. //#include <pthread.h>
  10. #include <sys/stat.h>
  11. #include <sys/types.h>
  12. #include "flashdb.h"
  13. #define FDB_LOG_TAG "[main]"
  14. #define _FDBBUFFS (Args*)obj_getPtr(self, "FDBBUFFS")
  15. #define strdup(x) strsCopy(_FDBBUFFS, x)
  16. bool g_kvdb_path_inited = false;
  17. /* TSDB object */
  18. // struct fdb_tsdb tsdb = { 0 };
  19. /* counts for simulated timestamp */
  20. // static int counts = 0;
  21. // extern void kvdb_basic_sample(fdb_kvdb_t kvdb);
  22. // extern void kvdb_type_string_sample(fdb_kvdb_t kvdb);
  23. // extern void kvdb_type_blob_sample(fdb_kvdb_t kvdb);
  24. // extern void tsdb_sample(fdb_tsdb_t tsdb);
  25. /*
  26. static void lock(fdb_db_t db)
  27. {
  28. pthread_mutex_lock((pthread_mutex_t *)db->user_data);
  29. }
  30. static void unlock(fdb_db_t db)
  31. {
  32. pthread_mutex_unlock((pthread_mutex_t *)db->user_data);
  33. }
  34. */
  35. static fdb_time_t get_time(void) {
  36. return time(NULL);
  37. }
  38. #endif
  39. /* KVDB object */
  40. static struct fdb_kvdb g_kvdb = {0};
  41. typedef struct fdb_kvdb FDB_KVDB;
  42. typedef struct fdb_default_kv_node FDB_DEFAULT_KV_NODE;
  43. int g_def_kv_table_idx;
  44. void _flashdb_FlashDB___init__(PikaObj* self) {
  45. Args* buffs = New_strBuff();
  46. obj_setPtr(self, "FDBBUFFS", buffs);
  47. }
  48. /*
  49. Arg* _flashdb_FlashDB_blob_make(PikaObj *self, Arg* blob, Arg* value_buf, int
  50. buf_len){ return NULL;
  51. }
  52. Arg* _flashdb_FlashDB_blob_read(PikaObj *self, Arg* db, Arg* blob){
  53. return NULL;
  54. }
  55. int _flashdb_FlashDB_kv_del(PikaObj *self, Arg* kvdb, char* key){
  56. return 0;
  57. }
  58. Arg* _flashdb_FlashDB_kv_get(PikaObj *self, Arg* kvdb, char* key){
  59. return NULL;
  60. }
  61. */
  62. PikaObj* _flashdb_FlashDB_kv_get_blob(PikaObj* self,
  63. PikaObj* kvdb_in,
  64. char* key,
  65. int size) {
  66. struct fdb_blob blob;
  67. FDB_KVDB* kvdb = (FDB_KVDB*)obj_getPtr(kvdb_in, "kvdb");
  68. blob.size = size;
  69. uint8_t* buf = (uint8_t*)pikaMalloc(size + 1);
  70. if (!buf) {
  71. printf("alloc fail\n");
  72. return NULL;
  73. }
  74. blob.buf = buf;
  75. size_t len = fdb_kv_get_blob(kvdb, key, &blob);
  76. if (len != size) {
  77. printf("size error\n");
  78. pikaFree(buf, size + 1);
  79. return NULL;
  80. }
  81. PikaList* list = New_pikaList();
  82. for (int i = 0; i < len; i++) {
  83. pikaList_append(list, arg_newInt(buf[i]));
  84. }
  85. pikaFree(buf, size + 1);
  86. return list;
  87. }
  88. Arg* _flashdb_FlashDB_kv_get_obj(PikaObj* self, Arg* kvdb, char* key, Arg* kv) {
  89. return NULL;
  90. }
  91. Arg* _flashdb_FlashDB_kv_iterate(PikaObj* self, Arg* kvdb, Arg* itr) {
  92. return NULL;
  93. }
  94. Arg* _flashdb_FlashDB_kv_iterator_init(PikaObj* self, Arg* kvdb, Arg* itr) {
  95. return NULL;
  96. }
  97. void _flashdb_FlashDB_kv_print(PikaObj* self, PikaObj* kvdb_in) {
  98. FDB_KVDB* kvdb = (FDB_KVDB*)obj_getPtr(kvdb_in, "kvdb");
  99. fdb_kv_print(kvdb);
  100. }
  101. int _flashdb_FlashDB_kv_set(PikaObj* self, Arg* kvdb, char* key, char* value) {
  102. return 0;
  103. }
  104. int _flashdb_FlashDB_kv_set_blob(PikaObj* self,
  105. PikaObj* kvdb_in,
  106. char* key,
  107. Arg* blob_in) {
  108. fdb_err_t res = FDB_NO_ERR;
  109. FDB_KVDB* kvdb = (FDB_KVDB*)obj_getPtr(kvdb_in, "kvdb");
  110. ArgType argt_blob_in = arg_getType(blob_in);
  111. if (argt_blob_in != ARG_TYPE_BYTES) {
  112. printf("blob must be bytes but got:%d", argt_blob_in);
  113. }
  114. size_t len = arg_getBytesSize(blob_in);
  115. uint8_t* bytes = (uint8_t*)arg_getBytes(blob_in);
  116. struct fdb_blob blob;
  117. blob.size = len;
  118. blob.buf = bytes;
  119. res = fdb_kv_set_blob(kvdb, key, &blob);
  120. return res;
  121. }
  122. int _flashdb_FlashDB_kv_set_default(PikaObj* self, Arg* kvdb) {
  123. return 0;
  124. }
  125. Arg* _flashdb_FlashDB_kv_to_blob(PikaObj* self, Arg* kv, Arg* blob) {
  126. return NULL;
  127. }
  128. int _flashdb_FlashDB_kvdb_control(PikaObj* self, Arg* kvdb, int cmd, Arg* arg) {
  129. return 0;
  130. }
  131. void _flashdb_FlashDB_kvdb_deinit(PikaObj* self, Arg* kvdb) {}
  132. struct _flashdb_foreach_context {
  133. struct fdb_default_kv_node* def_kv_table;
  134. PikaObj* self;
  135. };
  136. int32_t _flashdb_foreach(PikaObj* self_dict,
  137. Arg* keyEach,
  138. Arg* valEach,
  139. void* context) {
  140. char* key = arg_getStr(keyEach);
  141. ArgType argt_val = arg_getType(valEach);
  142. struct _flashdb_foreach_context* foreach_context =
  143. (struct _flashdb_foreach_context*)context;
  144. struct fdb_default_kv_node* def_kv_table = foreach_context->def_kv_table;
  145. PikaObj* self = foreach_context->self;
  146. if (argt_val == ARG_TYPE_STRING) {
  147. char* val = arg_getStr(valEach);
  148. def_kv_table[g_def_kv_table_idx].key = strdup(key);
  149. def_kv_table[g_def_kv_table_idx].value = strdup(val);
  150. def_kv_table[g_def_kv_table_idx].value_len = 0;
  151. g_def_kv_table_idx++;
  152. } else if (argt_val == ARG_TYPE_BYTES) {
  153. size_t bytes_size = arg_getBytesSize(valEach);
  154. uint8_t* bytes = arg_getBytes(valEach);
  155. uint8_t* pbytes =
  156. (uint8_t*)args_getBuff(_FDBBUFFS, bytes_size * sizeof(uint8_t));
  157. memcpy(pbytes, bytes, bytes_size);
  158. /*
  159. for (size_t i=0; i < bytes_size; i++) {
  160. printf("%02x", bytes[i]);
  161. }
  162. printf("\n");
  163. */
  164. def_kv_table[g_def_kv_table_idx].key = strdup(key);
  165. def_kv_table[g_def_kv_table_idx].value = pbytes;
  166. def_kv_table[g_def_kv_table_idx].value_len = bytes_size;
  167. g_def_kv_table_idx++;
  168. }
  169. return 0;
  170. }
  171. PikaObj* _flashdb_FlashDB_kvdb_init(PikaObj* self,
  172. char* name,
  173. char* path,
  174. PikaObj* default_kv_in,
  175. Arg* user_data) {
  176. printf("kvdb_init \n");
  177. fdb_err_t result;
  178. if (!g_kvdb_path_inited) {
  179. bool file_mode = true;
  180. uint32_t sec_size = 4096, db_size = sec_size * 4;
  181. fdb_kvdb_control(&g_kvdb, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);
  182. fdb_kvdb_control(&g_kvdb, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
  183. /* enable file mode */
  184. fdb_kvdb_control(&g_kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
  185. /* create database directory */
  186. mkdir(path, 0777);
  187. g_kvdb_path_inited = true;
  188. }
  189. // int len =pikaDict_getSize(default_kv_in);
  190. struct fdb_default_kv_node* def_kv_table =
  191. (struct fdb_default_kv_node*)args_getBuff(
  192. _FDBBUFFS, (4 * sizeof(struct fdb_default_kv_node)));
  193. g_def_kv_table_idx = 0;
  194. struct _flashdb_foreach_context context = {
  195. .def_kv_table = def_kv_table,
  196. .self = self,
  197. };
  198. pikaDict_forEach(default_kv_in, _flashdb_foreach, &context);
  199. struct fdb_default_kv default_kv;
  200. default_kv.kvs = def_kv_table;
  201. default_kv.num = 4;
  202. result =
  203. fdb_kvdb_init(&g_kvdb, strdup(name), strdup(path), &default_kv, NULL);
  204. if (result != FDB_NO_ERR) {
  205. return NULL;
  206. }
  207. PikaObj* kvdb_obj = newNormalObj(New__flashdb_kvdb_t);
  208. args_setStruct(kvdb_obj->list, "kvdb_struct", g_kvdb);
  209. FDB_KVDB* pkvdb = args_getStruct(kvdb_obj->list, "kvdb_struct");
  210. obj_setPtr(kvdb_obj, "kvdb", pkvdb);
  211. return kvdb_obj;
  212. }
  213. void _flashdb_FlashDB___del__(PikaObj* self) {
  214. args_deinit(_FDBBUFFS);
  215. }
  216. #undef strudp