Jelajahi Sumber

add: 补齐fdb/fskv库的iter和next函数 https://gitee.com/openLuat/LuatOS/issues/I6DX8P

Wendal Chen 3 tahun lalu
induk
melakukan
2e1931f087
3 mengubah file dengan 85 tambahan dan 69 penghapusan
  1. 23 0
      components/fskv/luat_fskv.c
  2. 2 0
      components/fskv/luat_fskv.h
  3. 60 69
      components/fskv/luat_lib_fskv.c

+ 23 - 0
components/fskv/luat_fskv.c

@@ -98,3 +98,26 @@ int luat_fskv_size(const char* key, char buff[4]) {
     lfs_file_close(&sfd_lfs->lfs, &fd);
     return ret;
 }
+
+int luat_fskv_next(char* buff, size_t offset) {
+    lfs_dir_t dir = {0};
+    struct lfs_info info = {0};
+    int ret = lfs_dir_open(&sfd_lfs->lfs, &dir, "");
+    if (ret != LFS_ERR_OK) {
+        LLOGW("lfs_dir_open ret %d", ret);
+        return -1;
+    }
+    ret = lfs_dir_seek(&sfd_lfs->lfs, &dir, offset);
+    if (ret != LFS_ERR_OK) {
+        lfs_dir_close(&sfd_lfs->lfs, &dir);
+        return -2;
+    }
+    ret = lfs_dir_read(&sfd_lfs->lfs, &dir, &info);
+    if (ret != LFS_ERR_OK) {
+        lfs_dir_close(&sfd_lfs->lfs, &dir);
+        return -3;
+    }
+    memcpy(buff, info.name, strlen(info.name) + 1);
+    lfs_dir_close(&sfd_lfs->lfs, &dir);
+    return 0;
+}

+ 2 - 0
components/fskv/luat_fskv.h

@@ -73,6 +73,8 @@ int luat_fskv_clear(void);
 
 int luat_fskv_stat(size_t *using_sz, size_t *max_sz, size_t *kv_count);
 
+int luat_fskv_next(char* buff, size_t offset);
+
 /**
  * @}
  */

+ 60 - 69
components/fskv/luat_lib_fskv.c

@@ -324,72 +324,62 @@ static int l_fskv_clr(lua_State *L) {
 }
 
 
-// /**
-// kv数据库迭代器
-// @api fskv.kv_iter()
-// @return userdata 成功返回迭代器指针,否则返回nil
-// @usage
-// -- 清空
-// local iter = fskv.kv_iter()
-// if iter then
-//     while 1 do
-//         local k = fskv.kv_next(iter)
-//         if not k then
-//             break
-//         end
-//         log.info("fdb", k, "value", fskv.kv_get(k))
-//     end
-// end
-//  */
-// static int l_fskv_iter(lua_State *L) {
-//     if (kvdb_inited == 0) {
-//         LLOGE("call fskv.kvdb_init first!!!");
-//         return 0;
-//     }
-//     fdb_kv_iterator_t iter = lua_newuserdata(L, sizeof(struct fdb_kv_iterator));
-//     if (iter == NULL) {
-//         return 0;
-//     }
-//     iter = fdb_kv_iterator_init(iter);
-//     if (iter != NULL) {
-//         return 1;
-//     }
-//     return 0;
-// }
+/**
+kv数据库迭代器
+@api fskv.iter()
+@return userdata 成功返回迭代器指针,否则返回nil
+@usage
+-- 清空
+local iter = fskv.iter()
+if iter then
+    while 1 do
+        local k = fskv.next(iter)
+        if not k then
+            break
+        end
+        log.info("fdb", k, "value", fskv.kv_get(k))
+    end
+end
+ */
+static int l_fskv_iter(lua_State *L) {
+    if (sfd_lfs == 0) {
+        LLOGE("call fskv.init first!!!");
+        return 0;
+    }
+    size_t *offset = lua_newuserdata(L, sizeof(size_t));
+    memset(offset, 0, sizeof(size_t));
+    return 1;
+}
 
-// /**
-// kv迭代器获取下一个key
-// @api fskv.kv_iter(iter)
-// @userdata fskv.kv_iter()返回的指针
-// @return string 成功返回字符串key值, 否则返回nil
-// @usage
-// -- 清空
-// local iter = fskv.kv_iter()
-// if iter then
-//     while 1 do
-//         local k = fskv.kv_next(iter)
-//         if not k then
-//             break
-//         end
-//         log.info("fdb", k, "value", fskv.kv_get(k))
-//     end
-// end
-//  */
-// static int l_fskv_next(lua_State *L) {
-//     fdb_kv_t cur_kv = NULL;
-//     fdb_kv_iterator_t iter = lua_touserdata(L, 1);
-//     if (iter == NULL) {
-//         return 0;
-//     }
-//     bool ret = fdb_kv_iterate(kvdb, iter);
-//     if (ret) {
-//         cur_kv = &(iter->curr_kv);
-//         lua_pushlstring(L, cur_kv->name, cur_kv->name_len);
-//         // TODO 把值也返回一下?
-//         return 1;
-//     }
-//     return 0;
-// }
+/**
+kv迭代器获取下一个key
+@api fskv.iter(iter)
+@userdata fskv.iter()返回的指针
+@return string 成功返回字符串key值, 否则返回nil
+@usage
+-- 清空
+local iter = fskv.iter()
+if iter then
+    while 1 do
+        local k = fskv.next(iter)
+        if not k then
+            break
+        end
+        log.info("fskv", k, "value", fskv.get(k))
+    end
+end
+ */
+static int l_fskv_next(lua_State *L) {
+    size_t *offset = lua_touserdata(L, 1);
+    char buff[256] = {0};
+    int ret = luat_fskv_next(buff, *offset);
+    if (ret == 0) {
+        lua_pushstring(L, buff);
+        *offset = *offset + 1;
+        return 1;
+    }
+    return 0;
+}
 
 /*
 获取kv数据库状态
@@ -426,10 +416,9 @@ static const rotable_Reg_t reg_fskv[] =
     { "clr",                ROREG_FUNC(l_fskv_clr)},
     { "clear",              ROREG_FUNC(l_fskv_clr)},
     { "stat",               ROREG_FUNC(l_fskv_stat)},
-    { "status",               ROREG_FUNC(l_fskv_stat)},
-    // { "kv_iter",            ROREG_FUNC(l_fskv_iter)},
-    // { "kv_next",            ROREG_FUNC(l_fskv_next)},
-    // { "kv_stat",            ROREG_FUNC(l_fskv_stat)},
+    { "status",             ROREG_FUNC(l_fskv_stat)},
+    { "iter",               ROREG_FUNC(l_fskv_iter)},
+    { "next",               ROREG_FUNC(l_fskv_next)},
 
     // -- 提供与fdb兼容的API
     { "kvdb_init" ,         ROREG_FUNC(l_fskvdb_init)},
@@ -438,6 +427,8 @@ static const rotable_Reg_t reg_fskv[] =
     { "kv_del",             ROREG_FUNC(l_fskv_del)},
     { "kv_clr",             ROREG_FUNC(l_fskv_clr)},
     { "kv_stat",            ROREG_FUNC(l_fskv_stat)},
+    { "kv_iter",            ROREG_FUNC(l_fskv_iter)},
+    { "kv_next",            ROREG_FUNC(l_fskv_next)},
     { NULL,                 ROREG_INT(0)}
 };