File: DBI.lua

package info (click to toggle)
lua-dbi 0.7.5-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 448 kB
  • sloc: ansic: 3,946; sql: 291; makefile: 129
file content (88 lines) | stat: -rw-r--r-- 1,876 bytes parent folder | download | duplicates (3)
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