Fri, 24 Dec 2010 00:34:04 +0000
Make calling autocommit with the same value as set a NOOP to suppress a warning from the DB
1 | 1 | #!/usr/bin/lua |
2 | ||
3 | module('DBI', package.seeall) | |
4 | ||
2 | 5 | -- Driver to module mapping |
1 | 6 | local name_to_module = { |
7 | MySQL = 'dbdmysql', | |
8 | PostgreSQL = 'dbdpostgresql', | |
9 | SQLite3 = 'dbdsqlite3', | |
14 | 10 | DB2 = 'dbddb2', |
17
21c4feaeafe7
Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
14
diff
changeset
|
11 | Oracle = 'dbdoracle', |
1 | 12 | } |
13 | ||
14 | local string = require('string') | |
15 | ||
2 | 16 | -- Returns a list of available drivers |
17 | -- based on run time loading | |
1 | 18 | local function available_drivers() |
19 | local available = {} | |
20 | ||
21 | for driver, modulefile in pairs(name_to_module) do | |
22 | local m, err = pcall(require, modulefile) | |
23 | ||
24 | if m then | |
25 | table.insert(available, driver) | |
26 | end | |
27 | end | |
28 | ||
2 | 29 | -- no drivers available |
1 | 30 | if table.maxn(available) < 1 then |
36 | 31 | available = {'(None)'} |
1 | 32 | end |
33 | ||
36 | 34 | return available |
1 | 35 | end |
36 | ||
2 | 37 | -- High level DB connection function |
38 | -- This should be used rather than DBD.{Driver}.New | |
18 | 39 | function Connect(driver, ...) |
1 | 40 | local modulefile = name_to_module[driver] |
41 | ||
42 | if not modulefile then | |
36 | 43 | local available = table.concat(available_drivers(), ',') |
44 | error(string.format("Driver '%s' not found. Available drivers are: %s", driver, available)) | |
1 | 45 | end |
46 | ||
47 | local m, err = pcall(require, modulefile) | |
48 | ||
49 | if not m then | |
2 | 50 | -- cannot load the module, we cannot continue |
36 | 51 | local available = table.concat(available_drivers(), ',') |
52 | error(string.format('Cannot load driver %s. Available drivers are: %s', driver, available)) | |
1 | 53 | end |
54 | ||
55 | local class_str = string.format('DBD.%s.Connection', driver) | |
56 | ||
57 | local connection_class = package.loaded[class_str] | |
58 | ||
2 | 59 | -- Calls DBD.{Driver}.New(...) |
18 | 60 | return connection_class.New(...) |
1 | 61 | end |
62 | ||
4 | 63 | -- Help function to do prepare and execute in |
64 | -- a single step | |
3 | 65 | function Do(dbh, sql, ...) |
66 | local sth,err = dbh:prepare(sql) | |
67 | ||
68 | if not sth then | |
69 | return false, err | |
70 | end | |
71 | ||
22 | 72 | local ok, err = sth:execute(...) |
73 | ||
74 | if not ok then | |
75 | return false, err | |
76 | end | |
77 | ||
78 | return sth:affected() | |
3 | 79 | end |
36 | 80 | |
81 | -- Lit drivers available on this system | |
82 | function Drivers() | |
83 | return available_drivers() | |
84 | end |