annotate src/lib-sql/driver-mysql.c @ 12676:b8896cfa38cb

lib-sql: Include Dovecot version number check when loading SQL plugins.
author Timo Sirainen <tss@iki.fi>
date Tue, 04 Jan 2011 11:44:07 +0200
parents 666fd046ab7f
children 5a6e44ca5825
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10582
615eef3139c2 Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 10410
diff changeset
1 /* Copyright (c) 2003-2010 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"
4293
539a2dcd92b4 Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents: 4069
diff changeset
4 #include "array.h"
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
5 #include "str.h"
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "sql-api-private.h"
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
8 #ifdef BUILD_MYSQL
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include <stdlib.h>
3420
d1b0dfa6572b Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
10 #include <unistd.h>
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include <time.h>
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <mysql.h>
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <errmsg.h>
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct mysql_db {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 struct sql_db api;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 pool_t pool;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
19 const char *user, *password, *dbname, *host, *unix_socket;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 const char *ssl_cert, *ssl_key, *ssl_ca, *ssl_ca_path, *ssl_cipher;
7081
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
21 const char *option_file, *option_group;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 unsigned int port, client_flags;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
23
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
24 MYSQL *mysql;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
25 unsigned int next_query_connection;
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
26
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
27 unsigned int ssl_set:1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 struct mysql_result {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 struct sql_result api;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
32
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 MYSQL_RES *result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 MYSQL_ROW row;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 MYSQL_FIELD *fields;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 unsigned int fields_count;
11375
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
38
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
39 my_ulonglong affected_rows;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
42 struct mysql_transaction_context {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
43 struct sql_transaction_context ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
44
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
45 pool_t query_pool;
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
46 const char *error;
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
47
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
48 unsigned int failed:1;
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
49 };
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
50
11253
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 10973
diff changeset
51 extern const struct sql_db driver_mysql_db;
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 10973
diff changeset
52 extern const struct sql_result driver_mysql_result;
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 10973
diff changeset
53 extern const struct sql_result driver_mysql_error_result;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
55 static int driver_mysql_connect(struct sql_db *_db)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
57 struct mysql_db *db = (struct mysql_db *)_db;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 const char *unix_socket, *host;
10973
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
59 unsigned long client_flags = db->client_flags;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3741
diff changeset
60 bool failed;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
62 i_assert(db->api.state == SQL_DB_STATE_DISCONNECTED);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
12435
666fd046ab7f mysql: When using multiple hosts, it never connected to more than the first one.
Timo Sirainen <tss@iki.fi>
parents: 12105
diff changeset
64 sql_db_set_state(&db->api, SQL_DB_STATE_CONNECTING);
666fd046ab7f mysql: When using multiple hosts, it never connected to more than the first one.
Timo Sirainen <tss@iki.fi>
parents: 12105
diff changeset
65
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
66 if (*db->host == '/') {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
67 unix_socket = db->host;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 host = NULL;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 } else {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 unix_socket = NULL;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
71 host = db->host;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
7081
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
74 if (db->option_file != NULL) {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
75 mysql_options(db->mysql, MYSQL_READ_DEFAULT_FILE,
7081
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
76 db->option_file);
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
77 }
7080
19bd363bcf5d Added default_file and default_group settings for MySQL.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
78
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
79 mysql_options(db->mysql, MYSQL_READ_DEFAULT_GROUP,
7081
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
80 db->option_group != NULL ? db->option_group : "client");
7080
19bd363bcf5d Added default_file and default_group settings for MySQL.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
81
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
82 if (!db->ssl_set && (db->ssl_ca != NULL || db->ssl_ca_path != NULL)) {
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
83 #ifdef HAVE_MYSQL_SSL
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
84 mysql_ssl_set(db->mysql, db->ssl_key, db->ssl_cert,
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
85 db->ssl_ca, db->ssl_ca_path
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
86 #ifdef HAVE_MYSQL_SSL_CIPHER
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
87 , db->ssl_cipher
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
88 #endif
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
89 );
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
90 db->ssl_set = TRUE;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
91 #else
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
92 i_fatal("mysql: SSL support not compiled in "
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
93 "(remove ssl_ca and ssl_ca_path settings)");
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
94 #endif
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
95 }
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
96
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
97 alarm(SQL_CONNECT_TIMEOUT_SECS);
10973
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
98 #ifdef CLIENT_MULTI_RESULTS
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
99 client_flags |= CLIENT_MULTI_RESULTS;
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
100 #endif
10904
612db456c090 mysql: Enable CLIENT_MULTI_RESULTS
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
101 /* CLIENT_MULTI_RESULTS allows the use of stored procedures */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
102 failed = mysql_real_connect(db->mysql, host, db->user, db->password,
3420
d1b0dfa6572b Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
103 db->dbname, db->port, unix_socket,
10973
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
104 client_flags) == NULL;
3420
d1b0dfa6572b Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
105 alarm(0);
d1b0dfa6572b Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
106 if (failed) {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
107 sql_db_set_state(&db->api, SQL_DB_STATE_DISCONNECTED);
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
108 i_error("mysql: Connect failed to %s (%s): %s - "
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
109 "waiting for %u seconds before retry",
4069
d6c15318e730 If connecting with UNIX socket, print the UNIX socket path instead of
Timo Sirainen <tss@iki.fi>
parents: 3946
diff changeset
110 host != NULL ? host : unix_socket, db->dbname,
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
111 mysql_error(db->mysql), db->api.connect_delay);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
112 return -1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 } else {
4069
d6c15318e730 If connecting with UNIX socket, print the UNIX socket path instead of
Timo Sirainen <tss@iki.fi>
parents: 3946
diff changeset
114 i_info("mysql: Connected to %s%s (%s)",
d6c15318e730 If connecting with UNIX socket, print the UNIX socket path instead of
Timo Sirainen <tss@iki.fi>
parents: 3946
diff changeset
115 host != NULL ? host : unix_socket,
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
116 db->ssl_set ? " using SSL" : "", db->dbname);
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
117
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
118 sql_db_set_state(&db->api, SQL_DB_STATE_IDLE);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
119 return 1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
123 static void driver_mysql_disconnect(struct sql_db *_db ATTR_UNUSED)
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
124 {
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
125 }
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
126
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 static void driver_mysql_parse_connect_string(struct mysql_db *db,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 const char *connect_string)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 const char *const *args, *name, *value;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 const char **field;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 db->ssl_cipher = "HIGH";
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 args = t_strsplit_spaces(connect_string, " ");
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 for (; *args != NULL; args++) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 value = strchr(*args, '=');
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 if (value == NULL) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 i_fatal("mysql: Missing value in connect string: %s",
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 *args);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 name = t_strdup_until(*args, value);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 value++;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 field = NULL;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
146 if (strcmp(name, "host") == 0 ||
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
147 strcmp(name, "hostaddr") == 0)
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
148 field = &db->host;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 else if (strcmp(name, "user") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 field = &db->user;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 else if (strcmp(name, "password") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 field = &db->password;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 else if (strcmp(name, "dbname") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 field = &db->dbname;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 else if (strcmp(name, "port") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 db->port = atoi(value);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 else if (strcmp(name, "client_flags") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 db->client_flags = atoi(value);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 else if (strcmp(name, "ssl_cert") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 field = &db->ssl_cert;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 else if (strcmp(name, "ssl_key") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 field = &db->ssl_key;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 else if (strcmp(name, "ssl_ca") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 field = &db->ssl_ca;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 else if (strcmp(name, "ssl_ca_path") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 field = &db->ssl_ca_path;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 else if (strcmp(name, "ssl_cipher") == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 field = &db->ssl_cipher;
7081
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
169 else if (strcmp(name, "option_file") == 0)
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
170 field = &db->option_file;
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
171 else if (strcmp(name, "option_group") == 0)
ab81d6801423 Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents: 7080
diff changeset
172 field = &db->option_group;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 else
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 i_fatal("mysql: Unknown connect string: %s", name);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 if (field != NULL)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 *field = p_strdup(db->pool, value);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 }
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
179
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
180 if (db->host == NULL)
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
181 i_fatal("mysql: No hosts given in connect string");
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
182
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
183 db->mysql = mysql_init(NULL);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
184 if (db->mysql == NULL)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
185 i_fatal("mysql_init() failed");
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
188 static struct sql_db *driver_mysql_init_v(const char *connect_string)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 struct mysql_db *db;
6476
af14dc005392 Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents: 6474
diff changeset
191 pool_t pool;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192
10315
675e1e198dce Increased initial mysql driver memory pool size.
Timo Sirainen <tss@iki.fi>
parents: 10000
diff changeset
193 pool = pool_alloconly_create("mysql driver", 1024);
6476
af14dc005392 Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents: 6474
diff changeset
194 db = p_new(pool, struct mysql_db, 1);
af14dc005392 Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents: 6474
diff changeset
195 db->pool = pool;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 db->api = driver_mysql_db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
198 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6476
diff changeset
199 driver_mysql_parse_connect_string(db, connect_string);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
200 } T_END;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 return &db->api;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
204 static void driver_mysql_deinit_v(struct sql_db *_db)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 struct mysql_db *db = (struct mysql_db *)_db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
11407
f9e5c73a988b lib-sql: Don't try to reconnect on deinit or intentional disconnect. Fixes a timeout leak.
Timo Sirainen <tss@iki.fi>
parents: 11406
diff changeset
208 _db->no_reconnect = TRUE;
11406
8c521fd311c6 mysql, sqlite: Update db state to disconnected on deinit.
Timo Sirainen <tss@iki.fi>
parents: 11375
diff changeset
209 sql_db_set_state(&db->api, SQL_DB_STATE_DISCONNECTED);
8c521fd311c6 mysql, sqlite: Update db state to disconnected on deinit.
Timo Sirainen <tss@iki.fi>
parents: 11375
diff changeset
210
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
211 mysql_close(db->mysql);
6476
af14dc005392 Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents: 6474
diff changeset
212 array_free(&_db->module_contexts);
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6420
diff changeset
213 pool_unref(&db->pool);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
216 static int driver_mysql_do_query(struct mysql_db *db, const char *query)
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
217 {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
218 if (mysql_query(db->mysql, query) == 0)
12104
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
219 return 0;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
220
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
221 /* failed */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
222 switch (mysql_errno(db->mysql)) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
223 case CR_SERVER_GONE_ERROR:
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
224 case CR_SERVER_LOST:
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
225 sql_db_set_state(&db->api, SQL_DB_STATE_DISCONNECTED);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
226 break;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
227 default:
12104
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
228 break;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
229 }
12104
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
230 return -1;
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
231 }
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
232
4458
3e196acd60b7 sql_escape_string() should return const char *, not char *.
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
233 static const char *
4294
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
234 driver_mysql_escape_string(struct sql_db *_db, const char *string)
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
235 {
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
236 struct mysql_db *db = (struct mysql_db *)_db;
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
237 size_t len = strlen(string);
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
238 char *to;
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
239
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
240 if (_db->state == SQL_DB_STATE_DISCONNECTED) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
241 /* try connecting */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
242 (void)sql_connect(&db->api);
4391
ec5a8b1523a3 Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents: 4384
diff changeset
243 }
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
244
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
245 if (db->mysql == NULL) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
246 /* FIXME: we don't have a valid connection, so fallback
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
247 to using default escaping. the next query will most
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
248 likely fail anyway so it shouldn't matter that much
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
249 what we return here.. Anyway, this API needs
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
250 changing so that the escaping function could already
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
251 fail the query reliably. */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
252 to = t_buffer_get(len * 2 + 1);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
253 len = mysql_escape_string(to, string, len);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
254 t_buffer_alloc(len + 1);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
255 return to;
4391
ec5a8b1523a3 Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents: 4384
diff changeset
256 }
4294
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
257
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
258 to = t_buffer_get(len * 2 + 1);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
259 len = mysql_real_escape_string(db->mysql, to, string, len);
4294
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
260 t_buffer_alloc(len + 1);
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
261 return to;
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
262 }
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
263
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 static void driver_mysql_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
265 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 struct mysql_db *db = (struct mysql_db *)_db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267
12105
90bdbeb132a7 mysql: When sql_exec() fails, log an error.
Timo Sirainen <tss@iki.fi>
parents: 12104
diff changeset
268 if (driver_mysql_do_query(db, query) < 0) {
90bdbeb132a7 mysql: When sql_exec() fails, log an error.
Timo Sirainen <tss@iki.fi>
parents: 12104
diff changeset
269 i_error("mysql: Query '%s' failed: %s",
90bdbeb132a7 mysql: When sql_exec() fails, log an error.
Timo Sirainen <tss@iki.fi>
parents: 12104
diff changeset
270 query, mysql_error(db->mysql));
90bdbeb132a7 mysql: When sql_exec() fails, log an error.
Timo Sirainen <tss@iki.fi>
parents: 12104
diff changeset
271 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
274 static void driver_mysql_query(struct sql_db *db, const char *query,
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 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
276 {
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
277 struct sql_result *result;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
278
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
279 result = sql_query_s(db, query);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
280 result->callback = TRUE;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
281 callback(result, context);
3946
d7051c7a0200 Fixed memory leaks
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
282 result->callback = FALSE;
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8684
diff changeset
283 sql_result_unref(result);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
284 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
285
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
286 static struct sql_result *
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
287 driver_mysql_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
288 {
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 struct mysql_db *db = (struct mysql_db *)_db;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
290 struct mysql_result *result;
10904
612db456c090 mysql: Enable CLIENT_MULTI_RESULTS
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
291 int ret;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
292
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
293 result = i_new(struct mysql_result, 1);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
294 result->api = driver_mysql_result;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295
12104
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
296 if (driver_mysql_do_query(db, query) < 0)
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
297 result->api = driver_mysql_error_result;
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
298 else {
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 /* query ok */
11375
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
300 result->affected_rows = mysql_affected_rows(db->mysql);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
301 result->result = mysql_store_result(db->mysql);
10973
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
302 #ifdef CLIENT_MULTI_RESULTS
10904
612db456c090 mysql: Enable CLIENT_MULTI_RESULTS
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
303 /* Because we've enabled CLIENT_MULTI_RESULTS, we need to read
612db456c090 mysql: Enable CLIENT_MULTI_RESULTS
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
304 (ignore) extra results - there should not be any.
612db456c090 mysql: Enable CLIENT_MULTI_RESULTS
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
305 ret is: -1 = done, >0 = error, 0 = more results. */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
306 while ((ret = mysql_next_result(db->mysql)) == 0) ;
10973
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
307 #else
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
308 ret = -1;
9aa107613324 mysql: Fixed compiling with older libraries that didn't support CLIENT_MULTI_RESULTS.
Timo Sirainen <tss@iki.fi>
parents: 10904
diff changeset
309 #endif
10904
612db456c090 mysql: Enable CLIENT_MULTI_RESULTS
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
310
612db456c090 mysql: Enable CLIENT_MULTI_RESULTS
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
311 if (ret < 0 &&
12104
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
312 (result->result != NULL || mysql_errno(db->mysql) == 0)) {
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
313 /* ok */
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
314 } else {
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
315 /* failed */
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
316 if (result->result != NULL)
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
317 mysql_free_result(result->result);
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
318 result->api = driver_mysql_error_result;
bcb61478f04d mysql: When query fails because connection gets lost, use MySQL failure message instead of generic one.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
319 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321
11283
6599d3d52c76 mysql: Fixed crashing on invalid queries.
Timo Sirainen <tss@iki.fi>
parents: 11261
diff changeset
322 result->api.db = _db;
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8684
diff changeset
323 result->api.refcount = 1;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
324 return &result->api;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
325 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
326
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
327 static void driver_mysql_result_free(struct sql_result *_result)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
328 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
329 struct mysql_result *result = (struct mysql_result *)_result;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
330
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8684
diff changeset
331 i_assert(_result != &sql_not_connected_result);
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8684
diff changeset
332 if (_result->callback)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
333 return;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
334
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
335 if (result->result != NULL)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
336 mysql_free_result(result->result);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
337 i_free(result);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 static int driver_mysql_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
341 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 struct mysql_result *result = (struct mysql_result *)_result;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
343 struct mysql_db *db = (struct mysql_db *)_result->db;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344
4384
a8979ba36c74 Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
345 if (result->result == NULL) {
a8979ba36c74 Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
346 /* no results */
a8979ba36c74 Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
347 return 0;
a8979ba36c74 Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
348 }
a8979ba36c74 Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
349
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 result->row = mysql_fetch_row(result->result);
3052
ced4abfdb2f9 Check if mysql_fetch_row() returns error.
Timo Sirainen <tss@iki.fi>
parents: 2840
diff changeset
351 if (result->row != NULL)
ced4abfdb2f9 Check if mysql_fetch_row() returns error.
Timo Sirainen <tss@iki.fi>
parents: 2840
diff changeset
352 return 1;
ced4abfdb2f9 Check if mysql_fetch_row() returns error.
Timo Sirainen <tss@iki.fi>
parents: 2840
diff changeset
353
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
354 return mysql_errno(db->mysql) != 0 ? -1 : 0;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 static void driver_mysql_result_fetch_fields(struct mysql_result *result)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 if (result->fields != NULL)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 return;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 result->fields_count = mysql_num_fields(result->result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 result->fields = mysql_fetch_fields(result->result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 static unsigned int
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 driver_mysql_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
368 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 struct mysql_result *result = (struct mysql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 driver_mysql_result_fetch_fields(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 return result->fields_count;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 static const char *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 driver_mysql_result_get_field_name(struct sql_result *_result, unsigned int idx)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 struct mysql_result *result = (struct mysql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 driver_mysql_result_fetch_fields(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 i_assert(idx < result->fields_count);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 return result->fields[idx].name;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 static int driver_mysql_result_find_field(struct sql_result *_result,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 const char *field_name)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 struct mysql_result *result = (struct mysql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 unsigned int i;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 driver_mysql_result_fetch_fields(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 for (i = 0; i < result->fields_count; i++) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 if (strcmp(result->fields[i].name, field_name) == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 return i;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 return -1;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 static const char *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 driver_mysql_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
401 unsigned int idx)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 struct mysql_result *result = (struct mysql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 return (const char *)result->row[idx];
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
408 static const unsigned char *
7501
c6e9fd175bdf Added ATTR_UNUSED to function parameters that won't be implemented for v1.1.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
409 driver_mysql_result_get_field_value_binary(struct sql_result *_result ATTR_UNUSED,
c6e9fd175bdf Added ATTR_UNUSED to function parameters that won't be implemented for v1.1.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
410 unsigned int idx ATTR_UNUSED,
c6e9fd175bdf Added ATTR_UNUSED to function parameters that won't be implemented for v1.1.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
411 size_t *size_r ATTR_UNUSED)
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
412 {
7501
c6e9fd175bdf Added ATTR_UNUSED to function parameters that won't be implemented for v1.1.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
413 /* FIXME */
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
414 return NULL;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
415 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
416
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 static const char *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 driver_mysql_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
419 const char *field_name)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 int idx;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 idx = driver_mysql_result_find_field(result, field_name);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 if (idx < 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 return NULL;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 return driver_mysql_result_get_field_value(result, idx);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 static const char *const *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 driver_mysql_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
431 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 struct mysql_result *result = (struct mysql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 return (const char *const *)result->row;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436
3053
1d005cdce6ec Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents: 3052
diff changeset
437 static const char *driver_mysql_result_get_error(struct sql_result *_result)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
439 struct mysql_db *db = (struct mysql_db *)_result->db;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
441 return mysql_error(db->mysql);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
444 static struct sql_transaction_context *
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
445 driver_mysql_transaction_begin(struct sql_db *db)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
446 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
447 struct mysql_transaction_context *ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
448
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
449 ctx = i_new(struct mysql_transaction_context, 1);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
450 ctx->ctx.db = db;
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
451 ctx->query_pool = pool_alloconly_create("mysql transaction", 1024);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
452 return &ctx->ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
453 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
454
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
455 static void
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
456 driver_mysql_transaction_commit(struct sql_transaction_context *ctx,
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
457 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
458 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
459 const char *error;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
460
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
461 if (sql_transaction_commit_s(&ctx, &error) < 0)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
462 callback(error, context);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
463 else
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
464 callback(NULL, context);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
465 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
466
11359
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
467 static int
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
468 transaction_send_query(struct mysql_transaction_context *ctx, const char *query,
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
469 unsigned int *affected_rows_r)
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
470 {
11375
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
471 struct sql_result *_result;
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
472 int ret = 0;
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
473
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
474 if (ctx->failed)
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
475 return -1;
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
476
11375
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
477 _result = sql_query_s(ctx->ctx.db, query);
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
478 if (sql_result_next_row(_result) < 0) {
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
479 ctx->error = sql_result_get_error(_result);
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
480 ctx->failed = TRUE;
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
481 ret = -1;
11359
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
482 } else if (affected_rows_r != NULL) {
11375
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
483 struct mysql_result *result = (struct mysql_result *)_result;
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
484
11375
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
485 i_assert(result->affected_rows != (my_ulonglong)-1);
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
486 *affected_rows_r = result->affected_rows;
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
487 }
11375
0c15a760dab8 lib-sql: Fixed getting number of affected rows with MySQL.
Timo Sirainen <tss@iki.fi>
parents: 11359
diff changeset
488 sql_result_unref(_result);
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
489 return ret;
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
490 }
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
491
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
492 static int
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
493 driver_mysql_transaction_commit_s(struct sql_transaction_context *_ctx,
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
494 const char **error_r)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
495 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
496 struct mysql_transaction_context *ctx =
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
497 (struct mysql_transaction_context *)_ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
498 int ret = 0;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
499
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
500 *error_r = NULL;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
501
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
502 if (_ctx->head != NULL) {
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
503 /* try to use a transaction in any case,
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
504 even if it doesn't work. */
11359
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
505 (void)transaction_send_query(ctx, "BEGIN", NULL);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
506 while (_ctx->head != NULL) {
11359
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
507 if (transaction_send_query(ctx, _ctx->head->query,
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
508 _ctx->head->affected_rows) < 0)
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
509 break;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
510 _ctx->head = _ctx->head->next;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
511 }
11359
1e45b463b93a mysql: Fixed assert-crashing on transaction commits.
Timo Sirainen <tss@iki.fi>
parents: 11283
diff changeset
512 ret = transaction_send_query(ctx, "COMMIT", NULL);
4593
ec2bc538dcad Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
513 *error_r = ctx->error;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
514 }
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
515 sql_transaction_rollback(&_ctx);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
516 return ret;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
517 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
518
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
519 static void
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
520 driver_mysql_transaction_rollback(struct sql_transaction_context *_ctx)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
521 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
522 struct mysql_transaction_context *ctx =
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
523 (struct mysql_transaction_context *)_ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
524
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6420
diff changeset
525 pool_unref(&ctx->query_pool);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
526 i_free(ctx);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
527 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
528
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
529 static void
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
530 driver_mysql_update(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
531 unsigned int *affected_rows)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
532 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
533 struct mysql_transaction_context *ctx =
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
534 (struct mysql_transaction_context *)_ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
535
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
536 sql_transaction_add_query(&ctx->ctx, ctx->query_pool,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
537 query, affected_rows);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
538 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
539
11253
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 10973
diff changeset
540 const struct sql_db driver_mysql_db = {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
541 .name = "mysql",
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
542 .flags = SQL_DB_FLAG_BLOCKING | SQL_DB_FLAG_POOLED,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
543
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10315
diff changeset
544 .v = {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
545 driver_mysql_init_v,
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
546 driver_mysql_deinit_v,
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
547 driver_mysql_connect,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
548 driver_mysql_disconnect,
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
549 driver_mysql_escape_string,
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
550 driver_mysql_exec,
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
551 driver_mysql_query,
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
552 driver_mysql_query_s,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
553
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
554 driver_mysql_transaction_begin,
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
555 driver_mysql_transaction_commit,
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
556 driver_mysql_transaction_commit_s,
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
557 driver_mysql_transaction_rollback,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
558
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
559 driver_mysql_update
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
560 }
2754
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
11253
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 10973
diff changeset
563 const struct sql_result driver_mysql_result = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10315
diff changeset
564 .v = {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
565 driver_mysql_result_free,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
566 driver_mysql_result_next_row,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
567 driver_mysql_result_get_fields_count,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
568 driver_mysql_result_get_field_name,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
569 driver_mysql_result_find_field,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
570 driver_mysql_result_get_field_value,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
571 driver_mysql_result_get_field_value_binary,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
572 driver_mysql_result_find_field_value,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
573 driver_mysql_result_get_values,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
574 driver_mysql_result_get_error
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
575 }
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
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 static int
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
579 driver_mysql_result_error_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
580 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581 return -1;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583
11253
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 10973
diff changeset
584 const struct sql_result driver_mysql_error_result = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10315
diff changeset
585 .v = {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
586 driver_mysql_result_free,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
587 driver_mysql_result_error_next_row,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
588 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
589 driver_mysql_result_get_error
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
590 },
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
591 .failed_try_retry = TRUE
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 };
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
593
12676
b8896cfa38cb lib-sql: Include Dovecot version number check when loading SQL plugins.
Timo Sirainen <tss@iki.fi>
parents: 12435
diff changeset
594 const char *driver_mysql_version = DOVECOT_VERSION;
b8896cfa38cb lib-sql: Include Dovecot version number check when loading SQL plugins.
Timo Sirainen <tss@iki.fi>
parents: 12435
diff changeset
595
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
596 void driver_mysql_init(void);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
597 void driver_mysql_deinit(void);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
598
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
599 void driver_mysql_init(void)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
600 {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
601 sql_driver_register(&driver_mysql_db);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
602 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
603
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
604 void driver_mysql_deinit(void)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
605 {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
606 sql_driver_unregister(&driver_mysql_db);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
607 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
608
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 #endif