1 #include "dbd_sqlite3.h" |
1 #include "dbd_sqlite3.h" |
2 |
2 |
3 int dbd_sqlite3_statement_create(lua_State *L, connection_t *conn, const char *sql_query); |
3 int dbd_sqlite3_statement_create(lua_State *L, connection_t *conn, const char *sql_query); |
|
4 |
|
5 static int run(connection_t *conn, const char *command) { |
|
6 int res = sqlite3_exec(conn->sqlite, command, NULL, NULL, NULL); |
|
7 |
|
8 return res != SQLITE_OK; |
|
9 } |
|
10 |
|
11 static int commit(connection_t *conn) { |
|
12 return run(conn, "COMMIT"); |
|
13 } |
|
14 |
|
15 |
|
16 static int begin(connection_t *conn) { |
|
17 return run(conn, "BEGIN"); |
|
18 } |
|
19 |
|
20 |
|
21 static int rollback(connection_t *conn) { |
|
22 return run(conn, "ROLLBACK"); |
|
23 } |
|
24 |
4 |
25 |
5 /* |
26 /* |
6 * connection,err = DBD.SQLite3.New(dbfile) |
27 * connection,err = DBD.SQLite3.New(dbfile) |
7 */ |
28 */ |
8 static int connection_new(lua_State *L) { |
29 static int connection_new(lua_State *L) { |
24 lua_pushnil(L); |
45 lua_pushnil(L); |
25 lua_pushfstring(L, DBI_ERR_CONNECTION_FAILED, sqlite3_errmsg(conn->sqlite)); |
46 lua_pushfstring(L, DBI_ERR_CONNECTION_FAILED, sqlite3_errmsg(conn->sqlite)); |
26 return 2; |
47 return 2; |
27 } |
48 } |
28 |
49 |
|
50 conn->autocommit = 0; |
|
51 begin(conn); |
|
52 |
29 luaL_getmetatable(L, DBD_SQLITE_CONNECTION); |
53 luaL_getmetatable(L, DBD_SQLITE_CONNECTION); |
30 lua_setmetatable(L, -2); |
54 lua_setmetatable(L, -2); |
31 |
55 |
32 return 1; |
56 return 1; |
33 } |
57 } |
|
58 |
|
59 /* |
|
60 * success = connection:autocommit(on) |
|
61 */ |
|
62 static int connection_autocommit(lua_State *L) { |
|
63 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
64 int on = lua_toboolean(L, 2); |
|
65 int err = 1; |
|
66 |
|
67 if (conn->sqlite) { |
|
68 if (on) |
|
69 err = rollback(conn); |
|
70 else |
|
71 err = begin(conn); |
|
72 |
|
73 conn->autocommit = on; |
|
74 } |
|
75 |
|
76 lua_pushboolean(L, !err); |
|
77 return 1; |
|
78 } |
|
79 |
34 |
80 |
35 /* |
81 /* |
36 * success = connection:close() |
82 * success = connection:close() |
37 */ |
83 */ |
38 static int connection_close(lua_State *L) { |
84 static int connection_close(lua_State *L) { |
47 |
93 |
48 lua_pushboolean(L, disconnect); |
94 lua_pushboolean(L, disconnect); |
49 return 1; |
95 return 1; |
50 } |
96 } |
51 |
97 |
|
98 /* |
|
99 * success = connection:commit() |
|
100 */ |
|
101 static int connection_commit(lua_State *L) { |
|
102 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
103 int err = 1; |
|
104 |
|
105 if (conn->sqlite) { |
|
106 commit(conn); |
|
107 |
|
108 if (!conn->autocommit) |
|
109 err = begin(conn); |
|
110 else |
|
111 err = 1; |
|
112 } |
|
113 |
|
114 lua_pushboolean(L, !err); |
|
115 return 1; |
|
116 } |
52 |
117 |
53 /* |
118 /* |
54 * ok = connection:ping() |
119 * ok = connection:ping() |
55 */ |
120 */ |
56 static int connection_ping(lua_State *L) { |
121 static int connection_ping(lua_State *L) { |
93 int dbd_sqlite3_connection(lua_State *L) { |
178 int dbd_sqlite3_connection(lua_State *L) { |
94 /* |
179 /* |
95 * instance methods |
180 * instance methods |
96 */ |
181 */ |
97 static const luaL_Reg connection_methods[] = { |
182 static const luaL_Reg connection_methods[] = { |
|
183 {"autocommit", connection_autocommit}, |
98 {"close", connection_close}, |
184 {"close", connection_close}, |
|
185 {"commit", connection_commit}, |
99 {"ping", connection_ping}, |
186 {"ping", connection_ping}, |
100 {"prepare", connection_prepare}, |
187 {"prepare", connection_prepare}, |
|
188 {"rollback", connection_rollback}, |
101 {NULL, NULL} |
189 {NULL, NULL} |
102 }; |
190 }; |
103 |
191 |
104 /* |
192 /* |
105 * class methods |
193 * class methods |