local function _dump_entry_data_list(entry_data_list,status,resultTab)
if not entry_data_list then
return nil,nil,resultTab
end
if not resultTab then
resultTab = {}
end
local flag = false
local entry_data_item = entry_data_list[0].entry_data
local data_type = entry_data_item.type
local data_size = entry_data_item.data_size
if data_type == MMDB_DATA_TYPE_MAP then
table.insert(resultTab,"{")
local size = entry_data_item.data_size
entry_data_list = entry_data_list[0].next
while(size > 0 and entry_data_list)
do
entry_data_item = entry_data_list[0].entry_data
data_type = entry_data_item.type
data_size = entry_data_item.data_size
if MMDB_DATA_TYPE_UTF8_STRING ~= data_type then
return nil,MMDB_INVALID_DATA_ERROR,resultTab
end
local val = ffi_str(entry_data_item.utf8_string,data_size)
if not val then
return nil,MMDB_OUT_OF_MEMORY_ERROR,resultTab
end
table.insert(resultTab,(flag and ',\"%s\":' or '\"%s\":'):format(val))
flag = true
entry_data_list = entry_data_list[0].next
entry_data_list,status,resultTab = _dump_entry_data_list(entry_data_list,status,resultTab)
if status ~= MMDB_SUCCESS then
return nil,nil,resultTab
end
size = size -1
end
table.insert(resultTab,"}")
elseif entry_data_list[0].entry_data.type == MMDB_DATA_TYPE_ARRAY then
local size = entry_data_list[0].entry_data.data_size
table.insert(resultTab,"[")
entry_data_list = entry_data_list[0].next
while(size >0 and entry_data_list)
do
entry_data_list,status,resultTab = _dump_entry_data_list(entry_data_list,status,resultTab)
if status ~= MMDB_SUCCESS then
return nil,nil,resultTab
end
size = size -1
end
table.insert(resultTab,"]")
else
entry_data_item = entry_data_list[0].entry_data
data_type = entry_data_item.type
data_size = entry_data_item.data_size
local val
local fmt="%s"
if data_type == MMDB_DATA_TYPE_UTF8_STRING then
val = ffi_str(entry_data_item.utf8_string,data_size)
fmt='\"%s\"'
if not val then
status = MMDB_OUT_OF_MEMORY_ERROR
return nil,status,resultTab
end
elseif data_type == MMDB_DATA_TYPE_BYTES then
val = ffi_str(ffi_cast('char * ',entry_data_item.bytes),data_size)
fmt='\"%s\"'
if not val then
status = MMDB_OUT_OF_MEMORY_ERROR
return nil,status,resultTab
end
elseif data_type == MMDB_DATA_TYPE_DOUBLE then
val = entry_data_item.double_value
elseif data_type == MMDB_DATA_TYPE_FLOAT then
val = entry_data_item.float_value
elseif data_type == MMDB_DATA_TYPE_UINT16 then
val = entry_data_item.uint16
elseif data_type == MMDB_DATA_TYPE_UINT32 then
val = entry_data_item.uint32
elseif data_type == MMDB_DATA_TYPE_BOOLEAN then
val = entry_data_item.boolean == 1
elseif data_type == MMDB_DATA_TYPE_UINT64 then
val = entry_data_item.uint64
elseif data_type == MMDB_DATA_TYPE_INT32 then
val = entry_data_item.int32
else
return nil,MMDB_INVALID_DATA_ERROR,resultTab
end
table.insert(resultTab,(fmt):format(val))
entry_data_list = entry_data_list[0].next
end
status = MMDB_SUCCESS
return entry_data_list,status,resultTab
end