dbd/sqlite3/connection.c

changeset 41
e490414a391d
parent 32
03ed0ca09837
child 42
93335fa1f1d0
equal deleted inserted replaced
40:71c4b5dd82bb 41:e490414a391d
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) {
48 lua_pushfstring(L, DBI_ERR_CONNECTION_FAILED, sqlite3_errmsg(conn->sqlite)); 65 lua_pushfstring(L, DBI_ERR_CONNECTION_FAILED, sqlite3_errmsg(conn->sqlite));
49 return 2; 66 return 2;
50 } 67 }
51 68
52 conn->autocommit = 0; 69 conn->autocommit = 0;
53 begin(conn); 70 conn->txn_in_progress = 0;
54 71
55 luaL_getmetatable(L, DBD_SQLITE_CONNECTION); 72 luaL_getmetatable(L, DBD_SQLITE_CONNECTION);
56 lua_setmetatable(L, -2); 73 lua_setmetatable(L, -2);
57 74
58 return 1; 75 return 1;
65 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); 82 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION);
66 int on = lua_toboolean(L, 2); 83 int on = lua_toboolean(L, 2);
67 int err = 1; 84 int err = 1;
68 85
69 if (conn->sqlite) { 86 if (conn->sqlite) {
70 if (on) 87 if (on) {
71 err = rollback(conn); 88 err = rollback(conn);
89 }
90 /*
72 else 91 else
73 err = begin(conn); 92 err = begin(conn);
93 */
74 94
75 conn->autocommit = on; 95 conn->autocommit = on;
76 } 96 }
77 97
78 lua_pushboolean(L, !err); 98 lua_pushboolean(L, !err);
86 static int connection_close(lua_State *L) { 106 static int connection_close(lua_State *L) {
87 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION); 107 connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_SQLITE_CONNECTION);
88 int disconnect = 0; 108 int disconnect = 0;
89 109
90 if (conn->sqlite) { 110 if (conn->sqlite) {
111 rollback(conn);
91 sqlite3_close(conn->sqlite); 112 sqlite3_close(conn->sqlite);
92 disconnect = 1; 113 disconnect = 1;
93 conn->sqlite = NULL; 114 conn->sqlite = NULL;
94 } 115 }
95 116
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 }

mercurial