webmcp
annotate libraries/mondelefant/mondelefant_atom_connector.lua @ 67:937bbe05098c
Bugfix regarding compatibility with Lua 5.2:
return _M at end of mondelefant.lua
return _M at end of mondelefant.lua
| author | jbe |
|---|---|
| date | Tue Apr 17 15:39:27 2012 +0200 (2012-04-17) |
| parents | 3d43a5cf17c1 |
| children | bbfbbddf13ad |
| 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 error = error |
| jbe/bsw@0 | 7 local getmetatable = getmetatable |
| jbe/bsw@0 | 8 local ipairs = ipairs |
| jbe/bsw@0 | 9 local next = next |
| jbe/bsw@0 | 10 local pairs = pairs |
| jbe/bsw@0 | 11 local print = print |
| jbe/bsw@0 | 12 local rawequal = rawequal |
| jbe/bsw@0 | 13 local rawget = rawget |
| jbe@64 | 14 local rawlen = rawlen |
| jbe/bsw@0 | 15 local rawset = rawset |
| jbe/bsw@0 | 16 local select = select |
| jbe/bsw@0 | 17 local setmetatable = setmetatable |
| jbe/bsw@0 | 18 local tonumber = tonumber |
| jbe/bsw@0 | 19 local tostring = tostring |
| jbe/bsw@0 | 20 local type = type |
| jbe/bsw@0 | 21 |
| jbe/bsw@0 | 22 local math = math |
| jbe/bsw@0 | 23 local string = string |
| jbe@64 | 24 local table = table |
| jbe/bsw@0 | 25 |
| jbe/bsw@0 | 26 local mondelefant = require("mondelefant") |
| jbe/bsw@0 | 27 local atom = require("atom") |
| jbe/bsw@0 | 28 |
| jbe@64 | 29 local _M = {} |
| jbe@64 | 30 if _ENV then |
| jbe@64 | 31 _ENV = _M |
| jbe@64 | 32 else |
| jbe@64 | 33 _G[...] = _M |
| jbe@64 | 34 setfenv(1, _M) |
| jbe@64 | 35 end |
| jbe/bsw@0 | 36 |
| jbe/bsw@0 | 37 |
| jbe/bsw@0 | 38 input_converters = setmetatable({}, { __mode = "k" }) |
| jbe/bsw@0 | 39 |
| jbe/bsw@0 | 40 input_converters["boolean"] = function(conn, value) |
| jbe/bsw@0 | 41 if value then return "TRUE" else return "FALSE" end |
| jbe/bsw@0 | 42 end |
| jbe/bsw@0 | 43 |
| jbe/bsw@0 | 44 input_converters["number"] = function(conn, value) |
| jbe/bsw@0 | 45 local str = tostring(value) |
| jbe/bsw@0 | 46 if string.find(str, "^[0-9%.e%-]+$") then |
| jbe/bsw@0 | 47 return str |
| jbe/bsw@0 | 48 else |
| jbe/bsw@0 | 49 return "'NaN'" |
| jbe/bsw@0 | 50 end |
| jbe/bsw@0 | 51 end |
| jbe/bsw@0 | 52 |
| jbe/bsw@0 | 53 input_converters[atom.fraction] = function(conn, value) |
| jbe/bsw@0 | 54 if value.invalid then |
| jbe/bsw@0 | 55 return "'NaN'" |
| jbe/bsw@0 | 56 else |
| jbe/bsw@0 | 57 local n, d = tostring(value.numerator), tostring(value.denominator) |
| jbe/bsw@0 | 58 if string.find(n, "^%-?[0-9]+$") and string.find(d, "^%-?[0-9]+$") then |
| jbe/bsw@0 | 59 return "(" .. n .. "::numeric / " .. d .. "::numeric)" |
| jbe/bsw@0 | 60 else |
| jbe/bsw@0 | 61 return "'NaN'" |
| jbe/bsw@0 | 62 end |
| jbe/bsw@0 | 63 end |
| jbe/bsw@0 | 64 end |
| jbe/bsw@0 | 65 |
| jbe/bsw@0 | 66 input_converters[atom.date] = function(conn, value) |
| jbe/bsw@0 | 67 return conn:quote_string(tostring(value)) .. "::date" |
| jbe/bsw@0 | 68 end |
| jbe/bsw@0 | 69 |
| jbe/bsw@0 | 70 input_converters[atom.timestamp] = function(conn, value) |
| jbe/bsw@0 | 71 return conn:quote_string(tostring(value)) -- don't define type |
| jbe/bsw@0 | 72 end |
| jbe/bsw@0 | 73 |
| jbe/bsw@0 | 74 input_converters[atom.time] = function(conn, value) |
| jbe/bsw@0 | 75 return conn:quote_string(tostring(value)) .. "::time" |
| jbe/bsw@0 | 76 end |
| jbe/bsw@0 | 77 |
| jbe/bsw@0 | 78 |
| jbe/bsw@0 | 79 output_converters = setmetatable({}, { __mode = "k" }) |
| jbe/bsw@0 | 80 |
| jbe/bsw@0 | 81 output_converters.int8 = function(str) return atom.integer:load(str) end |
| jbe/bsw@0 | 82 output_converters.int4 = function(str) return atom.integer:load(str) end |
| jbe/bsw@0 | 83 output_converters.int2 = function(str) return atom.integer:load(str) end |
| jbe/bsw@0 | 84 |
| jbe/bsw@0 | 85 output_converters.numeric = function(str) return atom.number:load(str) end |
| jbe/bsw@0 | 86 output_converters.float4 = function(str) return atom.number:load(str) end |
| jbe/bsw@0 | 87 output_converters.float8 = function(str) return atom.number:load(str) end |
| jbe/bsw@0 | 88 |
| jbe/bsw@0 | 89 output_converters.bool = function(str) return atom.boolean:load(str) end |
| jbe/bsw@0 | 90 |
| jbe/bsw@0 | 91 output_converters.date = function(str) return atom.date:load(str) end |
| jbe/bsw@0 | 92 |
| jbe/bsw@0 | 93 local timestamp_loader_func = function(str) |
| jbe@1 | 94 local year, month, day, hour, minute, second = string.match( |
| jbe/bsw@0 | 95 str, |
| jbe@1 | 96 "^([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 | 97 ) |
| jbe@1 | 98 if year then |
| jbe/bsw@0 | 99 return atom.timestamp{ |
| jbe@1 | 100 year = tonumber(year), |
| jbe@1 | 101 month = tonumber(month), |
| jbe@1 | 102 day = tonumber(day), |
| jbe/bsw@0 | 103 hour = tonumber(hour), |
| jbe/bsw@0 | 104 minute = tonumber(minute), |
| jbe/bsw@0 | 105 second = tonumber(second) |
| jbe/bsw@0 | 106 } |
| jbe/bsw@0 | 107 else |
| jbe/bsw@0 | 108 return atom.timestamp.invalid |
| jbe/bsw@0 | 109 end |
| jbe/bsw@0 | 110 end |
| jbe/bsw@0 | 111 output_converters.timestamp = timestamp_loader_func |
| jbe/bsw@0 | 112 output_converters.timestamptz = timestamp_loader_func |
| jbe/bsw@0 | 113 |
| jbe/bsw@0 | 114 local time_loader_func = function(str) |
| jbe@1 | 115 local hour, minute, second = string.match( |
| jbe/bsw@0 | 116 str, |
| jbe@1 | 117 "^([0-9]?[0-9]):([0-9][0-9]):([0-9][0-9])" |
| jbe/bsw@0 | 118 ) |
| jbe@1 | 119 if hour then |
| jbe/bsw@0 | 120 return atom.time{ |
| jbe/bsw@0 | 121 hour = tonumber(hour), |
| jbe/bsw@0 | 122 minute = tonumber(minute), |
| jbe/bsw@0 | 123 second = tonumber(second) |
| jbe/bsw@0 | 124 } |
| jbe/bsw@0 | 125 else |
| jbe/bsw@0 | 126 return atom.time.invalid |
| jbe/bsw@0 | 127 end |
| jbe/bsw@0 | 128 end |
| jbe/bsw@0 | 129 output_converters.time = time_loader_func |
| jbe/bsw@0 | 130 output_converters.timetz = time_loader_func |
| jbe/bsw@0 | 131 |
| jbe/bsw@0 | 132 mondelefant.postgresql_connection_prototype.type_mappings = { |
| jbe/bsw@0 | 133 int8 = atom.integer, |
| jbe/bsw@0 | 134 int4 = atom.integer, |
| jbe/bsw@0 | 135 int2 = atom.integer, |
| jbe/bsw@0 | 136 bool = atom.boolean, |
| jbe/bsw@0 | 137 date = atom.date, |
| jbe/bsw@0 | 138 timestamp = atom.timestamp, |
| jbe/bsw@0 | 139 time = atom.time, |
| jbe/bsw@0 | 140 text = atom.string, |
| jbe/bsw@0 | 141 varchar = atom.string, |
| jbe/bsw@0 | 142 } |
| jbe/bsw@0 | 143 |
| jbe/bsw@0 | 144 |
| jbe/bsw@0 | 145 function mondelefant.postgresql_connection_prototype.input_converter(conn, value, info) |
| jbe/bsw@0 | 146 if value == nil then |
| jbe/bsw@0 | 147 return "NULL" |
| jbe/bsw@0 | 148 else |
| jbe/bsw@0 | 149 local converter = |
| jbe/bsw@0 | 150 input_converters[getmetatable(value)] or |
| jbe/bsw@0 | 151 input_converters[type(value)] |
| jbe/bsw@0 | 152 if converter then |
| jbe/bsw@0 | 153 return converter(conn, value) |
| jbe/bsw@0 | 154 else |
| jbe/bsw@0 | 155 return conn:quote_string(tostring(value)) |
| jbe/bsw@0 | 156 end |
| jbe/bsw@0 | 157 end |
| jbe/bsw@0 | 158 end |
| jbe/bsw@0 | 159 |
| jbe/bsw@0 | 160 function mondelefant.postgresql_connection_prototype.output_converter(conn, value, info) |
| jbe/bsw@0 | 161 if value == nil then |
| jbe/bsw@0 | 162 return nil |
| jbe/bsw@0 | 163 else |
| jbe/bsw@0 | 164 local converter = output_converters[info.type] |
| jbe/bsw@0 | 165 if converter then |
| jbe/bsw@0 | 166 return converter(value) |
| jbe/bsw@0 | 167 else |
| jbe/bsw@0 | 168 return value |
| jbe/bsw@0 | 169 end |
| jbe/bsw@0 | 170 end |
| jbe/bsw@0 | 171 end |
| jbe/bsw@0 | 172 |
| jbe@64 | 173 return _M |
| jbe@64 | 174 |
| jbe/bsw@0 | 175 |
| jbe/bsw@0 | 176 --[[ |
| jbe/bsw@0 | 177 |
| jbe/bsw@0 | 178 db = assert(mondelefant.connect{engine='postgresql', dbname='test'}) |
| jbe/bsw@0 | 179 result = db:query{'SELECT ? + 1', atom.date{ year=1999, month=12, day=31}} |
| jbe/bsw@0 | 180 print(result[1][1].year) |
| jbe/bsw@0 | 181 |
| jbe/bsw@0 | 182 --]] |