dbd/sqlite3/connection.c

changeset 13
10c8c6f0da14
parent 9
06eb2850703f
child 14
98192b7d4e89
equal deleted inserted replaced
12:014ba3ab3903 13:10c8c6f0da14
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) {
76 } 141 }
77 142
78 lua_pushnil(L); 143 lua_pushnil(L);
79 lua_pushstring(L, DBI_ERR_DB_UNAVAILABLE); 144 lua_pushstring(L, DBI_ERR_DB_UNAVAILABLE);
80 return 2; 145 return 2;
146 }
147
148 /*
149 * success = connection:rollback()
150 */
151 static int connection_rollback(lua_State *L) {
152 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION);
153 int err = 1;
154
155 if (conn->sqlite) {
156 rollback(conn);
157
158 if (!conn->autocommit)
159 err = begin(conn);
160 else
161 err = 1;
162 }
163
164 lua_pushboolean(L, !err);
165 return 1;
81 } 166 }
82 167
83 /* 168 /*
84 * __gc 169 * __gc
85 */ 170 */
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

mercurial