webmcp
diff libraries/mondelefant/mondelefant_atom_connector.lua @ 0:9fdfb27f8e67
Version 1.0.0
author | jbe/bsw |
---|---|
date | Sun Oct 25 12:00:00 2009 +0100 (2009-10-25) |
parents | |
children | 985024b16520 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libraries/mondelefant/mondelefant_atom_connector.lua Sun Oct 25 12:00:00 2009 +0100 1.3 @@ -0,0 +1,189 @@ 1.4 +#!/usr/bin/env lua 1.5 + 1.6 +local _G = _G 1.7 +local _VERSION = _VERSION 1.8 +local assert = assert 1.9 +local collectgarbage = collectgarbage 1.10 +local dofile = dofile 1.11 +local error = error 1.12 +local getfenv = getfenv 1.13 +local getmetatable = getmetatable 1.14 +local ipairs = ipairs 1.15 +local load = load 1.16 +local loadfile = loadfile 1.17 +local loadstring = loadstring 1.18 +local module = module 1.19 +local next = next 1.20 +local pairs = pairs 1.21 +local pcall = pcall 1.22 +local print = print 1.23 +local rawequal = rawequal 1.24 +local rawget = rawget 1.25 +local rawset = rawset 1.26 +local require = require 1.27 +local select = select 1.28 +local setfenv = setfenv 1.29 +local setmetatable = setmetatable 1.30 +local tonumber = tonumber 1.31 +local tostring = tostring 1.32 +local type = type 1.33 +local unpack = unpack 1.34 +local xpcall = xpcall 1.35 + 1.36 +local coroutine = coroutine 1.37 +local debug = debug 1.38 +local io = io 1.39 +local math = math 1.40 +local os = os 1.41 +local package = package 1.42 +local string = string 1.43 + 1.44 +local mondelefant = require("mondelefant") 1.45 +local atom = require("atom") 1.46 + 1.47 +module(...) 1.48 + 1.49 + 1.50 +input_converters = setmetatable({}, { __mode = "k" }) 1.51 + 1.52 +input_converters["boolean"] = function(conn, value) 1.53 + if value then return "TRUE" else return "FALSE" end 1.54 +end 1.55 + 1.56 +input_converters["number"] = function(conn, value) 1.57 + local str = tostring(value) 1.58 + if string.find(str, "^[0-9%.e%-]+$") then 1.59 + return str 1.60 + else 1.61 + return "'NaN'" 1.62 + end 1.63 +end 1.64 + 1.65 +input_converters[atom.fraction] = function(conn, value) 1.66 + if value.invalid then 1.67 + return "'NaN'" 1.68 + else 1.69 + local n, d = tostring(value.numerator), tostring(value.denominator) 1.70 + if string.find(n, "^%-?[0-9]+$") and string.find(d, "^%-?[0-9]+$") then 1.71 + return "(" .. n .. "::numeric / " .. d .. "::numeric)" 1.72 + else 1.73 + return "'NaN'" 1.74 + end 1.75 + end 1.76 +end 1.77 + 1.78 +input_converters[atom.date] = function(conn, value) 1.79 + return conn:quote_string(tostring(value)) .. "::date" 1.80 +end 1.81 + 1.82 +input_converters[atom.timestamp] = function(conn, value) 1.83 + return conn:quote_string(tostring(value)) -- don't define type 1.84 +end 1.85 + 1.86 +input_converters[atom.time] = function(conn, value) 1.87 + return conn:quote_string(tostring(value)) .. "::time" 1.88 +end 1.89 + 1.90 + 1.91 +output_converters = setmetatable({}, { __mode = "k" }) 1.92 + 1.93 +output_converters.int8 = function(str) return atom.integer:load(str) end 1.94 +output_converters.int4 = function(str) return atom.integer:load(str) end 1.95 +output_converters.int2 = function(str) return atom.integer:load(str) end 1.96 + 1.97 +output_converters.numeric = function(str) return atom.number:load(str) end 1.98 +output_converters.float4 = function(str) return atom.number:load(str) end 1.99 +output_converters.float8 = function(str) return atom.number:load(str) end 1.100 + 1.101 +output_converters.bool = function(str) return atom.boolean:load(str) end 1.102 + 1.103 +output_converters.date = function(str) return atom.date:load(str) end 1.104 + 1.105 +local timestamp_loader_func = function(str) 1.106 + local hour, minute, second = string.match( 1.107 + str, 1.108 + "^([0-9]?[0-9]):([0-9][0-9]):([0-9][0-9])" 1.109 + ) 1.110 + if hour then 1.111 + return atom.timestamp{ 1.112 + hour = tonumber(hour), 1.113 + minute = tonumber(minute), 1.114 + second = tonumber(second) 1.115 + } 1.116 + else 1.117 + return atom.timestamp.invalid 1.118 + end 1.119 +end 1.120 +output_converters.timestamp = timestamp_loader_func 1.121 +output_converters.timestamptz = timestamp_loader_func 1.122 + 1.123 +local time_loader_func = function(str) 1.124 + local year, month, day, hour, minute, second = string.match( 1.125 + str, 1.126 + "^([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])" 1.127 + ) 1.128 + if year then 1.129 + return atom.time{ 1.130 + year = tonumber(year), 1.131 + month = tonumber(month), 1.132 + day = tonumber(day), 1.133 + hour = tonumber(hour), 1.134 + minute = tonumber(minute), 1.135 + second = tonumber(second) 1.136 + } 1.137 + else 1.138 + return atom.time.invalid 1.139 + end 1.140 +end 1.141 +output_converters.time = time_loader_func 1.142 +output_converters.timetz = time_loader_func 1.143 + 1.144 +mondelefant.postgresql_connection_prototype.type_mappings = { 1.145 + int8 = atom.integer, 1.146 + int4 = atom.integer, 1.147 + int2 = atom.integer, 1.148 + bool = atom.boolean, 1.149 + date = atom.date, 1.150 + timestamp = atom.timestamp, 1.151 + time = atom.time, 1.152 + text = atom.string, 1.153 + varchar = atom.string, 1.154 +} 1.155 + 1.156 + 1.157 +function mondelefant.postgresql_connection_prototype.input_converter(conn, value, info) 1.158 + if value == nil then 1.159 + return "NULL" 1.160 + else 1.161 + local converter = 1.162 + input_converters[getmetatable(value)] or 1.163 + input_converters[type(value)] 1.164 + if converter then 1.165 + return converter(conn, value) 1.166 + else 1.167 + return conn:quote_string(tostring(value)) 1.168 + end 1.169 + end 1.170 +end 1.171 + 1.172 +function mondelefant.postgresql_connection_prototype.output_converter(conn, value, info) 1.173 + if value == nil then 1.174 + return nil 1.175 + else 1.176 + local converter = output_converters[info.type] 1.177 + if converter then 1.178 + return converter(value) 1.179 + else 1.180 + return value 1.181 + end 1.182 + end 1.183 +end 1.184 + 1.185 + 1.186 +--[[ 1.187 + 1.188 +db = assert(mondelefant.connect{engine='postgresql', dbname='test'}) 1.189 +result = db:query{'SELECT ? + 1', atom.date{ year=1999, month=12, day=31}} 1.190 +print(result[1][1].year) 1.191 + 1.192 +--]]