Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-sql/driver-sqlite.c @ 6420:a8b515e1a26f HEAD
Removed _ prefixes from function names.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 16 Sep 2007 13:25:23 +0300 |
parents | 6a64e64fa3a3 |
children | 7cad076906eb |
rev | line source |
---|---|
3923 | 1 /* Copyright (C) 2006 Jakob Hirsch */ |
2 | |
3 #include "lib.h" | |
4 #include "str.h" | |
5 #include "sql-api-private.h" | |
6 | |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
7 #ifdef BUILD_SQLITE |
3923 | 8 #include <sqlite3.h> |
9 | |
10 /* retry time if db is busy (in ms) */ | |
11 const int sqlite_busy_timeout = 1000; | |
12 | |
13 struct sqlite_db { | |
14 struct sql_db api; | |
15 | |
16 pool_t pool; | |
17 const char *dbfile; | |
18 sqlite3 *sqlite; | |
19 unsigned int connected:1; | |
20 int rc; | |
21 }; | |
22 | |
23 struct sqlite_result { | |
24 struct sql_result api; | |
25 sqlite3_stmt *stmt; | |
26 unsigned int cols; | |
27 const char **row; | |
28 }; | |
29 | |
30 struct sqlite_transaction_context { | |
31 struct sql_transaction_context ctx; | |
32 unsigned int failed:1; | |
33 }; | |
34 | |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
35 extern struct sql_db driver_sqlite_db; |
3923 | 36 extern struct sql_result driver_sqlite_result; |
37 extern struct sql_result driver_sqlite_error_result; | |
38 | |
39 static int driver_sqlite_connect(struct sql_db *_db) | |
40 { | |
41 struct sqlite_db *db = (struct sqlite_db *)_db; | |
42 | |
43 if (db->connected) | |
44 return 1; | |
45 | |
46 db->rc = sqlite3_open(db->dbfile, &db->sqlite); | |
47 | |
48 if (db->rc == SQLITE_OK) { | |
49 db->connected = TRUE; | |
50 sqlite3_busy_timeout(db->sqlite, sqlite_busy_timeout); | |
51 return 1; | |
52 } else { | |
53 i_error("sqlite: open(%s) failed: %s", db->dbfile, | |
54 sqlite3_errmsg(db->sqlite)); | |
55 sqlite3_close(db->sqlite); | |
56 return -1; | |
57 } | |
58 } | |
59 | |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
60 static struct sql_db *driver_sqlite_init_v(const char *connect_string) |
3923 | 61 { |
62 struct sqlite_db *db; | |
63 pool_t pool; | |
64 | |
65 i_assert(connect_string != NULL); | |
66 | |
67 pool = pool_alloconly_create("sqlite driver", 512); | |
68 db = p_new(pool, struct sqlite_db, 1); | |
69 db->pool = pool; | |
70 db->api = driver_sqlite_db; | |
71 db->dbfile = p_strdup(db->pool, connect_string); | |
72 db->connected = FALSE; | |
73 | |
74 return &db->api; | |
75 } | |
76 | |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
77 static void driver_sqlite_deinit_v(struct sql_db *_db) |
3923 | 78 { |
79 struct sqlite_db *db = (struct sqlite_db *)_db; | |
80 | |
81 sqlite3_close(db->sqlite); | |
82 pool_unref(db->pool); | |
83 } | |
84 | |
85 static enum sql_db_flags | |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
86 driver_sqlite_get_flags(struct sql_db *db ATTR_UNUSED) |
3923 | 87 { |
88 return SQL_DB_FLAG_BLOCKING; | |
89 } | |
90 | |
4458
3e196acd60b7
sql_escape_string() should return const char *, not char *.
Timo Sirainen <tss@iki.fi>
parents:
4444
diff
changeset
|
91 static const char * |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
92 driver_sqlite_escape_string(struct sql_db *_db ATTR_UNUSED, |
4458
3e196acd60b7
sql_escape_string() should return const char *, not char *.
Timo Sirainen <tss@iki.fi>
parents:
4444
diff
changeset
|
93 const char *string) |
4294 | 94 { |
4444
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
95 const char *p; |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
96 char *dest, *destbegin; |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
97 |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
98 /* find the first ' */ |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
99 for (p = string; *p != '\''; p++) { |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
100 if (*p == '\0') |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
101 return t_strdup_noconst(string); |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
102 } |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
103 |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
104 /* @UNSAFE: escape ' with '' */ |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
105 dest = destbegin = t_buffer_get((p - string) + strlen(string) * 2 + 1); |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
106 |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
107 memcpy(dest, string, p - string); |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
108 dest += p - string; |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
109 |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
110 for (; *p != '\0'; p++) { |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
111 *dest++ = *p; |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
112 if (*p == '\'') |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
113 *dest++ = *p; |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
114 } |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
115 *dest++ = '\0'; |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
116 t_buffer_alloc(dest - destbegin); |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
117 |
d0d04db8e7a6
Escape ' with '' instead of with \'.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
118 return destbegin; |
4294 | 119 } |
120 | |
3923 | 121 static void driver_sqlite_exec(struct sql_db *_db, const char *query) |
122 { | |
123 struct sqlite_db *db = (struct sqlite_db *)_db; | |
124 | |
125 db->rc = sqlite3_exec(db->sqlite, query, NULL, 0, NULL); | |
126 if (db->rc != SQLITE_OK) { | |
127 i_error("sqlite: exec(%s) failed: %s (%d)", | |
128 query, sqlite3_errmsg(db->sqlite), db->rc); | |
129 } | |
130 } | |
131 | |
132 static void driver_sqlite_query(struct sql_db *db, const char *query, | |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
133 sql_query_callback_t *callback, void *context) |
3923 | 134 { |
135 struct sql_result *result; | |
136 | |
137 result = sql_query_s(db, query); | |
138 result->callback = TRUE; | |
139 callback(result, context); | |
3946 | 140 result->callback = FALSE; |
3923 | 141 sql_result_free(result); |
142 } | |
143 | |
144 static struct sql_result * | |
145 driver_sqlite_query_s(struct sql_db *_db, const char *query) | |
146 { | |
147 struct sqlite_db *db = (struct sqlite_db *)_db; | |
148 struct sqlite_result *result; | |
149 int rc; | |
150 | |
151 result = i_new(struct sqlite_result, 1); | |
152 | |
153 rc = sqlite3_prepare(db->sqlite, query, -1, &result->stmt, NULL); | |
154 if (rc == SQLITE_OK) { | |
155 result->api = driver_sqlite_result; | |
156 result->cols = sqlite3_column_count(result->stmt); | |
157 result->row = i_new(const char *, result->cols); | |
158 } else { | |
159 result->api = driver_sqlite_error_result; | |
160 result->stmt = NULL; | |
161 result->cols = 0; | |
162 } | |
163 result->api.db = _db; | |
164 | |
165 return &result->api; | |
166 } | |
167 | |
168 static void driver_sqlite_result_free(struct sql_result *_result) | |
169 { | |
170 struct sqlite_result *result = (struct sqlite_result *)_result; | |
171 struct sqlite_db *db = (struct sqlite_db *) result->api.db; | |
172 int rc; | |
173 | |
3947 | 174 if (_result->callback) |
175 return; | |
176 | |
3923 | 177 if (result->stmt != NULL) { |
178 if ((rc = sqlite3_finalize(result->stmt)) != SQLITE_OK) { | |
179 i_warning("sqlite: finalize failed: %s (%d)", | |
180 sqlite3_errmsg(db->sqlite), rc); | |
181 } | |
182 i_free(result->row); | |
183 } | |
184 i_free(result); | |
185 } | |
186 | |
187 static int driver_sqlite_result_next_row(struct sql_result *_result) | |
188 { | |
189 struct sqlite_result *result = (struct sqlite_result *)_result; | |
190 | |
191 switch (sqlite3_step(result->stmt)) { | |
192 case SQLITE_ROW: | |
193 return 1; | |
194 case SQLITE_DONE: | |
195 return 0; | |
196 default: | |
197 return -1; | |
198 } | |
199 } | |
200 | |
201 static unsigned int | |
202 driver_sqlite_result_get_fields_count(struct sql_result *_result) | |
203 { | |
204 struct sqlite_result *result = (struct sqlite_result *)_result; | |
205 | |
206 return result->cols; | |
207 } | |
208 | |
209 static const char * | |
210 driver_sqlite_result_get_field_name(struct sql_result *_result, | |
211 unsigned int idx) | |
212 { | |
213 struct sqlite_result *result = (struct sqlite_result *)_result; | |
214 | |
215 return sqlite3_column_name(result->stmt, idx); | |
216 } | |
217 | |
218 static int driver_sqlite_result_find_field(struct sql_result *_result, | |
219 const char *field_name) | |
220 { | |
221 struct sqlite_result *result = (struct sqlite_result *)_result; | |
222 unsigned int i; | |
223 | |
224 for (i = 0; i < result->cols; ++i) { | |
225 const char *col = sqlite3_column_name(result->stmt, i); | |
226 | |
227 if (strcmp(col, field_name) == 0) | |
228 return i; | |
229 } | |
230 | |
231 return -1; | |
232 } | |
233 | |
234 static const char * | |
235 driver_sqlite_result_get_field_value(struct sql_result *_result, | |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
236 unsigned int idx) |
3923 | 237 { |
238 struct sqlite_result *result = (struct sqlite_result *)_result; | |
239 | |
3936
8e827b05047b
Compiler warning fix. Patch by Marcus Rueckert
Timo Sirainen <tss@iki.fi>
parents:
3923
diff
changeset
|
240 return (const char*)sqlite3_column_text(result->stmt, idx); |
3923 | 241 } |
242 | |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
243 static const unsigned char * |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
244 driver_sqlite_result_get_field_value_binary(struct sql_result *_result, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
245 unsigned int idx, size_t *size_r) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
246 { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
247 struct sqlite_result *result = (struct sqlite_result *)_result; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
248 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
249 *size_r = sqlite3_column_bytes(result->stmt, idx); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
250 return sqlite3_column_blob(result->stmt, idx); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
251 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
252 |
3923 | 253 static const char * |
254 driver_sqlite_result_find_field_value(struct sql_result *result, | |
255 const char *field_name) | |
256 { | |
257 int idx; | |
258 | |
259 idx = driver_sqlite_result_find_field(result, field_name); | |
260 if (idx < 0) | |
261 return NULL; | |
262 return driver_sqlite_result_get_field_value(result, idx); | |
263 } | |
264 | |
265 static const char *const * | |
266 driver_sqlite_result_get_values(struct sql_result *_result) | |
267 { | |
268 struct sqlite_result *result = (struct sqlite_result *)_result; | |
269 unsigned int i; | |
270 | |
271 for (i = 0; i < result->cols; ++i) { | |
272 result->row[i] = | |
273 driver_sqlite_result_get_field_value(_result, i); | |
274 } | |
275 | |
276 return (const char *const *)result->row; | |
277 } | |
278 | |
279 static const char *driver_sqlite_result_get_error(struct sql_result *_result) | |
280 { | |
281 struct sqlite_result *result = (struct sqlite_result *)_result; | |
282 struct sqlite_db *db = (struct sqlite_db *)result->api.db; | |
283 | |
284 return sqlite3_errmsg(db->sqlite); | |
285 } | |
286 | |
287 static struct sql_transaction_context * | |
288 driver_sqlite_transaction_begin(struct sql_db *_db) | |
289 { | |
290 struct sqlite_transaction_context *ctx; | |
291 struct sqlite_db *db = (struct sqlite_db *)_db; | |
292 | |
293 ctx = i_new(struct sqlite_transaction_context, 1); | |
294 ctx->ctx.db = _db; | |
295 | |
296 sql_exec(_db, "BEGIN TRANSACTION"); | |
297 if (db->rc != SQLITE_OK) | |
298 ctx->failed = TRUE; | |
299 | |
300 return &ctx->ctx; | |
301 } | |
302 | |
303 static void | |
304 driver_sqlite_transaction_rollback(struct sql_transaction_context *_ctx) | |
305 { | |
306 struct sqlite_transaction_context *ctx = | |
307 (struct sqlite_transaction_context *)_ctx; | |
308 | |
309 sql_exec(_ctx->db, "ROLLBACK"); | |
310 i_free(ctx); | |
311 } | |
312 | |
313 static void | |
314 driver_sqlite_transaction_commit(struct sql_transaction_context *_ctx, | |
315 sql_commit_callback_t *callback, void *context) | |
316 { | |
317 struct sqlite_transaction_context *ctx = | |
318 (struct sqlite_transaction_context *)_ctx; | |
319 struct sqlite_db *db = (struct sqlite_db *)ctx->ctx.db; | |
320 const char *errmsg; | |
321 | |
322 if (!ctx->failed) { | |
323 sql_exec(_ctx->db, "COMMIT"); | |
324 if (db->rc != SQLITE_OK) | |
325 ctx->failed = TRUE; | |
326 } | |
327 | |
328 if (ctx->failed) { | |
329 errmsg = sqlite3_errmsg(db->sqlite); | |
330 callback(errmsg, context); | |
331 /* also does i_free(ctx) */ | |
332 driver_sqlite_transaction_rollback(_ctx); | |
333 } else { | |
334 callback(NULL, context); | |
335 i_free(ctx); | |
336 } | |
337 } | |
338 | |
339 static int | |
340 driver_sqlite_transaction_commit_s(struct sql_transaction_context *_ctx, | |
341 const char **error_r) | |
342 { | |
343 struct sqlite_transaction_context *ctx = | |
344 (struct sqlite_transaction_context *)_ctx; | |
345 struct sqlite_db *db = (struct sqlite_db *) ctx->ctx.db; | |
346 | |
347 if (ctx->failed) { | |
348 /* also does i_free(ctx) */ | |
349 driver_sqlite_transaction_rollback(_ctx); | |
350 return -1; | |
351 } | |
352 | |
353 sql_exec(_ctx->db, "COMMIT"); | |
354 *error_r = sqlite3_errmsg(db->sqlite); | |
355 i_free(ctx); | |
356 return 0; | |
357 } | |
358 | |
359 static void | |
360 driver_sqlite_update(struct sql_transaction_context *_ctx, const char *query) | |
361 { | |
362 struct sqlite_transaction_context *ctx = | |
363 (struct sqlite_transaction_context *)_ctx; | |
364 struct sqlite_db *db = (struct sqlite_db *)ctx->ctx.db; | |
365 | |
366 if (ctx->failed) | |
367 return; | |
368 | |
369 sql_exec(_ctx->db, query); | |
370 if (db->rc != SQLITE_OK) | |
371 ctx->failed = TRUE; | |
372 } | |
373 | |
374 struct sql_db driver_sqlite_db = { | |
375 "sqlite", | |
376 | |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
377 driver_sqlite_init_v, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
378 driver_sqlite_deinit_v, |
3923 | 379 driver_sqlite_get_flags, |
380 driver_sqlite_connect, | |
4294 | 381 driver_sqlite_escape_string, |
3923 | 382 driver_sqlite_exec, |
383 driver_sqlite_query, | |
384 driver_sqlite_query_s, | |
385 | |
386 driver_sqlite_transaction_begin, | |
387 driver_sqlite_transaction_commit, | |
388 driver_sqlite_transaction_commit_s, | |
389 driver_sqlite_transaction_rollback, | |
390 driver_sqlite_update | |
391 }; | |
392 | |
393 struct sql_result driver_sqlite_result = { | |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
394 MEMBER(v) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
395 driver_sqlite_result_free, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
396 driver_sqlite_result_next_row, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
397 driver_sqlite_result_get_fields_count, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
398 driver_sqlite_result_get_field_name, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
399 driver_sqlite_result_find_field, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
400 driver_sqlite_result_get_field_value, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
401 driver_sqlite_result_get_field_value_binary, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
402 driver_sqlite_result_find_field_value, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
403 driver_sqlite_result_get_values, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
404 driver_sqlite_result_get_error |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
405 } |
3923 | 406 }; |
407 | |
408 static int | |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
409 driver_sqlite_result_error_next_row(struct sql_result *result ATTR_UNUSED) |
3923 | 410 { |
411 return -1; | |
412 } | |
413 | |
414 struct sql_result driver_sqlite_error_result = { | |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
415 MEMBER(v) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
416 driver_sqlite_result_free, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
417 driver_sqlite_result_error_next_row, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
418 NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
419 driver_sqlite_result_get_error |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
420 } |
3923 | 421 }; |
422 | |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
423 void driver_sqlite_init(void); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
424 void driver_sqlite_deinit(void); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
425 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
426 void driver_sqlite_init(void) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
427 { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
428 sql_driver_register(&driver_sqlite_db); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
429 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
430 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
431 void driver_sqlite_deinit(void) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
432 { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
433 sql_driver_unregister(&driver_sqlite_db); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
434 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3936
diff
changeset
|
435 |
3923 | 436 #endif |