Mercurial > dovecot > core-2.2
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 |
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 | 234 driver_mysql_escape_string(struct sql_db *_db, const char *string) |
235 { | |
236 struct mysql_db *db = (struct mysql_db *)_db; | |
237 size_t len = strlen(string); | |
238 char *to; | |
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 | 257 |
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 | 260 t_buffer_alloc(len + 1); |
261 return to; | |
262 } | |
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 | 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 |