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