webmcp
annotate libraries/mondelefant/mondelefant_atom_connector.lua @ 1:985024b16520
Version 1.0.1
New feature: JSON requests
Changes in ui.paginate: Current page setting is directly fetched from CGI params, instead of view params
Changed behavior of load methods of atom library to accept nil as input
Bugfixes in mondelefant_atom_connector timestamp(tz) loaders
Added global constant _WEBMCP_VERSION containing a version string
New feature: JSON requests
Changes in ui.paginate: Current page setting is directly fetched from CGI params, instead of view params
Changed behavior of load methods of atom library to accept nil as input
Bugfixes in mondelefant_atom_connector timestamp(tz) loaders
Added global constant _WEBMCP_VERSION containing a version string
author | jbe |
---|---|
date | Tue Nov 17 12:00:00 2009 +0100 (2009-11-17) |
parents | 9fdfb27f8e67 |
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 --]] |