webmcp
annotate libraries/mondelefant/mondelefant_atom_connector.lua @ 2:72860d232f32
Version 1.0.2
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
| author | jbe/bsw |
|---|---|
| date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
| parents | 985024b16520 |
| children | 3d43a5cf17c1 |
| rev | line source |
|---|---|
| jbe/bsw@0 | 1 #!/usr/bin/env lua |
| jbe/bsw@0 | 2 |
| jbe/bsw@0 | 3 local _G = _G |
| jbe/bsw@0 | 4 local _VERSION = _VERSION |
| jbe/bsw@0 | 5 local assert = assert |
| jbe/bsw@0 | 6 local collectgarbage = collectgarbage |
| jbe/bsw@0 | 7 local dofile = dofile |
| jbe/bsw@0 | 8 local error = error |
| jbe/bsw@0 | 9 local getfenv = getfenv |
| jbe/bsw@0 | 10 local getmetatable = getmetatable |
| jbe/bsw@0 | 11 local ipairs = ipairs |
| jbe/bsw@0 | 12 local load = load |
| jbe/bsw@0 | 13 local loadfile = loadfile |
| jbe/bsw@0 | 14 local loadstring = loadstring |
| jbe/bsw@0 | 15 local module = module |
| jbe/bsw@0 | 16 local next = next |
| jbe/bsw@0 | 17 local pairs = pairs |
| jbe/bsw@0 | 18 local pcall = pcall |
| jbe/bsw@0 | 19 local print = print |
| jbe/bsw@0 | 20 local rawequal = rawequal |
| jbe/bsw@0 | 21 local rawget = rawget |
| jbe/bsw@0 | 22 local rawset = rawset |
| jbe/bsw@0 | 23 local require = require |
| jbe/bsw@0 | 24 local select = select |
| jbe/bsw@0 | 25 local setfenv = setfenv |
| jbe/bsw@0 | 26 local setmetatable = setmetatable |
| jbe/bsw@0 | 27 local tonumber = tonumber |
| jbe/bsw@0 | 28 local tostring = tostring |
| jbe/bsw@0 | 29 local type = type |
| jbe/bsw@0 | 30 local unpack = unpack |
| jbe/bsw@0 | 31 local xpcall = xpcall |
| jbe/bsw@0 | 32 |
| jbe/bsw@0 | 33 local coroutine = coroutine |
| jbe/bsw@0 | 34 local debug = debug |
| jbe/bsw@0 | 35 local io = io |
| jbe/bsw@0 | 36 local math = math |
| jbe/bsw@0 | 37 local os = os |
| jbe/bsw@0 | 38 local package = package |
| jbe/bsw@0 | 39 local string = string |
| jbe/bsw@0 | 40 |
| jbe/bsw@0 | 41 local mondelefant = require("mondelefant") |
| jbe/bsw@0 | 42 local atom = require("atom") |
| jbe/bsw@0 | 43 |
| jbe/bsw@0 | 44 module(...) |
| jbe/bsw@0 | 45 |
| jbe/bsw@0 | 46 |
| jbe/bsw@0 | 47 input_converters = setmetatable({}, { __mode = "k" }) |
| jbe/bsw@0 | 48 |
| jbe/bsw@0 | 49 input_converters["boolean"] = function(conn, value) |
| jbe/bsw@0 | 50 if value then return "TRUE" else return "FALSE" end |
| jbe/bsw@0 | 51 end |
| jbe/bsw@0 | 52 |
| jbe/bsw@0 | 53 input_converters["number"] = function(conn, value) |
| jbe/bsw@0 | 54 local str = tostring(value) |
| jbe/bsw@0 | 55 if string.find(str, "^[0-9%.e%-]+$") then |
| jbe/bsw@0 | 56 return str |
| jbe/bsw@0 | 57 else |
| jbe/bsw@0 | 58 return "'NaN'" |
| jbe/bsw@0 | 59 end |
| jbe/bsw@0 | 60 end |
| jbe/bsw@0 | 61 |
| jbe/bsw@0 | 62 input_converters[atom.fraction] = function(conn, value) |
| jbe/bsw@0 | 63 if value.invalid then |
| jbe/bsw@0 | 64 return "'NaN'" |
| jbe/bsw@0 | 65 else |
| jbe/bsw@0 | 66 local n, d = tostring(value.numerator), tostring(value.denominator) |
| jbe/bsw@0 | 67 if string.find(n, "^%-?[0-9]+$") and string.find(d, "^%-?[0-9]+$") then |
| jbe/bsw@0 | 68 return "(" .. n .. "::numeric / " .. d .. "::numeric)" |
| jbe/bsw@0 | 69 else |
| jbe/bsw@0 | 70 return "'NaN'" |
| jbe/bsw@0 | 71 end |
| jbe/bsw@0 | 72 end |
| jbe/bsw@0 | 73 end |
| jbe/bsw@0 | 74 |
| jbe/bsw@0 | 75 input_converters[atom.date] = function(conn, value) |
| jbe/bsw@0 | 76 return conn:quote_string(tostring(value)) .. "::date" |
| jbe/bsw@0 | 77 end |
| jbe/bsw@0 | 78 |
| jbe/bsw@0 | 79 input_converters[atom.timestamp] = function(conn, value) |
| jbe/bsw@0 | 80 return conn:quote_string(tostring(value)) -- don't define type |
| jbe/bsw@0 | 81 end |
| jbe/bsw@0 | 82 |
| jbe/bsw@0 | 83 input_converters[atom.time] = function(conn, value) |
| jbe/bsw@0 | 84 return conn:quote_string(tostring(value)) .. "::time" |
| jbe/bsw@0 | 85 end |
| jbe/bsw@0 | 86 |
| jbe/bsw@0 | 87 |
| jbe/bsw@0 | 88 output_converters = setmetatable({}, { __mode = "k" }) |
| jbe/bsw@0 | 89 |
| jbe/bsw@0 | 90 output_converters.int8 = function(str) return atom.integer:load(str) end |
| jbe/bsw@0 | 91 output_converters.int4 = function(str) return atom.integer:load(str) end |
| jbe/bsw@0 | 92 output_converters.int2 = function(str) return atom.integer:load(str) end |
| jbe/bsw@0 | 93 |
| jbe/bsw@0 | 94 output_converters.numeric = function(str) return atom.number:load(str) end |
| jbe/bsw@0 | 95 output_converters.float4 = function(str) return atom.number:load(str) end |
| jbe/bsw@0 | 96 output_converters.float8 = function(str) return atom.number:load(str) end |
| jbe/bsw@0 | 97 |
| jbe/bsw@0 | 98 output_converters.bool = function(str) return atom.boolean:load(str) end |
| jbe/bsw@0 | 99 |
| jbe/bsw@0 | 100 output_converters.date = function(str) return atom.date:load(str) end |
| jbe/bsw@0 | 101 |
| jbe/bsw@0 | 102 local timestamp_loader_func = function(str) |
| jbe@1 | 103 local year, month, day, hour, minute, second = string.match( |
| jbe/bsw@0 | 104 str, |
| jbe@1 | 105 "^([0-9][0-9][0-9][0-9])%-([0-9][0-9])%-([0-9][0-9]) ([0-9]?[0-9]):([0-9][0-9]):([0-9][0-9])" |
| jbe/bsw@0 | 106 ) |
| jbe@1 | 107 if year then |
| jbe/bsw@0 | 108 return atom.timestamp{ |
| jbe@1 | 109 year = tonumber(year), |
| jbe@1 | 110 month = tonumber(month), |
| jbe@1 | 111 day = tonumber(day), |
| jbe/bsw@0 | 112 hour = tonumber(hour), |
| jbe/bsw@0 | 113 minute = tonumber(minute), |
| jbe/bsw@0 | 114 second = tonumber(second) |
| jbe/bsw@0 | 115 } |
| jbe/bsw@0 | 116 else |
| jbe/bsw@0 | 117 return atom.timestamp.invalid |
| jbe/bsw@0 | 118 end |
| jbe/bsw@0 | 119 end |
| jbe/bsw@0 | 120 output_converters.timestamp = timestamp_loader_func |
| jbe/bsw@0 | 121 output_converters.timestamptz = timestamp_loader_func |
| jbe/bsw@0 | 122 |
| jbe/bsw@0 | 123 local time_loader_func = function(str) |
| jbe@1 | 124 local hour, minute, second = string.match( |
| jbe/bsw@0 | 125 str, |
| jbe@1 | 126 "^([0-9]?[0-9]):([0-9][0-9]):([0-9][0-9])" |
| jbe/bsw@0 | 127 ) |
| jbe@1 | 128 if hour then |
| jbe/bsw@0 | 129 return atom.time{ |
| jbe/bsw@0 | 130 hour = tonumber(hour), |
| jbe/bsw@0 | 131 minute = tonumber(minute), |
| jbe/bsw@0 | 132 second = tonumber(second) |
| jbe/bsw@0 | 133 } |
| jbe/bsw@0 | 134 else |
| jbe/bsw@0 | 135 return atom.time.invalid |
| jbe/bsw@0 | 136 end |
| jbe/bsw@0 | 137 end |
| jbe/bsw@0 | 138 output_converters.time = time_loader_func |
| jbe/bsw@0 | 139 output_converters.timetz = time_loader_func |
| jbe/bsw@0 | 140 |
| jbe/bsw@0 | 141 mondelefant.postgresql_connection_prototype.type_mappings = { |
| jbe/bsw@0 | 142 int8 = atom.integer, |
| jbe/bsw@0 | 143 int4 = atom.integer, |
| jbe/bsw@0 | 144 int2 = atom.integer, |
| jbe/bsw@0 | 145 bool = atom.boolean, |
| jbe/bsw@0 | 146 date = atom.date, |
| jbe/bsw@0 | 147 timestamp = atom.timestamp, |
| jbe/bsw@0 | 148 time = atom.time, |
| jbe/bsw@0 | 149 text = atom.string, |
| jbe/bsw@0 | 150 varchar = atom.string, |
| jbe/bsw@0 | 151 } |
| jbe/bsw@0 | 152 |
| jbe/bsw@0 | 153 |
| jbe/bsw@0 | 154 function mondelefant.postgresql_connection_prototype.input_converter(conn, value, info) |
| jbe/bsw@0 | 155 if value == nil then |
| jbe/bsw@0 | 156 return "NULL" |
| jbe/bsw@0 | 157 else |
| jbe/bsw@0 | 158 local converter = |
| jbe/bsw@0 | 159 input_converters[getmetatable(value)] or |
| jbe/bsw@0 | 160 input_converters[type(value)] |
| jbe/bsw@0 | 161 if converter then |
| jbe/bsw@0 | 162 return converter(conn, value) |
| jbe/bsw@0 | 163 else |
| jbe/bsw@0 | 164 return conn:quote_string(tostring(value)) |
| jbe/bsw@0 | 165 end |
| jbe/bsw@0 | 166 end |
| jbe/bsw@0 | 167 end |
| jbe/bsw@0 | 168 |
| jbe/bsw@0 | 169 function mondelefant.postgresql_connection_prototype.output_converter(conn, value, info) |
| jbe/bsw@0 | 170 if value == nil then |
| jbe/bsw@0 | 171 return nil |
| jbe/bsw@0 | 172 else |
| jbe/bsw@0 | 173 local converter = output_converters[info.type] |
| jbe/bsw@0 | 174 if converter then |
| jbe/bsw@0 | 175 return converter(value) |
| jbe/bsw@0 | 176 else |
| jbe/bsw@0 | 177 return value |
| jbe/bsw@0 | 178 end |
| jbe/bsw@0 | 179 end |
| jbe/bsw@0 | 180 end |
| jbe/bsw@0 | 181 |
| jbe/bsw@0 | 182 |
| jbe/bsw@0 | 183 --[[ |
| jbe/bsw@0 | 184 |
| jbe/bsw@0 | 185 db = assert(mondelefant.connect{engine='postgresql', dbname='test'}) |
| jbe/bsw@0 | 186 result = db:query{'SELECT ? + 1', atom.date{ year=1999, month=12, day=31}} |
| jbe/bsw@0 | 187 print(result[1][1].year) |
| jbe/bsw@0 | 188 |
| jbe/bsw@0 | 189 --]] |