Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-sql/driver-mysql.c @ 9191:b340ecb24469 HEAD
Fix VPATH build of RQUOTA support.
Some rpcgen derive #include "..." paths from the infile argument.
This will be off for VPATH builds, as the generated rquota_xdr.c
code will look in $(srcdir), but we'll generate the rquota.h file in
$(builddir). Play safe and copy rquota.x to $(builddir) first.
This fixes the build on openSUSE 11.1.
author | Matthias Andree <matthias.andree@gmx.de> |
---|---|
date | Tue, 07 Jul 2009 21:01:36 +0200 |
parents | ad35aae691ce |
children | 4530228c8993 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7501
diff
changeset
|
1 /* Copyright (c) 2003-2009 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 |
3420
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
15 /* Abort connect() if it can't connect within this time. */ |
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
16 #define MYSQL_CONNECT_FAILURE_TIMEOUT 10 |
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
17 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
18 /* Minimum delay between reconnecting to same server */ |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
19 #define CONNECT_MIN_DELAY 1 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
20 /* Maximum time to avoiding reconnecting to same server */ |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
21 #define CONNECT_MAX_DELAY (60*30) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
22 /* If no servers are connected but a query is requested, try reconnecting to |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
23 next server which has been disconnected longer than this (with a single |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
24 server setup this is really the "max delay" and the CONNECT_MAX_DELAY |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
25 is never used). */ |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
26 #define CONNECT_RESET_DELAY 15 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
27 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct mysql_db { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct sql_db api; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 pool_t pool; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
32 const char *user, *password, *dbname, *unix_socket; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 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
|
34 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
|
35 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
|
36 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4391
diff
changeset
|
37 ARRAY_DEFINE(connections, struct mysql_connection); |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
38 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
|
39 }; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
40 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
41 struct mysql_connection { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
42 struct mysql_db *db; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
43 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 MYSQL *mysql; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
45 const char *host; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
46 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
47 unsigned int connect_delay; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
48 unsigned int connect_failure_count; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 time_t last_connect; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 unsigned int connected:1; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
52 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
|
53 }; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 struct mysql_result { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 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
|
57 struct mysql_connection *conn; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
58 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 MYSQL_RES *result; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 MYSQL_ROW row; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 MYSQL_FIELD *fields; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 unsigned int fields_count; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 }; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
66 struct mysql_transaction_context { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
67 struct sql_transaction_context ctx; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
68 |
4593
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
69 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
|
70 struct mysql_query_list *head, *tail; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
71 |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
72 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
|
73 |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
74 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
|
75 }; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
76 |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
77 struct mysql_query_list { |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
78 struct mysql_query_list *next; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
79 const char *query; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
80 }; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
81 |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
82 extern struct sql_db driver_mysql_db; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 extern struct sql_result driver_mysql_result; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 extern struct sql_result driver_mysql_error_result; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
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
|
86 static bool driver_mysql_connect(struct mysql_connection *conn) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 { |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
88 struct mysql_db *db = conn->db; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 const char *unix_socket, *host; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 time_t now; |
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
|
91 bool failed; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
93 if (conn->connected) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 return TRUE; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 /* don't try reconnecting more than once a second */ |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 now = time(NULL); |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
98 if (conn->last_connect + (time_t)conn->connect_delay > now) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 return FALSE; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
100 conn->last_connect = now; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
102 if (*conn->host == '/') { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
103 unix_socket = conn->host; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 host = NULL; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } else { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 unix_socket = NULL; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
107 host = conn->host; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
7081
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
110 if (db->option_file != NULL) { |
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
111 mysql_options(conn->mysql, MYSQL_READ_DEFAULT_FILE, |
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
112 db->option_file); |
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
113 } |
7080
19bd363bcf5d
Added default_file and default_group settings for MySQL.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
114 |
7081
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
115 mysql_options(conn->mysql, MYSQL_READ_DEFAULT_GROUP, |
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
116 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
|
117 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
118 if (!conn->ssl_set && (db->ssl_ca != NULL || db->ssl_ca_path != NULL)) { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
119 #ifdef HAVE_MYSQL_SSL |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
120 mysql_ssl_set(conn->mysql, db->ssl_key, db->ssl_cert, |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
121 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
|
122 #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
|
123 , db->ssl_cipher |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
124 #endif |
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 conn->ssl_set = TRUE; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
127 #else |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
128 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
|
129 "(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
|
130 #endif |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
131 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
132 |
3420
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
133 alarm(MYSQL_CONNECT_FAILURE_TIMEOUT); |
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
134 failed = mysql_real_connect(conn->mysql, host, db->user, db->password, |
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
135 db->dbname, db->port, unix_socket, |
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
136 db->client_flags) == NULL; |
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
137 alarm(0); |
d1b0dfa6572b
Make MySQL connect abort in 10 seconds if it can't connect.
Timo Sirainen <tss@iki.fi>
parents:
3294
diff
changeset
|
138 if (failed) { |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
139 if (conn->connect_failure_count > 0) { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
140 /* increase delay between reconnections to this |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
141 server */ |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
142 conn->connect_delay *= 5; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
143 if (conn->connect_delay > CONNECT_MAX_DELAY) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
144 conn->connect_delay = CONNECT_MAX_DELAY; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
145 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
146 conn->connect_failure_count++; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
147 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
148 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
|
149 "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
|
150 host != NULL ? host : unix_socket, db->dbname, |
d6c15318e730
If connecting with UNIX socket, print the UNIX socket path instead of
Timo Sirainen <tss@iki.fi>
parents:
3946
diff
changeset
|
151 mysql_error(conn->mysql), conn->connect_delay); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 return FALSE; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 } else { |
4069
d6c15318e730
If connecting with UNIX socket, print the UNIX socket path instead of
Timo Sirainen <tss@iki.fi>
parents:
3946
diff
changeset
|
154 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
|
155 host != NULL ? host : unix_socket, |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
156 conn->ssl_set ? " using SSL" : "", db->dbname); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
157 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
158 conn->connect_failure_count = 0; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
159 conn->connect_delay = CONNECT_MIN_DELAY; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
160 conn->connected = TRUE; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 return TRUE; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 |
3421
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3420
diff
changeset
|
165 static int driver_mysql_connect_all(struct sql_db *_db) |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
166 { |
3421
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3420
diff
changeset
|
167 struct mysql_db *db = (struct mysql_db *)_db; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
168 struct mysql_connection *conn; |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
169 unsigned int i, count; |
3421
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3420
diff
changeset
|
170 int ret = -1; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
171 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4391
diff
changeset
|
172 conn = array_get_modifiable(&db->connections, &count); |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
173 for (i = 0; i < count; i++) { |
3421
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3420
diff
changeset
|
174 if (driver_mysql_connect(&conn[i])) |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3420
diff
changeset
|
175 ret = 1; |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3420
diff
changeset
|
176 } |
c624ffa9e6f0
Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents:
3420
diff
changeset
|
177 return ret; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
178 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
179 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
180 static void driver_mysql_connection_add(struct mysql_db *db, const char *host) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
181 { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
182 struct mysql_connection *conn; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
183 |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
184 conn = array_append_space(&db->connections); |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
185 conn->db = db; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
186 conn->host = p_strdup(db->pool, host); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
187 conn->mysql = mysql_init(NULL); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
188 if (conn->mysql == NULL) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
189 i_fatal("mysql_init() failed"); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
190 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
191 conn->connect_delay = CONNECT_MIN_DELAY; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
192 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
193 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
194 static void driver_mysql_connection_free(struct mysql_connection *conn) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
195 { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
196 mysql_close(conn->mysql); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
197 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
198 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 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
|
200 const char *connect_string) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 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
|
203 const char **field; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 db->ssl_cipher = "HIGH"; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 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
|
208 for (; *args != NULL; args++) { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 value = strchr(*args, '='); |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 if (value == NULL) { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 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
|
212 *args); |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 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
|
215 value++; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 field = NULL; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
218 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
|
219 strcmp(name, "hostaddr") == 0) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
220 driver_mysql_connection_add(db, value); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 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
|
222 field = &db->user; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 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
|
224 field = &db->password; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 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
|
226 field = &db->dbname; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 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
|
228 db->port = atoi(value); |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 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
|
230 db->client_flags = atoi(value); |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 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
|
232 field = &db->ssl_cert; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 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
|
234 field = &db->ssl_key; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 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
|
236 field = &db->ssl_ca; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 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
|
238 field = &db->ssl_ca_path; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 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
|
240 field = &db->ssl_cipher; |
7081
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
241 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
|
242 field = &db->option_file; |
ab81d6801423
Renamed default_file/group to option_file/group.
Timo Sirainen <tss@iki.fi>
parents:
7080
diff
changeset
|
243 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
|
244 field = &db->option_group; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 else |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 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
|
247 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 if (field != NULL) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 *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
|
250 } |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
251 |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
252 if (array_count(&db->connections) == 0) |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
253 i_fatal("mysql: No hosts given in connect string"); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
256 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
|
257 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 struct mysql_db *db; |
6476
af14dc005392
Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents:
6474
diff
changeset
|
259 pool_t pool; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 |
6476
af14dc005392
Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents:
6474
diff
changeset
|
261 pool = pool_alloconly_create("mysql driver", 512); |
af14dc005392
Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents:
6474
diff
changeset
|
262 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
|
263 db->pool = pool; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 db->api = driver_mysql_db; |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
265 p_array_init(&db->connections, db->pool, 6); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 |
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
|
267 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6476
diff
changeset
|
268 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
|
269 } T_END; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 return &db->api; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
273 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
|
274 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 struct mysql_db *db = (struct mysql_db *)_db; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
276 struct mysql_connection *conn; |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
277 unsigned int i, count; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4391
diff
changeset
|
279 conn = array_get_modifiable(&db->connections, &count); |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
280 for (i = 0; i < count; i++) |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
281 (void)driver_mysql_connection_free(&conn[i]); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
282 |
6476
af14dc005392
Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents:
6474
diff
changeset
|
283 array_free(&_db->module_contexts); |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6420
diff
changeset
|
284 pool_unref(&db->pool); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 |
3162
5d6787582410
Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents:
3055
diff
changeset
|
287 static enum sql_db_flags |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
288 driver_mysql_get_flags(struct sql_db *db ATTR_UNUSED) |
3162
5d6787582410
Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents:
3055
diff
changeset
|
289 { |
5d6787582410
Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents:
3055
diff
changeset
|
290 return SQL_DB_FLAG_BLOCKING; |
5d6787582410
Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents:
3055
diff
changeset
|
291 } |
5d6787582410
Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents:
3055
diff
changeset
|
292 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
293 static int driver_mysql_connection_do_query(struct mysql_connection *conn, |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
294 const char *query) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 int i; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 for (i = 0; i < 2; i++) { |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
299 if (!driver_mysql_connect(conn)) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 return 0; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
302 if (mysql_query(conn->mysql, query) == 0) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 return 1; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 /* failed */ |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
306 switch (mysql_errno(conn->mysql)) { |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 case CR_SERVER_GONE_ERROR: |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 case CR_SERVER_LOST: |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 /* connection lost - try immediate reconnect */ |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
310 conn->connected = FALSE; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 break; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 default: |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 return -1; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 /* connected -> lost it -> connected -> lost again */ |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 return 0; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
321 static int driver_mysql_do_query(struct mysql_db *db, const char *query, |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
322 struct mysql_connection **conn_r) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
323 { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
324 struct mysql_connection *conn; |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
325 unsigned int i, start, count; |
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
|
326 bool reset; |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3741
diff
changeset
|
327 int ret; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
328 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4391
diff
changeset
|
329 conn = array_get_modifiable(&db->connections, &count); |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
330 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
331 /* go through the connections in round robin. if the connection |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
332 isn't available, try next one that is. */ |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
333 start = db->next_query_connection % count; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
334 db->next_query_connection++; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
335 |
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
|
336 for (reset = FALSE;; reset = TRUE) { |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
337 i = start; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
338 do { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
339 ret = driver_mysql_connection_do_query(&conn[i], query); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
340 if (ret != 0) { |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
341 /* success / failure */ |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
342 *conn_r = &conn[i]; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
343 return ret; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
344 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
345 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
346 /* not connected, try next one */ |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
347 i = (i + 1) % count; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
348 } while (i != start); |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
349 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
350 if (reset) |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
351 break; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
352 |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
353 /* none are connected. connect_delays may have gotten too high, |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
354 reset all of them to see if some are still alive. */ |
4293
539a2dcd92b4
Use array instead of buffer for storing connections.
Timo Sirainen <tss@iki.fi>
parents:
4069
diff
changeset
|
355 for (i = 0; i < count; i++) |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
356 conn[i].connect_delay = CONNECT_RESET_DELAY; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
357 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
358 |
3741 | 359 *conn_r = NULL; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
360 return 0; |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
361 } |
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
362 |
4458
3e196acd60b7
sql_escape_string() should return const char *, not char *.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
363 static const char * |
4294 | 364 driver_mysql_escape_string(struct sql_db *_db, const char *string) |
365 { | |
366 struct mysql_db *db = (struct mysql_db *)_db; | |
4391
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
367 struct mysql_connection *conn; |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
368 unsigned int i, count; |
4294 | 369 size_t len = strlen(string); |
370 char *to; | |
371 | |
4391
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
372 /* All the connections should be identical, so just use the first |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
373 connected one */ |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4391
diff
changeset
|
374 conn = array_get_modifiable(&db->connections, &count); |
4391
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
375 for (i = 0; i < count; i++) { |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
376 if (conn[i].connected) |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
377 break; |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
378 } |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
379 if (i == count) { |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
380 /* so, try connecting.. */ |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
381 for (i = 0; i < count; i++) { |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
382 if (driver_mysql_connect(&conn[i])) |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
383 break; |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
384 } |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
385 if (i == count) { |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
386 /* FIXME: we don't have a valid connection, so fallback |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
387 to using default escaping. the next query will most |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
388 likely fail anyway so it shouldn't matter that much |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
389 what we return here.. Anyway, this API needs |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
390 changing so that the escaping function could already |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
391 fail the query reliably. */ |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
392 to = t_buffer_get(len * 2 + 1); |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
393 len = mysql_escape_string(to, string, len); |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
394 t_buffer_alloc(len + 1); |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
395 return to; |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
396 } |
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
397 } |
4294 | 398 |
399 to = t_buffer_get(len * 2 + 1); | |
4391
ec5a8b1523a3
Escaping a string crashed if we weren't connected to mysql.
Timo Sirainen <tss@iki.fi>
parents:
4384
diff
changeset
|
400 len = mysql_real_escape_string(conn[i].mysql, to, string, len); |
4294 | 401 t_buffer_alloc(len + 1); |
402 return to; | |
403 } | |
404 | |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 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
|
406 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 struct mysql_db *db = (struct mysql_db *)_db; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
408 struct mysql_connection *conn; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
410 (void)driver_mysql_do_query(db, query, &conn); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
413 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
|
414 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
|
415 { |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
416 struct sql_result *result; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
417 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
418 result = sql_query_s(db, query); |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
419 result->callback = TRUE; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
420 callback(result, context); |
3946 | 421 result->callback = FALSE; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
422 sql_result_free(result); |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
423 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
424 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
425 static struct sql_result * |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
426 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
|
427 { |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 struct mysql_db *db = (struct mysql_db *)_db; |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
429 struct mysql_connection *conn; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
430 struct mysql_result *result; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
431 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
432 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
|
433 result->api = driver_mysql_result; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
434 result->api.db = _db; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
436 switch (driver_mysql_do_query(db, query, &conn)) { |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 case 0: |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 /* not connected */ |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
439 result->api = sql_not_connected_result; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
440 break; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 case 1: |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 /* query ok */ |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
443 result->result = mysql_store_result(conn->mysql); |
4384
a8979ba36c74
Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
444 if (result->result != NULL || mysql_errno(conn->mysql) == 0) |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 break; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
446 /* fallback */ |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 case -1: |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
448 /* error */ |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
449 result->api = driver_mysql_error_result; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 break; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 |
3741 | 453 result->conn = conn; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
454 return &result->api; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
455 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
456 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
457 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
|
458 { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
459 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
|
460 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
461 if (_result == &sql_not_connected_result || _result->callback) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
462 return; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
463 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
464 if (result->result != NULL) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
465 mysql_free_result(result->result); |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
466 i_free(result); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 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
|
470 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 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
|
472 |
4384
a8979ba36c74
Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
473 if (result->result == NULL) { |
a8979ba36c74
Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
474 /* no results */ |
a8979ba36c74
Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
475 return 0; |
a8979ba36c74
Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
476 } |
a8979ba36c74
Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
477 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 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
|
479 if (result->row != NULL) |
ced4abfdb2f9
Check if mysql_fetch_row() returns error.
Timo Sirainen <tss@iki.fi>
parents:
2840
diff
changeset
|
480 return 1; |
ced4abfdb2f9
Check if mysql_fetch_row() returns error.
Timo Sirainen <tss@iki.fi>
parents:
2840
diff
changeset
|
481 |
4384
a8979ba36c74
Fixes to handling database updates.
Timo Sirainen <tss@iki.fi>
parents:
4294
diff
changeset
|
482 return mysql_errno(result->conn->mysql) != 0 ? -1 : 0; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
483 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
484 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
485 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
|
486 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
487 if (result->fields != NULL) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
488 return; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
489 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 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
|
491 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
|
492 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
493 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
494 static unsigned int |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 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
|
496 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 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
|
498 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
499 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
|
500 return result->fields_count; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
502 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 static const char * |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 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
|
505 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
506 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
|
507 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
508 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
|
509 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
|
510 return result->fields[idx].name; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 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
|
514 const char *field_name) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
515 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
516 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
|
517 unsigned int i; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 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
|
520 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
|
521 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
|
522 return i; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 return -1; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 static const char * |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 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
|
529 unsigned int idx) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
530 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 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
|
532 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 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
|
534 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
536 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
|
537 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
|
538 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
|
539 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
|
540 { |
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
|
541 /* 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
|
542 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
|
543 } |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
544 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 static const char * |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
546 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
|
547 const char *field_name) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 int idx; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 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
|
552 if (idx < 0) |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
553 return NULL; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 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
|
555 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
557 static const char *const * |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
558 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
|
559 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 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
|
561 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 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
|
563 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
565 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
|
566 { |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
567 struct mysql_result *result = (struct mysql_result *)_result; |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 |
3053
1d005cdce6ec
Mysql driver supports connecting to multiple servers by giving multiple
Timo Sirainen <tss@iki.fi>
parents:
3052
diff
changeset
|
569 return mysql_error(result->conn->mysql); |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
572 static struct sql_transaction_context * |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
573 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
|
574 { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
575 struct mysql_transaction_context *ctx; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
576 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
577 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
|
578 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
|
579 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
|
580 return &ctx->ctx; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
581 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
582 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
583 static void |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
584 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
|
585 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
|
586 { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
587 const char *error; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
588 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
589 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
|
590 callback(error, context); |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
591 else |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
592 callback(NULL, context); |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
593 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
594 |
4593
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
595 static int transaction_send_query(struct mysql_transaction_context *ctx, |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
596 const char *query) |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
597 { |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
598 struct sql_result *result; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
599 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
|
600 |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
601 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
|
602 return -1; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
603 |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
604 result = sql_query_s(ctx->ctx.db, query); |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
605 if (sql_result_next_row(result) < 0) { |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
606 ctx->error = sql_result_get_error(result); |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
607 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
|
608 ret = -1; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
609 } |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
610 sql_result_free(result); |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
611 return ret; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
612 } |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
613 |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
614 static int |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
615 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
|
616 const char **error_r) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
617 { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
618 struct mysql_transaction_context *ctx = |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
619 (struct mysql_transaction_context *)_ctx; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
620 int ret = 0; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
621 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
622 *error_r = NULL; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
623 |
4593
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
624 if (ctx->head != NULL) { |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
625 /* 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
|
626 even if it doesn't work. */ |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
627 (void)transaction_send_query(ctx, "BEGIN"); |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
628 while (ctx->head != NULL) { |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
629 if (transaction_send_query(ctx, ctx->head->query) < 0) |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
630 break; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
631 ctx->head = ctx->head->next; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
632 } |
4593
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
633 ret = transaction_send_query(ctx, "COMMIT"); |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
634 *error_r = ctx->error; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
635 } |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
636 sql_transaction_rollback(&_ctx); |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
637 return ret; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
638 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
639 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
640 static void |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
641 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
|
642 { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
643 struct mysql_transaction_context *ctx = |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
644 (struct mysql_transaction_context *)_ctx; |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
645 |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6420
diff
changeset
|
646 pool_unref(&ctx->query_pool); |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
647 i_free(ctx); |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
648 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
649 |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
650 static void |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
651 driver_mysql_update(struct sql_transaction_context *_ctx, const char *query) |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
652 { |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
653 struct mysql_transaction_context *ctx = |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
654 (struct mysql_transaction_context *)_ctx; |
4593
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
655 struct mysql_query_list *list; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
656 |
4593
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
657 list = p_new(ctx->query_pool, struct mysql_query_list, 1); |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
658 list->query = p_strdup(ctx->query_pool, query); |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
659 |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
660 if (ctx->head == NULL) |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
661 ctx->head = list; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
662 else |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
663 ctx->tail->next = list; |
ec2bc538dcad
Save queries within transaction in a linked list and send them separately,
Timo Sirainen <tss@iki.fi>
parents:
4458
diff
changeset
|
664 ctx->tail = list; |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
665 } |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
666 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
667 struct sql_db driver_mysql_db = { |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
668 "mysql", |
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
669 |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
670 MEMBER(v) { |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
671 driver_mysql_init_v, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
672 driver_mysql_deinit_v, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
673 driver_mysql_get_flags, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
674 driver_mysql_connect_all, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
675 driver_mysql_escape_string, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
676 driver_mysql_exec, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
677 driver_mysql_query, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
678 driver_mysql_query_s, |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
679 |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
680 driver_mysql_transaction_begin, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
681 driver_mysql_transaction_commit, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
682 driver_mysql_transaction_commit_s, |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
683 driver_mysql_transaction_rollback, |
3736
3dd0ab18d8da
Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents:
3421
diff
changeset
|
684 |
6474
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
685 driver_mysql_update |
46c3e1ee196f
Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
686 } |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
687 }; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
688 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
689 struct sql_result driver_mysql_result = { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
690 MEMBER(v) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
691 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
|
692 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
|
693 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
|
694 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
|
695 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
|
696 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
|
697 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
|
698 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
|
699 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
|
700 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
|
701 } |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
702 }; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
703 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
704 static int |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5496
diff
changeset
|
705 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
|
706 { |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
707 return -1; |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
708 } |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
709 |
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
710 struct sql_result driver_mysql_error_result = { |
5496
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
711 MEMBER(v) { |
72ee0521dfaf
Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
712 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
|
713 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
|
714 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
|
715 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
|
716 } |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
717 }; |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
718 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
719 void driver_mysql_init(void); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
720 void driver_mysql_deinit(void); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
721 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
722 void driver_mysql_init(void) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
723 { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
724 sql_driver_register(&driver_mysql_db); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
725 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
726 |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
727 void driver_mysql_deinit(void) |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
728 { |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
729 sql_driver_unregister(&driver_mysql_db); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
730 } |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
731 |
2754
3c3ac12be307
Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
732 #endif |