# HG changeset patch # User jbe # Date 1571744745 -7200 # Node ID 77355fe3b1ccf3aede5f2a716df3c0f001c7c61d # Parent a006593b747c5f998d14304430294f0fcc079141 Array support for more types diff -r a006593b747c -r 77355fe3b1cc libraries/mondelefant/mondelefant_atom_connector.lua --- a/libraries/mondelefant/mondelefant_atom_connector.lua Mon Oct 21 19:55:13 2019 +0200 +++ b/libraries/mondelefant/mondelefant_atom_connector.lua Tue Oct 22 13:45:45 2019 +0200 @@ -38,11 +38,15 @@ input_converters = setmetatable({}, { __mode = "k" }) -input_converters["boolean"] = function(conn, value) - if value then return "TRUE" else return "FALSE" end +input_converters["boolean"] = function(conn, value, rawtext_mode) + if rawtext_mode then + if value then return "t" else return "f" end + else + if value then return "TRUE" else return "FALSE" end + end end -input_converters["number"] = function(conn, value) +input_converters["number"] = function(conn, value, rawtext_mode) if _VERSION == "Lua 5.2" then -- TODO: remove following compatibility hack to allow large integers (e.g. 1e14) in Lua 5.2 local integer_string = string.format("%i", value) @@ -53,7 +57,7 @@ if string.find(number_string, "^[0-9.e+-]+$") then return number_string else - return "'NaN'" + if rawtext_mode then return "NaN" else return "'NaN'" end end end end @@ -65,41 +69,65 @@ if string.find(str, "^[0-9.e+-]+$") then return str end - return "'NaN'" + if rawtext_mode then return "NaN" else return "'NaN'" end end -input_converters[atom.fraction] = function(conn, value) +input_converters[atom.fraction] = function(conn, value, rawtext_mode) if value.invalid then - return "'NaN'" + if rawtext_mode then return "NaN" else return "'NaN'" end else local n, d = tostring(value.numerator), tostring(value.denominator) if string.find(n, "^%-?[0-9]+$") and string.find(d, "^%-?[0-9]+$") then - return "(" .. n .. "::numeric / " .. d .. "::numeric)" + if rawtext_mode then + return n .. "/" .. d + else + return "(" .. n .. "::numeric / " .. d .. "::numeric)" + end else - return "'NaN'" + if rawtext_mode then return "NaN" else return "'NaN'" end end end end -input_converters[atom.date] = function(conn, value) - return conn:quote_string(tostring(value)) .. "::date" +input_converters[atom.date] = function(conn, value, rawtext_mode) + if rawtext_mode then + return tostring(value) + else + return conn:quote_string(tostring(value)) .. "::date" + end end -input_converters[atom.timestamp] = function(conn, value) - return conn:quote_string(tostring(value)) -- don't define type +input_converters[atom.timestamp] = function(conn, value, rawtext_mode) + if rawtext_mode then + return tostring(value) + else + return conn:quote_string(tostring(value)) -- don't define type + end end -input_converters[atom.time] = function(conn, value) - return conn:quote_string(tostring(value)) .. "::time" +input_converters[atom.time] = function(conn, value, rawtext_mode) + if rawtext_mode then + return tostring(value) + else + return conn:quote_string(tostring(value)) .. "::time" + end end -input_converters["table"] = function(conn, value) -- integer and text arrays - -- TODO: support more types +input_converters["table"] = function(conn, value, rawtext_mode) + -- treat tables as arrays local parts = { "{" } for i, v in ipairs(value) do if i > 1 then parts[#parts+1] = "," end + local converter = + input_converters[getmetatable(v)] or + input_converters[type(v)] + if converter then + v = converter(conn, v, true) + else + v = tostring(v) + end parts[#parts+1] = '"' - parts[#parts+1] = string.gsub(tostring(v), '[\\"]', '\\%0') + parts[#parts+1] = string.gsub(v, '[\\"]', '\\%0') parts[#parts+1] = '"' end parts[#parts+1] = "}"