Mercurial > dovecot > core-2.2
annotate src/lib-sql/sql-api.c @ 22514:7d189977dfe3
lib-sql: Add support for prepared SQL statements.
This initial implementation doesn't use prepared statements in drivers, but
simply generates the query string internally.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Tue, 22 Aug 2017 11:37:17 +0300 |
parents | 26e81cfafb1c |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20528
diff
changeset
|
1 /* Copyright (c) 2004-2017 Dovecot authors, see the included COPYING file */ |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
4 #include "array.h" |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
5 #include "ioloop.h" |
22514
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
6 #include "str.h" |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "sql-api-private.h" |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
9 #include <time.h> |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
10 |
22514
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
11 struct default_sql_prepared_statement { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
12 struct sql_prepared_statement prep_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
13 char *query_template; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
14 }; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
15 |
6478
1e07f47e5e1e
Added sql_db_module_register for module_contexts users.
Timo Sirainen <tss@iki.fi>
parents:
6476
diff
changeset
|
16 struct sql_db_module_register sql_db_module_register = { 0 }; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
17 ARRAY_TYPE(sql_drivers) sql_drivers; |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
18 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
19 void sql_drivers_init(void) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
20 { |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
21 i_array_init(&sql_drivers, 8); |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
22 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
23 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
24 void sql_drivers_deinit(void) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
25 { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
26 array_free(&sql_drivers); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
27 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
28 |
11991
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
29 static const struct sql_db *sql_driver_lookup(const char *name) |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
30 { |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
31 const struct sql_db *const *drivers; |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
32 unsigned int i, count; |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
33 |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
34 drivers = array_get(&sql_drivers, &count); |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
35 for (i = 0; i < count; i++) { |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
36 if (strcmp(drivers[i]->name, name) == 0) |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
37 return drivers[i]; |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
38 } |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
39 return NULL; |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
40 } |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
41 |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
42 void sql_driver_register(const struct sql_db *driver) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
43 { |
11991
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
44 if (sql_driver_lookup(driver->name) != NULL) { |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
45 i_fatal("sql_driver_register(%s): Already registered", |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
46 driver->name); |
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
47 } |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
48 array_append(&sql_drivers, &driver, 1); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
49 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
50 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
51 void sql_driver_unregister(const struct sql_db *driver) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
52 { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
53 const struct sql_db *const *drivers; |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
54 unsigned int i, count; |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
55 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
56 drivers = array_get(&sql_drivers, &count); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
57 for (i = 0; i < count; i++) { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
58 if (drivers[i] == driver) { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
59 array_delete(&sql_drivers, i, 1); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
60 break; |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
61 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
62 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3919
diff
changeset
|
63 } |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
64 |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
65 struct sql_db *sql_init(const char *db_driver, const char *connect_string) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
66 { |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
67 const struct sql_db *driver; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
68 struct sql_db *db; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
69 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
70 i_assert(connect_string != NULL); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
71 |
11991
11538925cbbb
lib-sql: Fail if trying to register a duplicate sql driver.
Timo Sirainen <tss@iki.fi>
parents:
11261
diff
changeset
|
72 driver = sql_driver_lookup(db_driver); |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
73 if (driver == NULL) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
74 i_fatal("Unknown database driver '%s'", db_driver); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
75 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
76 if ((driver->flags & SQL_DB_FLAG_POOLED) == 0) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
77 db = driver->v.init(connect_string); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
78 else |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
79 db = driver_sqlpool_init(connect_string, driver); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
80 i_array_init(&db->module_contexts, 5); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
81 return db; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
84 void sql_deinit(struct sql_db **_db) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 { |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
86 struct sql_db *db = *_db; |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
87 |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
88 *_db = NULL; |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
89 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
90 if (db->to_reconnect != NULL) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
91 timeout_remove(&db->to_reconnect); |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
92 db->v.deinit(db); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
3421
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
95 enum sql_db_flags sql_get_flags(struct sql_db *db) |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
96 { |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
97 return db->flags; |
3421
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
98 } |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
99 |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
100 int sql_connect(struct sql_db *db) |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
101 { |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
102 time_t now; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
103 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
104 switch (db->state) { |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
105 case SQL_DB_STATE_DISCONNECTED: |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
106 break; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
107 case SQL_DB_STATE_CONNECTING: |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
108 return 0; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
109 default: |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
110 return 1; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
111 } |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
112 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
113 /* don't try reconnecting more than once a second */ |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
114 now = time(NULL); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
115 if (db->last_connect_try + (time_t)db->connect_delay > now) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
116 return -1; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
117 db->last_connect_try = now; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
118 |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
119 return db->v.connect(db); |
3421
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
120 } |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3163
diff
changeset
|
121 |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
122 void sql_disconnect(struct sql_db *db) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
123 { |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
124 if (db->to_reconnect != NULL) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
125 timeout_remove(&db->to_reconnect); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
126 db->v.disconnect(db); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
127 } |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
128 |
4458
3e196acd60b7
sql_escape_string() should return const char *, not char *.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
129 const char *sql_escape_string(struct sql_db *db, const char *string) |
4294 | 130 { |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
131 return db->v.escape_string(db, string); |
4294 | 132 } |
133 | |
19072
113f4e32cb19
lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
134 const char *sql_escape_blob(struct sql_db *db, |
113f4e32cb19
lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
135 const unsigned char *data, size_t size) |
113f4e32cb19
lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
136 { |
113f4e32cb19
lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
137 return db->v.escape_blob(db, data, size); |
113f4e32cb19
lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
138 } |
113f4e32cb19
lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
139 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 void sql_exec(struct sql_db *db, const char *query) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 { |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
142 db->v.exec(db, query); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
145 #undef sql_query |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 void sql_query(struct sql_db *db, const char *query, |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 sql_query_callback_t *callback, void *context) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 { |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
149 db->v.query(db, query, callback, context); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
152 struct sql_result *sql_query_s(struct sql_db *db, const char *query) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
153 { |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
154 return db->v.query_s(db, query); |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
155 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
156 |
22514
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
157 static struct sql_prepared_statement * |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
158 default_sql_prepared_statement_init(struct sql_db *db, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
159 const char *query_template) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
160 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
161 struct default_sql_prepared_statement *prep_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
162 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
163 prep_stmt = i_new(struct default_sql_prepared_statement, 1); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
164 prep_stmt->prep_stmt.db = db; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
165 prep_stmt->query_template = i_strdup(query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
166 return &prep_stmt->prep_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
167 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
168 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
169 static void |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
170 default_sql_prepared_statement_deinit(struct sql_prepared_statement *_prep_stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
171 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
172 struct default_sql_prepared_statement *prep_stmt = |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
173 (struct default_sql_prepared_statement *)_prep_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
174 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
175 i_free(prep_stmt->query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
176 i_free(prep_stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
177 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
178 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
179 static struct sql_statement * |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
180 default_sql_statement_init_prepared(struct sql_prepared_statement *_stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
181 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
182 struct default_sql_prepared_statement *stmt = |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
183 (struct default_sql_prepared_statement *)_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
184 return sql_statement_init(_stmt->db, stmt->query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
185 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
186 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
187 const char *sql_statement_get_query(struct sql_statement *stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
188 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
189 string_t *query = t_str_new(128); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
190 const char *const *args; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
191 unsigned int i, args_count, arg_pos = 0; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
192 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
193 args = array_get(&stmt->args, &args_count); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
194 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
195 for (i = 0; stmt->query_template[i] != '\0'; i++) { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
196 if (stmt->query_template[i] == '?') { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
197 if (arg_pos >= args_count || |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
198 args[arg_pos] == NULL) { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
199 i_panic("lib-sql: Missing bind for arg #%u in statement: %s", |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
200 arg_pos, stmt->query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
201 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
202 str_append(query, args[arg_pos++]); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
203 } else { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
204 str_append_c(query, stmt->query_template[i]); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
205 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
206 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
207 if (arg_pos != args_count) { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
208 i_panic("lib-sql: Too many bind args (%u) for statement: %s", |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
209 args_count, stmt->query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
210 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
211 return str_c(query); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
212 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
213 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
214 static void |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
215 default_sql_statement_query(struct sql_statement *stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
216 sql_query_callback_t *callback, void *context) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
217 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
218 sql_query(stmt->db, sql_statement_get_query(stmt), |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
219 callback, context); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
220 pool_unref(&stmt->pool); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
221 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
222 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
223 static struct sql_result * |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
224 default_sql_statement_query_s(struct sql_statement *stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
225 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
226 struct sql_result *result = |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
227 sql_query_s(stmt->db, sql_statement_get_query(stmt)); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
228 pool_unref(&stmt->pool); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
229 return result; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
230 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
231 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
232 static void default_sql_update_stmt(struct sql_transaction_context *ctx, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
233 struct sql_statement *stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
234 unsigned int *affected_rows) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
235 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
236 ctx->db->v.update(ctx, sql_statement_get_query(stmt), |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
237 affected_rows); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
238 pool_unref(&stmt->pool); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
239 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
240 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
241 struct sql_prepared_statement * |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
242 sql_prepared_statement_init(struct sql_db *db, const char *query_template) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
243 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
244 if (db->v.prepared_statement_init != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
245 return db->v.prepared_statement_init(db, query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
246 else |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
247 return default_sql_prepared_statement_init(db, query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
248 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
249 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
250 void sql_prepared_statement_deinit(struct sql_prepared_statement **_prep_stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
251 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
252 struct sql_prepared_statement *prep_stmt = *_prep_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
253 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
254 *_prep_stmt = NULL; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
255 if (prep_stmt->db->v.prepared_statement_deinit != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
256 prep_stmt->db->v.prepared_statement_deinit(prep_stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
257 else |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
258 default_sql_prepared_statement_deinit(prep_stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
259 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
260 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
261 static void |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
262 sql_statement_init_fields(struct sql_statement *stmt, struct sql_db *db) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
263 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
264 stmt->db = db; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
265 p_array_init(&stmt->args, stmt->pool, 8); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
266 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
267 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
268 struct sql_statement * |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
269 sql_statement_init(struct sql_db *db, const char *query_template) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
270 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
271 struct sql_statement *stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
272 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
273 if (db->v.statement_init != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
274 stmt = db->v.statement_init(db, query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
275 else { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
276 pool_t pool = pool_alloconly_create("sql statement", 1024); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
277 stmt = p_new(pool, struct sql_statement, 1); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
278 stmt->pool = pool; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
279 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
280 stmt->query_template = p_strdup(stmt->pool, query_template); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
281 sql_statement_init_fields(stmt, db); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
282 return stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
283 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
284 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
285 struct sql_statement * |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
286 sql_statement_init_prepared(struct sql_prepared_statement *prep_stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
287 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
288 struct sql_statement *stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
289 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
290 if (prep_stmt->db->v.statement_init_prepared == NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
291 return default_sql_statement_init_prepared(prep_stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
292 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
293 stmt = prep_stmt->db->v.statement_init_prepared(prep_stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
294 sql_statement_init_fields(stmt, prep_stmt->db); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
295 return stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
296 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
297 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
298 void sql_statement_abort(struct sql_statement **_stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
299 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
300 struct sql_statement *stmt = *_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
301 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
302 *_stmt = NULL; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
303 if (stmt->db->v.statement_abort != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
304 stmt->db->v.statement_abort(stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
305 pool_unref(&stmt->pool); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
306 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
307 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
308 void sql_statement_set_timestamp(struct sql_statement *stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
309 const struct timespec *ts) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
310 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
311 if (stmt->db->v.statement_set_timestamp != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
312 stmt->db->v.statement_set_timestamp(stmt, ts); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
313 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
314 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
315 void sql_statement_bind_str(struct sql_statement *stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
316 unsigned int column_idx, const char *value) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
317 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
318 const char *escaped_value = |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
319 p_strdup_printf(stmt->pool, "'%s'", |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
320 sql_escape_string(stmt->db, value)); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
321 array_idx_set(&stmt->args, column_idx, &escaped_value); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
322 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
323 if (stmt->db->v.statement_bind_str != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
324 stmt->db->v.statement_bind_str(stmt, column_idx, value); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
325 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
326 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
327 void sql_statement_bind_binary(struct sql_statement *stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
328 unsigned int column_idx, const void *value, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
329 size_t value_size) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
330 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
331 const char *value_str = |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
332 p_strdup_printf(stmt->pool, "%s", |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
333 sql_escape_blob(stmt->db, value, value_size)); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
334 array_idx_set(&stmt->args, column_idx, &value_str); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
335 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
336 if (stmt->db->v.statement_bind_binary != NULL) { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
337 stmt->db->v.statement_bind_binary(stmt, column_idx, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
338 value, value_size); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
339 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
340 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
341 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
342 void sql_statement_bind_int64(struct sql_statement *stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
343 unsigned int column_idx, int64_t value) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
344 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
345 const char *value_str = p_strdup_printf(stmt->pool, "%lld", |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
346 (long long)value); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
347 array_idx_set(&stmt->args, column_idx, &value_str); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
348 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
349 if (stmt->db->v.statement_bind_int64 != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
350 stmt->db->v.statement_bind_int64(stmt, column_idx, value); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
351 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
352 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
353 #undef sql_statement_query |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
354 void sql_statement_query(struct sql_statement **_stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
355 sql_query_callback_t *callback, void *context) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
356 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
357 struct sql_statement *stmt = *_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
358 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
359 *_stmt = NULL; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
360 if (stmt->db->v.statement_query != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
361 stmt->db->v.statement_query(stmt, callback, context); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
362 else |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
363 default_sql_statement_query(stmt, callback, context); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
364 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
365 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
366 struct sql_result *sql_statement_query_s(struct sql_statement **_stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
367 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
368 struct sql_statement *stmt = *_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
369 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
370 *_stmt = NULL; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
371 if (stmt->db->v.statement_query_s != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
372 return stmt->db->v.statement_query_s(stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
373 else |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
374 return default_sql_statement_query_s(stmt); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
375 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
376 |
9270
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
377 void sql_result_ref(struct sql_result *result) |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
378 { |
9270
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
379 result->refcount++; |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
380 } |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
381 |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
382 void sql_result_unref(struct sql_result *result) |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
383 { |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
384 i_assert(result->refcount > 0); |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
385 if (--result->refcount > 0) |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
386 return; |
f9ebd72a73e8
SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
387 |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
388 i_free(result->map); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
389 result->v.free(result); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
390 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
391 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
392 static const struct sql_field_def * |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
393 sql_field_def_find(const struct sql_field_def *fields, const char *name) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
394 { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
395 unsigned int i; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
396 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
397 for (i = 0; fields[i].name != NULL; i++) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
398 if (strcasecmp(fields[i].name, name) == 0) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
399 return &fields[i]; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
400 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
401 return NULL; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
402 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
403 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
404 static void |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
405 sql_result_build_map(struct sql_result *result, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
406 const struct sql_field_def *fields, size_t dest_size) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
407 { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
408 const struct sql_field_def *def; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
409 const char *name; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
410 unsigned int i, count, field_size = 0; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
411 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
412 count = sql_result_get_fields_count(result); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
413 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
414 result->map_size = count; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
415 result->map = i_new(struct sql_field_map, result->map_size); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
416 for (i = 0; i < count; i++) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
417 name = sql_result_get_field_name(result, i); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
418 def = sql_field_def_find(fields, name); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
419 if (def != NULL) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
420 result->map[i].type = def->type; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
421 result->map[i].offset = def->offset; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
422 switch (def->type) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
423 case SQL_TYPE_STR: |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
424 field_size = sizeof(const char *); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
425 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
426 case SQL_TYPE_UINT: |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
427 field_size = sizeof(unsigned int); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
428 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
429 case SQL_TYPE_ULLONG: |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
430 field_size = sizeof(unsigned long long); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
431 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
432 case SQL_TYPE_BOOL: |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
433 field_size = sizeof(bool); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
434 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
435 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
436 i_assert(def->offset + field_size <= dest_size); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
437 } else { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
438 result->map[i].offset = (size_t)-1; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
439 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
440 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
441 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
442 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
443 void sql_result_setup_fetch(struct sql_result *result, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
444 const struct sql_field_def *fields, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
445 void *dest, size_t dest_size) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
446 { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
447 if (result->map == NULL) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
448 sql_result_build_map(result, fields, dest_size); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
449 result->fetch_dest = dest; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
450 result->fetch_dest_size = dest_size; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
451 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
452 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
453 static void sql_result_fetch(struct sql_result *result) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
454 { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
455 unsigned int i, count; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
456 const char *value; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
457 void *ptr; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
458 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
459 memset(result->fetch_dest, 0, result->fetch_dest_size); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
460 count = result->map_size; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
461 for (i = 0; i < count; i++) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
462 if (result->map[i].offset == (size_t)-1) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
463 continue; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
464 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
465 value = sql_result_get_field_value(result, i); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
466 ptr = STRUCT_MEMBER_P(result->fetch_dest, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
467 result->map[i].offset); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
468 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
469 switch (result->map[i].type) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
470 case SQL_TYPE_STR: { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
471 *((const char **)ptr) = value; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
472 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
473 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
474 case SQL_TYPE_UINT: { |
11086
260e190306b0
Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
475 if (value != NULL && |
260e190306b0
Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
476 str_to_uint(value, (unsigned int *)ptr) < 0) |
260e190306b0
Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
477 i_error("sql: Value not uint: %s", value); |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
478 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
479 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
480 case SQL_TYPE_ULLONG: { |
11086
260e190306b0
Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
481 if (value != NULL && |
260e190306b0
Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
482 str_to_ullong(value, (unsigned long long *)ptr) < 0) |
260e190306b0
Started using str_to_*() functions instead of libc's ones.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
483 i_error("sql: Value not ullong: %s", value); |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
484 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
485 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
486 case SQL_TYPE_BOOL: { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
487 if (value != NULL && (*value == 't' || *value == '1')) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
488 *((bool *)ptr) = TRUE; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
489 break; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
490 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
491 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
492 } |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
493 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
494 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 int sql_result_next_row(struct sql_result *result) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
496 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
497 int ret; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
498 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
499 if ((ret = result->v.next_row(result)) <= 0) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
500 return ret; |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
501 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
502 if (result->fetch_dest != NULL) |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
503 sql_result_fetch(result); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
504 return 1; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
505 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
506 |
22354
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
507 #undef sql_result_more |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
508 void sql_result_more(struct sql_result **result, |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
509 sql_query_callback_t *callback, void *context) |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
510 { |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
511 i_assert((*result)->v.more != NULL); |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
512 |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
513 (*result)->v.more(result, TRUE, callback, context); |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
514 } |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
515 |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
516 static void |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
517 sql_result_more_sync_callback(struct sql_result *result, void *context) |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
518 { |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
519 struct sql_result **dest_result = context; |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
520 |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
521 *dest_result = result; |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
522 } |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
523 |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
524 void sql_result_more_s(struct sql_result **result) |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
525 { |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
526 i_assert((*result)->v.more != NULL); |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
527 |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
528 (*result)->v.more(result, FALSE, sql_result_more_sync_callback, result); |
22367
26e81cfafb1c
lib-sql: Add assert to sql_result_more_s()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22354
diff
changeset
|
529 /* the callback must have been called */ |
26e81cfafb1c
lib-sql: Add assert to sql_result_more_s()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22354
diff
changeset
|
530 i_assert(*result != NULL); |
22354
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
531 } |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
532 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 unsigned int sql_result_get_fields_count(struct sql_result *result) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
535 return result->v.get_fields_count(result); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 const char *sql_result_get_field_name(struct sql_result *result, |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 unsigned int idx) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
540 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
541 return result->v.get_field_name(result, idx); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
542 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
544 int sql_result_find_field(struct sql_result *result, const char *field_name) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
546 return result->v.find_field(result, field_name); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
547 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 const char *sql_result_get_field_value(struct sql_result *result, |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 unsigned int idx) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
552 return result->v.get_field_value(result, idx); |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
553 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
554 |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
555 const unsigned char * |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
556 sql_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:
4903
diff
changeset
|
557 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:
4903
diff
changeset
|
558 { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
559 return result->v.get_field_value_binary(result, idx, size_r); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 const char *sql_result_find_field_value(struct sql_result *result, |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 const char *field_name) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
565 return result->v.find_field_value(result, field_name); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 const char *const *sql_result_get_values(struct sql_result *result) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
570 return result->v.get_values(result); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 const char *sql_result_get_error(struct sql_result *result) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
574 { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
575 return result->v.get_error(result); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
577 |
20526
9565305a8512
lib-sql: Added sql_result_get_error_type().
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
578 enum sql_result_error_type sql_result_get_error_type(struct sql_result *result) |
9565305a8512
lib-sql: Added sql_result_get_error_type().
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
579 { |
9565305a8512
lib-sql: Added sql_result_get_error_type().
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
580 return result->error_type; |
9565305a8512
lib-sql: Added sql_result_get_error_type().
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
581 } |
9565305a8512
lib-sql: Added sql_result_get_error_type().
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
582 |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
583 static void |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
584 sql_result_not_connected_free(struct sql_result *result ATTR_UNUSED) |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
585 { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
586 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
587 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 static int |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
589 sql_result_not_connected_next_row(struct sql_result *result ATTR_UNUSED) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
591 return -1; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
593 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
594 static const char * |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
595 sql_result_not_connected_get_error(struct sql_result *result ATTR_UNUSED) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 { |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
597 return SQL_ERRSTR_NOT_CONNECTED; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
599 |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
600 struct sql_transaction_context *sql_transaction_begin(struct sql_db *db) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
601 { |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
602 return db->v.transaction_begin(db); |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
603 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
604 |
20528
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
605 struct sql_commit1_wrap_ctx { |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
606 sql_commit_callback_t *callback; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
607 void *context; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
608 }; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
609 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
610 static void sql_commit1_wrap(const struct sql_commit_result *result, |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
611 void *context) |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
612 { |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
613 struct sql_commit1_wrap_ctx *ctx = context; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
614 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
615 ctx->callback(result->error, ctx->context); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
616 i_free(ctx); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
617 } |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
618 |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
619 #undef sql_transaction_commit |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
620 void sql_transaction_commit(struct sql_transaction_context **_ctx, |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
621 sql_commit_callback_t *callback, void *context) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
622 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
623 struct sql_transaction_context *ctx = *_ctx; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
624 |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
625 *_ctx = NULL; |
20528
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
626 if (ctx->db->v.transaction_commit != NULL) |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
627 ctx->db->v.transaction_commit(ctx, callback, context); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
628 else { |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
629 struct sql_commit1_wrap_ctx *wrap; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
630 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
631 wrap = i_new(struct sql_commit1_wrap_ctx, 1); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
632 wrap->callback = callback; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
633 wrap->context = context; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
634 ctx->db->v.transaction_commit2(ctx, sql_commit1_wrap, wrap); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
635 } |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
636 } |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
637 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
638 struct sql_commit2_wrap_ctx { |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
639 sql_commit2_callback_t *callback; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
640 void *context; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
641 }; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
642 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
643 static void sql_commit2_wrap(const char *error, void *context) |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
644 { |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
645 struct sql_commit2_wrap_ctx *ctx = context; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
646 struct sql_commit_result result = { .error = error }; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
647 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
648 ctx->callback(&result, ctx->context); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
649 i_free(ctx); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
650 } |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
651 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
652 #undef sql_transaction_commit2 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
653 void sql_transaction_commit2(struct sql_transaction_context **_ctx, |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
654 sql_commit2_callback_t *callback, void *context) |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
655 { |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
656 struct sql_transaction_context *ctx = *_ctx; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
657 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
658 *_ctx = NULL; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
659 if (ctx->db->v.transaction_commit2 != NULL) |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
660 ctx->db->v.transaction_commit2(ctx, callback, context); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
661 else { |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
662 struct sql_commit2_wrap_ctx *wrap; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
663 |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
664 wrap = i_new(struct sql_commit2_wrap_ctx, 1); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
665 wrap->callback = callback; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
666 wrap->context = context; |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
667 ctx->db->v.transaction_commit(ctx, sql_commit2_wrap, wrap); |
b885fee56a82
lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20526
diff
changeset
|
668 } |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
669 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
670 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
671 int sql_transaction_commit_s(struct sql_transaction_context **_ctx, |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
672 const char **error_r) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
673 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
674 struct sql_transaction_context *ctx = *_ctx; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
675 |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
676 *_ctx = NULL; |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
677 return ctx->db->v.transaction_commit_s(ctx, error_r); |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
678 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
679 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
680 void sql_transaction_rollback(struct sql_transaction_context **_ctx) |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
681 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
682 struct sql_transaction_context *ctx = *_ctx; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
683 |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3736
diff
changeset
|
684 *_ctx = NULL; |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
685 ctx->db->v.transaction_rollback(ctx); |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
686 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
687 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
688 void sql_update(struct sql_transaction_context *ctx, const char *query) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
689 { |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
690 ctx->db->v.update(ctx, query, NULL); |
9888
551c273f4844
lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents:
9270
diff
changeset
|
691 } |
551c273f4844
lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents:
9270
diff
changeset
|
692 |
22514
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
693 void sql_update_stmt(struct sql_transaction_context *ctx, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
694 struct sql_statement **_stmt) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
695 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
696 struct sql_statement *stmt = *_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
697 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
698 *_stmt = NULL; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
699 if (ctx->db->v.update_stmt != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
700 ctx->db->v.update_stmt(ctx, stmt, NULL); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
701 else |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
702 default_sql_update_stmt(ctx, stmt, NULL); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
703 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
704 |
9888
551c273f4844
lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents:
9270
diff
changeset
|
705 void sql_update_get_rows(struct sql_transaction_context *ctx, const char *query, |
551c273f4844
lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents:
9270
diff
changeset
|
706 unsigned int *affected_rows) |
551c273f4844
lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents:
9270
diff
changeset
|
707 { |
551c273f4844
lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents:
9270
diff
changeset
|
708 ctx->db->v.update(ctx, query, affected_rows); |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
709 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
710 |
22514
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
711 void sql_update_stmt_get_rows(struct sql_transaction_context *ctx, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
712 struct sql_statement **_stmt, |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
713 unsigned int *affected_rows) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
714 { |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
715 struct sql_statement *stmt = *_stmt; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
716 |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
717 *_stmt = NULL; |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
718 if (ctx->db->v.update_stmt != NULL) |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
719 ctx->db->v.update_stmt(ctx, stmt, affected_rows); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
720 else |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
721 default_sql_update_stmt(ctx, stmt, affected_rows); |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
722 } |
7d189977dfe3
lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22367
diff
changeset
|
723 |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
724 void sql_db_set_state(struct sql_db *db, enum sql_db_state state) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
725 { |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
726 enum sql_db_state old_state = db->state; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
727 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
728 if (db->state == state) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
729 return; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
730 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
731 db->state = state; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
732 if (db->state_change_callback != NULL) { |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
733 db->state_change_callback(db, old_state, |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
734 db->state_change_context); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
735 } |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
736 } |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
737 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
738 void sql_transaction_add_query(struct sql_transaction_context *ctx, pool_t pool, |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
739 const char *query, unsigned int *affected_rows) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
740 { |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
741 struct sql_transaction_query *tquery; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
742 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
743 tquery = p_new(pool, struct sql_transaction_query, 1); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
744 tquery->trans = ctx; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
745 tquery->query = p_strdup(pool, query); |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
746 tquery->affected_rows = affected_rows; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
747 |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
748 if (ctx->head == NULL) |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
749 ctx->head = tquery; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
750 else |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
751 ctx->tail->next = tquery; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
752 ctx->tail = tquery; |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
753 } |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
754 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
755 struct sql_result sql_not_connected_result = { |
10410
b757dab45756
Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents:
9888
diff
changeset
|
756 .v = { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
757 sql_result_not_connected_free, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
758 sql_result_not_connected_next_row, |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
759 NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
22354
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
760 sql_result_not_connected_get_error, |
b9a2a6135419
lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
761 NULL, |
11261
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
762 }, |
1c8cc349ef55
lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents:
11086
diff
changeset
|
763 .failed_try_retry = TRUE |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
764 }; |