7 |
7 |
8 return res != SQLITE_OK; |
8 return res != SQLITE_OK; |
9 } |
9 } |
10 |
10 |
11 static int commit(connection_t *conn) { |
11 static int commit(connection_t *conn) { |
12 return run(conn, "COMMIT"); |
12 conn->txn_in_progress = 0; |
|
13 return run(conn, "COMMIT TRANSACTION"); |
13 } |
14 } |
14 |
15 |
15 |
16 |
16 static int begin(connection_t *conn) { |
17 static int begin(connection_t *conn) { |
17 return run(conn, "BEGIN"); |
18 int err = 0; |
18 } |
19 |
19 |
20 if (conn->txn_in_progress) { |
|
21 err = 0; |
|
22 } else { |
|
23 conn->txn_in_progress = 1; |
|
24 err = run(conn, "BEGIN TRANSACTION"); |
|
25 } |
|
26 |
|
27 return err; |
|
28 } |
20 |
29 |
21 static int rollback(connection_t *conn) { |
30 static int rollback(connection_t *conn) { |
22 return run(conn, "ROLLBACK"); |
31 conn->txn_in_progress = 0; |
23 } |
32 return run(conn, "ROLLBACK TRANSACTION"); |
24 |
33 } |
|
34 |
|
35 int try_begin_transaction(connection_t *conn) { |
|
36 if (conn->autocommit) { |
|
37 return 1; |
|
38 } |
|
39 |
|
40 return begin(conn) == 0; |
|
41 } |
25 |
42 |
26 /* |
43 /* |
27 * connection,err = DBD.SQLite3.New(dbfile) |
44 * connection,err = DBD.SQLite3.New(dbfile) |
28 */ |
45 */ |
29 static int connection_new(lua_State *L) { |
46 static int connection_new(lua_State *L) { |
103 static int connection_commit(lua_State *L) { |
124 static int connection_commit(lua_State *L) { |
104 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
125 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
105 int err = 1; |
126 int err = 1; |
106 |
127 |
107 if (conn->sqlite) { |
128 if (conn->sqlite) { |
108 commit(conn); |
129 err = commit(conn); |
109 |
130 } |
|
131 |
|
132 lua_pushboolean(L, !err); |
|
133 return 1; |
|
134 } |
|
135 |
|
136 /* |
|
137 * ok = connection:ping() |
|
138 */ |
|
139 static int connection_ping(lua_State *L) { |
|
140 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
141 int ok = 0; |
|
142 |
|
143 if (conn->sqlite) { |
|
144 ok = 1; |
|
145 } |
|
146 |
|
147 lua_pushboolean(L, ok); |
|
148 return 1; |
|
149 } |
|
150 |
|
151 /* |
|
152 * statement,err = connection:prepare(sql_str) |
|
153 */ |
|
154 static int connection_prepare(lua_State *L) { |
|
155 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
156 |
|
157 if (conn->sqlite) { |
|
158 return dbd_sqlite3_statement_create(L, conn, luaL_checkstring(L, 2)); |
|
159 } |
|
160 |
|
161 lua_pushnil(L); |
|
162 lua_pushstring(L, DBI_ERR_DB_UNAVAILABLE); |
|
163 return 2; |
|
164 } |
|
165 |
|
166 /* |
|
167 * quoted = connection:quote(str) |
|
168 */ |
|
169 static int connection_quote(lua_State *L) { |
|
170 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
171 size_t len; |
|
172 const char *from = luaL_checklstring(L, 2, &len); |
|
173 char *to; |
|
174 |
|
175 if (!conn->sqlite) { |
|
176 luaL_error(L, DBI_ERR_DB_UNAVAILABLE); |
|
177 } |
|
178 |
|
179 to = sqlite3_mprintf("%q", from); |
|
180 |
|
181 lua_pushstring(L, to); |
|
182 sqlite3_free(to); |
|
183 |
|
184 return 1; |
|
185 } |
|
186 |
|
187 /* |
|
188 * success = connection:rollback() |
|
189 */ |
|
190 static int connection_rollback(lua_State *L) { |
|
191 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
192 int err = 1; |
|
193 |
|
194 if (conn->sqlite) { |
|
195 err =rollback(conn); |
|
196 |
|
197 /* |
110 if (!conn->autocommit) |
198 if (!conn->autocommit) |
111 err = begin(conn); |
199 err = begin(conn); |
112 else |
200 else |
113 err = 1; |
201 err = 1; |
114 } |
202 */ |
115 |
|
116 lua_pushboolean(L, !err); |
|
117 return 1; |
|
118 } |
|
119 |
|
120 /* |
|
121 * ok = connection:ping() |
|
122 */ |
|
123 static int connection_ping(lua_State *L) { |
|
124 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
125 int ok = 0; |
|
126 |
|
127 if (conn->sqlite) { |
|
128 ok = 1; |
|
129 } |
|
130 |
|
131 lua_pushboolean(L, ok); |
|
132 return 1; |
|
133 } |
|
134 |
|
135 /* |
|
136 * statement,err = connection:prepare(sql_str) |
|
137 */ |
|
138 static int connection_prepare(lua_State *L) { |
|
139 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
140 |
|
141 if (conn->sqlite) { |
|
142 return dbd_sqlite3_statement_create(L, conn, luaL_checkstring(L, 2)); |
|
143 } |
|
144 |
|
145 lua_pushnil(L); |
|
146 lua_pushstring(L, DBI_ERR_DB_UNAVAILABLE); |
|
147 return 2; |
|
148 } |
|
149 |
|
150 /* |
|
151 * quoted = connection:quote(str) |
|
152 */ |
|
153 static int connection_quote(lua_State *L) { |
|
154 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
155 size_t len; |
|
156 const char *from = luaL_checklstring(L, 2, &len); |
|
157 char *to; |
|
158 |
|
159 if (!conn->sqlite) { |
|
160 luaL_error(L, DBI_ERR_DB_UNAVAILABLE); |
|
161 } |
|
162 |
|
163 to = sqlite3_mprintf("%q", from); |
|
164 |
|
165 lua_pushstring(L, to); |
|
166 sqlite3_free(to); |
|
167 |
|
168 return 1; |
|
169 } |
|
170 |
|
171 /* |
|
172 * success = connection:rollback() |
|
173 */ |
|
174 static int connection_rollback(lua_State *L) { |
|
175 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); |
|
176 int err = 1; |
|
177 |
|
178 if (conn->sqlite) { |
|
179 rollback(conn); |
|
180 |
|
181 if (!conn->autocommit) |
|
182 err = begin(conn); |
|
183 else |
|
184 err = 1; |
|
185 } |
203 } |
186 |
204 |
187 lua_pushboolean(L, !err); |
205 lua_pushboolean(L, !err); |
188 return 1; |
206 return 1; |
189 } |
207 } |