webmcp
changeset 549:77355fe3b1cc
Array support for more types
author | jbe |
---|---|
date | Tue Oct 22 13:45:45 2019 +0200 (2019-10-22) |
parents | a006593b747c |
children | 59d2aaa6df07 |
files | libraries/mondelefant/mondelefant_atom_connector.lua |
line diff
1.1 --- a/libraries/mondelefant/mondelefant_atom_connector.lua Mon Oct 21 19:55:13 2019 +0200 1.2 +++ b/libraries/mondelefant/mondelefant_atom_connector.lua Tue Oct 22 13:45:45 2019 +0200 1.3 @@ -38,11 +38,15 @@ 1.4 1.5 input_converters = setmetatable({}, { __mode = "k" }) 1.6 1.7 -input_converters["boolean"] = function(conn, value) 1.8 - if value then return "TRUE" else return "FALSE" end 1.9 +input_converters["boolean"] = function(conn, value, rawtext_mode) 1.10 + if rawtext_mode then 1.11 + if value then return "t" else return "f" end 1.12 + else 1.13 + if value then return "TRUE" else return "FALSE" end 1.14 + end 1.15 end 1.16 1.17 -input_converters["number"] = function(conn, value) 1.18 +input_converters["number"] = function(conn, value, rawtext_mode) 1.19 if _VERSION == "Lua 5.2" then 1.20 -- TODO: remove following compatibility hack to allow large integers (e.g. 1e14) in Lua 5.2 1.21 local integer_string = string.format("%i", value) 1.22 @@ -53,7 +57,7 @@ 1.23 if string.find(number_string, "^[0-9.e+-]+$") then 1.24 return number_string 1.25 else 1.26 - return "'NaN'" 1.27 + if rawtext_mode then return "NaN" else return "'NaN'" end 1.28 end 1.29 end 1.30 end 1.31 @@ -65,41 +69,65 @@ 1.32 if string.find(str, "^[0-9.e+-]+$") then 1.33 return str 1.34 end 1.35 - return "'NaN'" 1.36 + if rawtext_mode then return "NaN" else return "'NaN'" end 1.37 end 1.38 1.39 -input_converters[atom.fraction] = function(conn, value) 1.40 +input_converters[atom.fraction] = function(conn, value, rawtext_mode) 1.41 if value.invalid then 1.42 - return "'NaN'" 1.43 + if rawtext_mode then return "NaN" else return "'NaN'" end 1.44 else 1.45 local n, d = tostring(value.numerator), tostring(value.denominator) 1.46 if string.find(n, "^%-?[0-9]+$") and string.find(d, "^%-?[0-9]+$") then 1.47 - return "(" .. n .. "::numeric / " .. d .. "::numeric)" 1.48 + if rawtext_mode then 1.49 + return n .. "/" .. d 1.50 + else 1.51 + return "(" .. n .. "::numeric / " .. d .. "::numeric)" 1.52 + end 1.53 else 1.54 - return "'NaN'" 1.55 + if rawtext_mode then return "NaN" else return "'NaN'" end 1.56 end 1.57 end 1.58 end 1.59 1.60 -input_converters[atom.date] = function(conn, value) 1.61 - return conn:quote_string(tostring(value)) .. "::date" 1.62 +input_converters[atom.date] = function(conn, value, rawtext_mode) 1.63 + if rawtext_mode then 1.64 + return tostring(value) 1.65 + else 1.66 + return conn:quote_string(tostring(value)) .. "::date" 1.67 + end 1.68 end 1.69 1.70 -input_converters[atom.timestamp] = function(conn, value) 1.71 - return conn:quote_string(tostring(value)) -- don't define type 1.72 +input_converters[atom.timestamp] = function(conn, value, rawtext_mode) 1.73 + if rawtext_mode then 1.74 + return tostring(value) 1.75 + else 1.76 + return conn:quote_string(tostring(value)) -- don't define type 1.77 + end 1.78 end 1.79 1.80 -input_converters[atom.time] = function(conn, value) 1.81 - return conn:quote_string(tostring(value)) .. "::time" 1.82 +input_converters[atom.time] = function(conn, value, rawtext_mode) 1.83 + if rawtext_mode then 1.84 + return tostring(value) 1.85 + else 1.86 + return conn:quote_string(tostring(value)) .. "::time" 1.87 + end 1.88 end 1.89 1.90 -input_converters["table"] = function(conn, value) -- integer and text arrays 1.91 - -- TODO: support more types 1.92 +input_converters["table"] = function(conn, value, rawtext_mode) 1.93 + -- treat tables as arrays 1.94 local parts = { "{" } 1.95 for i, v in ipairs(value) do 1.96 if i > 1 then parts[#parts+1] = "," end 1.97 + local converter = 1.98 + input_converters[getmetatable(v)] or 1.99 + input_converters[type(v)] 1.100 + if converter then 1.101 + v = converter(conn, v, true) 1.102 + else 1.103 + v = tostring(v) 1.104 + end 1.105 parts[#parts+1] = '"' 1.106 - parts[#parts+1] = string.gsub(tostring(v), '[\\"]', '\\%0') 1.107 + parts[#parts+1] = string.gsub(v, '[\\"]', '\\%0') 1.108 parts[#parts+1] = '"' 1.109 end 1.110 parts[#parts+1] = "}"