-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathcmysql.lua
More file actions
104 lines (79 loc) · 1.96 KB
/
Copy pathcmysql.lua
File metadata and controls
104 lines (79 loc) · 1.96 KB
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
--DEPRECATED! See oopmysql.lua
ErrorNoHalt("[CMYSQL] Deprecated, use oopmysql.lua")
include "promise.lua"
require "gluamysql"
local env = getfenv(0)
mysql.prepare_cache = setmetatable({}, {__mode = "k", __index = function(self, k)
local r = {}
self[k] = r
return r
end})
local function handle_returns(success, ...)
if (not success) then
return nil, ...
end
return ...
end
local function handle_resume(co, success, err)
if (not success) then
pwarnf("error: %s\n%s", err, debug.traceback(co))
end
end
local function wait_promise(promise)
local co = coroutine.running()
promise
:next(function(...)
handle_resume(co, coroutine.resume(co, true, ...))
end)
:catch(function(...)
handle_resume(co, coroutine.resume(co, false, ...))
print "error?"
print(promise.trace)
end)
return handle_returns(coroutine.yield())
end
-- database library
function env.mysql_init(...)
return wait_promise(mysql.connect(...))
end
function env.mysql_query(db, query)
return wait_promise(db:query(query))
end
function env.mysql_autocommit(db, b)
return wait_promise(db:autocommit(b))
end
function env.mysql_commit(db)
return wait_promise(db:commit())
end
function env.mysql_rollback(db)
return wait_promise(db:rollback())
end
-- statement library
function env.mysql_stmt_prepare(db, query)
local cache = mysql.prepare_cache[db][query]
if (cache) then
return cache
end
local stmt, err = wait_promise(db:prepare(query))
if (stmt) then
mysql.prepare_cache[db][query] = stmt
end
return stmt, err
end
function env.mysql_stmt_execute(stmt, ...)
return wait_promise(stmt:execute(...))
end
function env.mysql_stmt_run(db, query, ...)
local stmt, err = mysql_stmt_prepare(db, query)
if (not stmt) then
return false, err
end
return wait_promise(stmt:execute(...))
end
-- entry point
function cmysql(func)
handle_resume(nil, coroutine.resume(coroutine.create(func)))
end
function env.mysql_cmysql()
assert(coroutine.running() ~= nil, "not running in coroutine")
end