1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
#!/usr/bin/lua
local _M = {}
-- Driver to module mapping
local name_to_module = {
MySQL = 'dbd.mysql',
PostgreSQL = 'dbd.postgresql',
SQLite3 = 'dbd.sqlite3',
DB2 = 'dbd.db2',
Oracle = 'dbd.oracle',
ODBC = 'dbd.odbc',
DuckDB = 'dbd.duckdb'
}
local string = require('string')
-- Returns a list of available drivers
-- based on run time loading
local function available_drivers()
local available = {}
for driver, modulefile in pairs(name_to_module) do
local m, _ = pcall(require, modulefile)
if m then
table.insert(available, driver)
end
end
-- no drivers available
if #available < 1 then
available = {'(None)'}
end
return available
end
-- High level DB connection function
-- This should be used rather than DBD.{Driver}.New
function _M.Connect(driver, ...)
local modulefile = name_to_module[driver]
if not modulefile then
local available = table.concat(available_drivers(), ',')
error(string.format("Driver '%s' not found. Available drivers are: %s", driver, available))
end
local m, _ = pcall(require, modulefile)
if not m then
-- cannot load the module, we cannot continue
local available = table.concat(available_drivers(), ',')
error(string.format('Cannot load driver %s. Available drivers are: %s', driver, available))
end
return package.loaded[modulefile].New(...)
end
-- Help function to do prepare and execute in
-- a single step
function _M.Do(dbh, sql, ...)
local sth, err = dbh:prepare(sql)
if not sth then
return false, err
end
local ok
ok, err = sth:execute(...)
if not ok then
return false, err
end
return sth:affected()
end
-- List drivers available on this system
function _M.Drivers()
return available_drivers()
end
-- Versioning Information
_M._VERSION = '0.7'
return _M
|