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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
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
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
132 }
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
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 };