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/bsw@0
|
103 local hour, minute, second = string.match(
|
jbe/bsw@0
|
104 str,
|
jbe/bsw@0
|
105 "^([0-9]?[0-9]):([0-9][0-9]):([0-9][0-9])"
|
jbe/bsw@0
|
106 )
|
jbe/bsw@0
|
107 if hour then
|
jbe/bsw@0
|
108 return atom.timestamp{
|
jbe/bsw@0
|
109 hour = tonumber(hour),
|
jbe/bsw@0
|
110 minute = tonumber(minute),
|
jbe/bsw@0
|
111 second = tonumber(second)
|
jbe/bsw@0
|
112 }
|
jbe/bsw@0
|
113 else
|
jbe/bsw@0
|
114 return atom.timestamp.invalid
|
jbe/bsw@0
|
115 end
|
jbe/bsw@0
|
116 end
|
jbe/bsw@0
|
117 output_converters.timestamp = timestamp_loader_func
|
jbe/bsw@0
|
118 output_converters.timestamptz = timestamp_loader_func
|
jbe/bsw@0
|
119
|
jbe/bsw@0
|
120 local time_loader_func = function(str)
|
jbe/bsw@0
|
121 local year, month, day, hour, minute, second = string.match(
|
jbe/bsw@0
|
122 str,
|
jbe/bsw@0
|
123 "^([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
|
124 )
|
jbe/bsw@0
|
125 if year then
|
jbe/bsw@0
|
126 return atom.time{
|
jbe/bsw@0
|
127 year = tonumber(year),
|
jbe/bsw@0
|
128 month = tonumber(month),
|
jbe/bsw@0
|
129 day = tonumber(day),
|
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 --]]
|