webmcp
annotate libraries/mondelefant/mondelefant_atom_connector.lua @ 66:afed1ab1477f
Bugfix regarding compatibility with Lua 5.2:
#if instead of #ifdef in webmcp_accelerator.c
#if instead of #ifdef in webmcp_accelerator.c
author | jbe |
---|---|
date | Tue Apr 17 15:38:05 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 --]] |