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
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 --]]

Impressum / About Us