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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
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
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
364 driver_mysql_escape_string(struct sql_db *_db, const char *string)
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
365 {
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
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
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
369 size_t len = strlen(string);
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
370 char *to;
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
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
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
398
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
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
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
401 t_buffer_alloc(len + 1);
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
402 return to;
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
403 }
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 4293
diff changeset
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
d7051c7a0200 Fixed memory leaks
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
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
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
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