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

Impressum / About Us