Просмотр исходного кода

fix: 修正fdb写入数字字符串时类型变化的bug https://gitee.com/openLuat/LuatOS/issues/I4UTPL?from=project-issue

Wendal Chen 4 лет назад
Родитель
Сommit
bdb7042f83
2 измененных файлов с 56 добавлено и 26 удалено
  1. 41 25
      components/flashdb/src/luat_lib_fdb.c
  2. 15 1
      demo/fdb/main.lua

+ 41 - 25
components/flashdb/src/luat_lib_fdb.c

@@ -62,39 +62,52 @@ static int l_fdb_kv_set(lua_State *L) {
     luaL_buffinit(L, &buff);
     const char* key = luaL_checkstring(L, 1);
     //luaL_addchar(&buff, 0xA5);
-    if (lua_isboolean(L, 2)) {
+    int type = lua_type(L, 2);
+    switch (type)
+    {
+    case LUA_TBOOLEAN:
         luaL_addchar(&buff, LUA_TBOOLEAN);
         bool val = lua_toboolean(L, 2);
         luaL_addlstring(&buff, (const char*)&val, sizeof(val));
-    }
-    else if (lua_isinteger(L, 2)) {
-        luaL_addchar(&buff, LUA_TINTEGER); // 自定义类型
-        lua_Integer val = luaL_checkinteger(L, 2);
-        luaL_addlstring(&buff, (const char*)&val, sizeof(val));
-    }
-    else if (lua_isnumber(L, 2)) {
-        luaL_addchar(&buff, LUA_TNUMBER);
-        lua_getglobal(L, "pack");
-        if (lua_isnil(L, -1)) {
-            LLOGW("float number need pack lib");
-            lua_pushboolean(L, 0);
-            return 1;
+        break;
+    case LUA_TNUMBER:
+        if (lua_isinteger(L, 2)) {
+            luaL_addchar(&buff, LUA_TINTEGER); // 自定义类型
+            lua_Integer val = luaL_checkinteger(L, 2);
+            luaL_addlstring(&buff, (const char*)&val, sizeof(val));
         }
-        lua_getfield(L, -1, "pack");
-        lua_pushstring(L, ">f");
-        lua_pushvalue(L, 2);
-        lua_call(L, 2, 1);
-        if (lua_isstring(L, -1)) {
-            const char* val = luaL_checklstring(L, -1, &len);
-            luaL_addlstring(&buff, val, len);
+        else {
+            luaL_addchar(&buff, LUA_TNUMBER);
+            lua_getglobal(L, "pack");
+            if (lua_isnil(L, -1)) {
+                LLOGW("float number need pack lib");
+                lua_pushboolean(L, 0);
+                return 1;
+            }
+            lua_getfield(L, -1, "pack");
+            lua_pushstring(L, ">f");
+            lua_pushvalue(L, 2);
+            lua_call(L, 2, 1);
+            if (lua_isstring(L, -1)) {
+                const char* val = luaL_checklstring(L, -1, &len);
+                luaL_addlstring(&buff, val, len);
+            }
+            else {
+                LLOGW("kdb store number fail!!");
+                lua_pushboolean(L, 0);
+                return 1;
+            }
         }
-    }
-    else if (lua_isstring(L, 2)) {
+        break;
+    case LUA_TSTRING:
+    {
         luaL_addchar(&buff, LUA_TSTRING);
         const char* val = luaL_checklstring(L, 2, &len);
         luaL_addlstring(&buff, val, len);
+        break;
     }
-    else if (lua_istable(L, 2)) {
+    case LUA_TTABLE:
+    {
         lua_settop(L, 2);
         lua_getglobal(L, "json");
         if (lua_isnil(L, -1)) {
@@ -122,12 +135,15 @@ static int l_fdb_kv_set(lua_State *L) {
             lua_pushboolean(L, 0);
             return 1;
         }
+        break;
     }
-    else {
+    default:
+    {
         LLOGW("function/userdata/nil/thread isn't allow");
         lua_pushboolean(L, 0);
         return 1;
     }
+    }
     blob.buf = buff.b;
     blob.size = buff.n;
     fdb_err_t ret = fdb_kv_set_blob(&kvdb, key, &blob);

+ 15 - 1
demo/fdb/main.lua

@@ -20,19 +20,33 @@ sys.taskInit(function()
     -- 初始化kv数据库
     fdb.kvdb_init("onchip_flash")
     -- 先放入一堆值
+    local bootime = fdb.kv_get("boottime")
+    if bootime == nil or type(bootime) ~= "number" then
+        bootime = 0
+    else
+        bootime = bootime + 1
+    end
+    fdb.kv_set("boottime", bootime)
+
     fdb.kv_set("my_bool", true)
     fdb.kv_set("my_int", 123)
     fdb.kv_set("my_number", 1.23)
     fdb.kv_set("my_str", "luatos")
     fdb.kv_set("my_table", {name="wendal",age=18})
-    fdb.kv_set("my_nil", nil) -- 会提示失败,不支持空值
+    
+    fdb.kv_set("my_str_int", "123")
+    fdb.kv_set("1", "123") -- 单字节key
+    --fdb.kv_set("my_nil", nil) -- 会提示失败,不支持空值
 
 
+    log.info("fdb", "boottime",      type(fdb.kv_get("boottime")),    fdb.kv_get("boottime"))
     log.info("fdb", "my_bool",      type(fdb.kv_get("my_bool")),    fdb.kv_get("my_bool"))
     log.info("fdb", "my_int",       type(fdb.kv_get("my_int")),     fdb.kv_get("my_int"))
     log.info("fdb", "my_number",    type(fdb.kv_get("my_number")),  fdb.kv_get("my_number"))
     log.info("fdb", "my_str",       type(fdb.kv_get("my_str")),     fdb.kv_get("my_str"))
     log.info("fdb", "my_table",     type(fdb.kv_get("my_table")),   json.encode(fdb.kv_get("my_table")))
+    log.info("fdb", "my_str_int",     type(fdb.kv_get("my_str_int")),   fdb.kv_get("my_str_int"))
+    log.info("fdb", "1 byte key",     type(fdb.kv_get("1")),   json.encode(fdb.kv_get("1")))
 
 end)