cloudwu / lua-bson

A BSON library for lua
MIT License
103 stars 32 forks source link

在某些情况下append_table中判断table是否是array不正确 #9

Open usbuild opened 7 years ago

usbuild commented 7 years ago

相关代码

lua_rawlen可能返回在 hashpart 部分的 integer key,从而使得后面的 lua_next 的结果处于不确定的状态。

系统环境

Lua 5.3.2 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2

测试用例

t={}
for i = 1, 33 do t[i] = 1; end
for i = 1, 10 do t[i] = nil; end
t[35] = 1
t['7']=1
bson.encode({t})

输出

Invalid array key type : string
stack traceback:
        [C]: in function 'bson.encode'
        stdin:1: in main chunk
        [C]: in ?
cloudwu commented 7 years ago

如果要用字典,key 就不可以是 number ,只能是 string 。如果是 Array 这要求必须 key 为连续的 integer 。所以这个测试案例本身是错误的用法,这里的 t 本身不是一个可以合法 encode 成 bson 对象的 table 。

参见 http://bsonspec.org/spec.html 中 element 和 array 的定义。

usbuild commented 7 years ago

@cloudwu 谢谢回复,我一开始期望的结果是会以 dict 的形式写入 mongodb( integer 的 key 会被转成 string)而不是报错,其他绝大部分情况下数字和字符串混合 key 的情况下是可以 encode 的(当然这也是不规范的使用方法……)

hanxi commented 3 years ago

@usbuild 可以考虑我这个修改,让 MongoDB 支持 integer 的 key 。如果数组用的比较少的情况下,对原有代码改动还是比较少的。

  • 整数 key 将加前缀 _i_ 保存到数据库
  • 加载数据库数据遇到 key 的字段前缀为 _i_ 时,删除前缀然后转为整数 key
  • 需要打包数组的 table 时,需要特殊处理

https://github.com/hanxi/skynet-demo/blob/master/lualib-src/lua-bson.c