annotate src/lib-sql/driver-pgsql.c @ 22715:20415dd0b85a

dsync: Add per-mailbox sync lock that is always used. Both importing and exporting gets the lock before they even sync the mailbox. The lock is kept until the import/export finishes. This guarantees that no matter how dsync is run, two dsyncs can't be working on the same mailbox at the same time. This lock is in addition to the optional per-user lock enabled by the -l parameter. If the -l parameter is used, the same lock timeout is used for the per-mailbox lock. Otherwise 30s timeout is used. This should help to avoid email duplication when replication is enabled for public namespaces, and maybe in some other rare situations as well.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 28 Dec 2017 14:10:23 +0200
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22513
diff changeset
1 /* Copyright (c) 2004-2018 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"
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
4 #include "array.h"
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
6 #include "hex-binary.h"
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
7 #include "str.h"
18697
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
8 #include "time-util.h"
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "sql-api-private.h"
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
11 #ifdef BUILD_PGSQL
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <libpq-fe.h>
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
18697
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
14 #define PGSQL_DNS_WARN_MSECS 500
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
15
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 struct pgsql_db {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct sql_db api;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 pool_t pool;
6252
27d9b2114266 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 6251
diff changeset
20 char *connect_string;
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
21 char *host;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 PGconn *pg;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 struct io *io;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
25 struct timeout *to_connect;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 enum io_condition io_dir;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
28 struct pgsql_result *cur_result;
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
29 struct ioloop *ioloop, *orig_ioloop;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
30 struct sql_result *sync_result;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
31
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
32 bool (*next_callback)(void *);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
33 void *next_context;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
34
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
35 char *error;
18689
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
36 const char *connect_state;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
37
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
38 unsigned int fatal_error:1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
41 struct pgsql_binary_value {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
42 unsigned char *value;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
43 size_t size;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
44 };
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
45
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 struct pgsql_result {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct sql_result api;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 PGresult *pgres;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
49 struct timeout *to;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 unsigned int rownum, rows;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 unsigned int fields_count;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 const char **fields;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 const char **values;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
56 ARRAY(struct pgsql_binary_value) binary_values;
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
57
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 sql_query_callback_t *callback;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 void *context;
8617
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
60
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
61 unsigned int timeout:1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
64 struct pgsql_transaction_context {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
65 struct sql_transaction_context ctx;
8650
81fd92599c7f pgsql: Don't write to freed memory if transaction is aborted while SQL commands are being executed.
Timo Sirainen <tss@iki.fi>
parents: 8648
diff changeset
66 int refcount;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
67
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
68 sql_commit_callback_t *callback;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
69 void *context;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
70
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
71 pool_t query_pool;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
72 const char *error;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
73
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
74 unsigned int failed:1;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
75 };
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
76
11253
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 11003
diff changeset
77 extern const struct sql_db driver_pgsql_db;
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 11003
diff changeset
78 extern const struct sql_result driver_pgsql_result;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79
3965
5b2640d48aa2 Make sure queued queries and timeout get freed when deinitializing. Send the
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
80 static void result_finish(struct pgsql_result *result);
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
81 static void
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
82 transaction_update_callback(struct sql_result *result,
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
83 struct sql_transaction_query *query);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84
12799
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
85 static const char *pgsql_prefix(struct pgsql_db *db)
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
86 {
12815
27ee65dc87c2 pgsql: If host isn't given, don't show pgsql((null)) as log prefix (or crash).
Timo Sirainen <tss@iki.fi>
parents: 12799
diff changeset
87 return db->host == NULL ? "pgsql" :
27ee65dc87c2 pgsql: If host isn't given, don't show pgsql((null)) as log prefix (or crash).
Timo Sirainen <tss@iki.fi>
parents: 12799
diff changeset
88 t_strdup_printf("pgsql(%s)", db->host);
12799
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
89 }
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
90
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
91 static void driver_pgsql_set_state(struct pgsql_db *db, enum sql_db_state state)
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
92 {
12736
b3cb10df15e6 pgsql: Added assert.
Timo Sirainen <tss@iki.fi>
parents: 12735
diff changeset
93 i_assert(state == SQL_DB_STATE_BUSY || db->cur_result == NULL);
b3cb10df15e6 pgsql: Added assert.
Timo Sirainen <tss@iki.fi>
parents: 12735
diff changeset
94
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
95 /* switch back to original ioloop in case the caller wants to
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
96 add/remove timeouts */
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
97 if (db->ioloop != NULL)
16964
b740824110f4 Use io_loop_set_current() instead of directly setting it.
Timo Sirainen <tss@iki.fi>
parents: 16107
diff changeset
98 io_loop_set_current(db->orig_ioloop);
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
99 sql_db_set_state(&db->api, state);
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
100 if (db->ioloop != NULL)
16964
b740824110f4 Use io_loop_set_current() instead of directly setting it.
Timo Sirainen <tss@iki.fi>
parents: 16107
diff changeset
101 io_loop_set_current(db->ioloop);
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
102 }
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
103
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
104 static bool driver_pgsql_next_callback(struct pgsql_db *db)
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
105 {
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
106 bool (*next_callback)(void *) = db->next_callback;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
107 void *next_context = db->next_context;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
108
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
109 if (next_callback == NULL)
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
110 return FALSE;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
111
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
112 db->next_callback = NULL;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
113 db->next_context = NULL;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
114 return next_callback(next_context);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
115 }
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
116
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
117 static void driver_pgsql_stop_io(struct pgsql_db *db)
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
118 {
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
119 if (db->io != NULL) {
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
120 io_remove(&db->io);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
121 db->io_dir = 0;
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
122 }
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
123 }
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
124
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 static void driver_pgsql_close(struct pgsql_db *db)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 db->io_dir = 0;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
128 db->fatal_error = FALSE;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
12176
68c44e8740a2 pgsql: Avoid epoll_ctl() errors when closing connection.
Timo Sirainen <tss@iki.fi>
parents: 12033
diff changeset
130 driver_pgsql_stop_io(db);
68c44e8740a2 pgsql: Avoid epoll_ctl() errors when closing connection.
Timo Sirainen <tss@iki.fi>
parents: 12033
diff changeset
131
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 PQfinish(db->pg);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 db->pg = NULL;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
135 if (db->to_connect != NULL)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
136 timeout_remove(&db->to_connect);
8614
fc3bd6608c90 psql: Don't give errors with epoll if db connection gets closed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
137
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
138 driver_pgsql_set_state(db, SQL_DB_STATE_DISCONNECTED);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
139
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
140 if (db->ioloop != NULL) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
141 /* running a sync query, stop it */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
142 io_loop_stop(db->ioloop);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
143 }
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
144 driver_pgsql_next_callback(db);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 static const char *last_error(struct pgsql_db *db)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 const char *msg;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 size_t len;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 msg = PQerrorMessage(db->pg);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 if (msg == NULL)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 return "(no error set)";
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 /* Error message should contain trailing \n, we don't want it */
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 len = strlen(msg);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 return len == 0 || msg[len-1] != '\n' ? msg :
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 t_strndup(msg, len-1);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4465
diff changeset
162 static void connect_callback(struct pgsql_db *db)
2754
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 enum io_condition io_dir = 0;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 int ret;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
167 driver_pgsql_stop_io(db);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
168
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 while ((ret = PQconnectPoll(db->pg)) == PGRES_POLLING_ACTIVE)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 ;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 switch (ret) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 case PGRES_POLLING_READING:
18689
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
174 db->connect_state = "wait for input";
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 io_dir = IO_READ;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 break;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 case PGRES_POLLING_WRITING:
18689
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
178 db->connect_state = "wait for output";
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 io_dir = IO_WRITE;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 break;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 case PGRES_POLLING_OK:
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 break;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 case PGRES_POLLING_FAILED:
18689
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
184 i_error("%s: Connect failed to database %s: %s (state: %s)",
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
185 pgsql_prefix(db), PQdb(db->pg), last_error(db), db->connect_state);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 driver_pgsql_close(db);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 return;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
190 if (io_dir != 0) {
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
191 db->io = io_add(PQsocket(db->pg), io_dir, connect_callback, db);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 db->io_dir = io_dir;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 }
3965
5b2640d48aa2 Make sure queued queries and timeout get freed when deinitializing. Send the
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
194
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
195 if (io_dir == 0) {
18689
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
196 db->connect_state = "connected";
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
197 if (db->to_connect != NULL)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
198 timeout_remove(&db->to_connect);
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
199 driver_pgsql_set_state(db, SQL_DB_STATE_IDLE);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
200 if (db->ioloop != NULL) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
201 /* driver_pgsql_sync_init() waiting for connection to
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
202 finish */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
203 io_loop_stop(db->ioloop);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
204 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
205 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
206 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
207
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
208 static void driver_pgsql_connect_timeout(struct pgsql_db *db)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
209 {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
210 unsigned int secs = ioloop_time - db->api.last_connect_try;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
211
18689
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
212 i_error("%s: Connect failed: Timeout after %u seconds (state: %s)",
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
213 pgsql_prefix(db), secs, db->connect_state);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
214 driver_pgsql_close(db);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
3421
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3162
diff changeset
217 static int driver_pgsql_connect(struct sql_db *_db)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 {
3421
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3162
diff changeset
219 struct pgsql_db *db = (struct pgsql_db *)_db;
18697
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
220 struct timeval tv_start;
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
221 int msecs;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
223 i_assert(db->api.state == SQL_DB_STATE_DISCONNECTED);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
18697
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
225 io_loop_time_refresh();
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
226 tv_start = ioloop_timeval;
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
227
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 db->pg = PQconnectStart(db->connect_string);
12799
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
229 if (db->pg == NULL) {
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
230 i_fatal("%s: PQconnectStart() failed (out of memory)",
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
231 pgsql_prefix(db));
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
232 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 if (PQstatus(db->pg) == CONNECTION_BAD) {
12799
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
235 i_error("%s: Connect failed to database %s: %s",
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
236 pgsql_prefix(db), PQdb(db->pg), last_error(db));
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 driver_pgsql_close(db);
3421
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3162
diff changeset
238 return -1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 }
18697
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
240 /* PQconnectStart() blocks on host name resolving. Log a warning if
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
241 it takes too long. Also don't include time spent on that in the
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
242 connect timeout (by refreshing ioloop time). */
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
243 io_loop_time_refresh();
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
244 msecs = timeval_diff_msecs(&ioloop_timeval, &tv_start);
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
245 if (msecs > PGSQL_DNS_WARN_MSECS) {
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
246 i_warning("%s: DNS lookup took %d.%03d s",
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
247 pgsql_prefix(db), msecs/1000, msecs % 1000);
db41043041cb pgsql: Log a warning if DNS lookup takes too long. Don't include it in connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 18689
diff changeset
248 }
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
249
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
250 /* nonblocking connecting begins. */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
251 if (PQsetnonblocking(db->pg, 1) < 0)
12799
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
252 i_error("%s: PQsetnonblocking() failed", pgsql_prefix(db));
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
253 i_assert(db->to_connect == NULL);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
254 db->to_connect = timeout_add(SQL_CONNECT_TIMEOUT_SECS * 1000,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
255 driver_pgsql_connect_timeout, db);
18689
a0dd9dad3b8c pgsql: Include connect state string on connect failure errors.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
256 db->connect_state = "connecting";
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
257 db->io = io_add(PQsocket(db->pg), IO_WRITE, connect_callback, db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
258 db->io_dir = IO_WRITE;
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
259 driver_pgsql_set_state(db, SQL_DB_STATE_CONNECTING);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
260 return 0;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
261 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
262
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
263 static void driver_pgsql_disconnect(struct sql_db *_db)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
264 {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
265 struct pgsql_db *db = (struct pgsql_db *)_db;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
266
18698
b19ca4214e63 pgsql: Don't crash at disconnect/deinit if there's an unfinished query.
Timo Sirainen <tss@iki.fi>
parents: 18697
diff changeset
267 if (db->cur_result != NULL && db->cur_result->to != NULL) {
b19ca4214e63 pgsql: Don't crash at disconnect/deinit if there's an unfinished query.
Timo Sirainen <tss@iki.fi>
parents: 18697
diff changeset
268 driver_pgsql_stop_io(db);
b19ca4214e63 pgsql: Don't crash at disconnect/deinit if there's an unfinished query.
Timo Sirainen <tss@iki.fi>
parents: 18697
diff changeset
269 result_finish(db->cur_result);
b19ca4214e63 pgsql: Don't crash at disconnect/deinit if there's an unfinished query.
Timo Sirainen <tss@iki.fi>
parents: 18697
diff changeset
270 }
12033
b88b207b79b2 lib-sql: sql_disconnect() now aborts all pending requests.
Timo Sirainen <tss@iki.fi>
parents: 11921
diff changeset
271
11407
f9e5c73a988b lib-sql: Don't try to reconnect on deinit or intentional disconnect. Fixes a timeout leak.
Timo Sirainen <tss@iki.fi>
parents: 11261
diff changeset
272 _db->no_reconnect = TRUE;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
273 driver_pgsql_close(db);
11407
f9e5c73a988b lib-sql: Don't try to reconnect on deinit or intentional disconnect. Fixes a timeout leak.
Timo Sirainen <tss@iki.fi>
parents: 11261
diff changeset
274 _db->no_reconnect = FALSE;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
277 static struct sql_db *driver_pgsql_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
278 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 struct pgsql_db *db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 db = i_new(struct pgsql_db, 1);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 db->connect_string = i_strdup(connect_string);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 db->api = driver_pgsql_db;
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
284
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
285 T_BEGIN {
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
286 const char *const *arg = t_strsplit(connect_string, " ");
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
287
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
288 for (; *arg != NULL; arg++) {
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
289 if (strncmp(*arg, "host=", 5) == 0)
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
290 db->host = i_strdup(*arg + 5);
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
291 }
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
292 } T_END;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 return &db->api;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
296 static void driver_pgsql_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
297 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 struct pgsql_db *db = (struct pgsql_db *)_db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
18698
b19ca4214e63 pgsql: Don't crash at disconnect/deinit if there's an unfinished query.
Timo Sirainen <tss@iki.fi>
parents: 18697
diff changeset
300 driver_pgsql_disconnect(_db);
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
301 i_free(db->host);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
302 i_free(db->error);
6252
27d9b2114266 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 6251
diff changeset
303 i_free(db->connect_string);
6476
af14dc005392 Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents: 6474
diff changeset
304 array_free(&_db->module_contexts);
af14dc005392 Let deinit() free all the memory itself after all.
Timo Sirainen <tss@iki.fi>
parents: 6474
diff changeset
305 i_free(db);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
308 static void driver_pgsql_set_idle(struct pgsql_db *db)
3162
5d6787582410 Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents: 2754
diff changeset
309 {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
310 i_assert(db->api.state == SQL_DB_STATE_BUSY);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
311
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
312 if (db->fatal_error)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
313 driver_pgsql_close(db);
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
314 else if (!driver_pgsql_next_callback(db))
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
315 driver_pgsql_set_state(db, SQL_DB_STATE_IDLE);
3162
5d6787582410 Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents: 2754
diff changeset
316 }
5d6787582410 Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents: 2754
diff changeset
317
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4465
diff changeset
318 static void consume_results(struct pgsql_db *db)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 {
11003
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
320 PGresult *pgres;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
322 driver_pgsql_stop_io(db);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
323
11003
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
324 while (PQconsumeInput(db->pg)) {
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
325 if (PQisBusy(db->pg)) {
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
326 db->io = io_add(PQsocket(db->pg), IO_READ,
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
327 consume_results, db);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
328 db->io_dir = IO_READ;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 return;
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
330 }
11003
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
331
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
332 pgres = PQgetResult(db->pg);
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
333 if (pgres == NULL)
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
334 break;
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
335 PQclear(pgres);
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
336 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
338 if (PQstatus(db->pg) == CONNECTION_BAD)
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
339 driver_pgsql_close(db);
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
340 else
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
341 driver_pgsql_set_idle(db);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
344 static void driver_pgsql_result_free(struct sql_result *_result)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 {
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
346 struct pgsql_db *db = (struct pgsql_db *)_result->db;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
347 struct pgsql_result *result = (struct pgsql_result *)_result;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
348 bool success;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349
19056
97ff15e9a7fd lib-sql: sql_result.free() should never be reached from the query callback.
Timo Sirainen <tss@iki.fi>
parents: 19036
diff changeset
350 i_assert(!result->api.callback);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
351 i_assert(db->cur_result == result);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
352 i_assert(result->callback == NULL);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
353
6793
33cfef65a5e1 Fixes to handling transaction updates.
Timo Sirainen <tss@iki.fi>
parents: 6792
diff changeset
354 if (_result == db->sync_result)
33cfef65a5e1 Fixes to handling transaction updates.
Timo Sirainen <tss@iki.fi>
parents: 6792
diff changeset
355 db->sync_result = NULL;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
356 db->cur_result = NULL;
6793
33cfef65a5e1 Fixes to handling transaction updates.
Timo Sirainen <tss@iki.fi>
parents: 6792
diff changeset
357
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
358 success = result->pgres != NULL && !db->fatal_error;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 if (result->pgres != NULL) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 PQclear(result->pgres);
11003
5a6aaf88f15c pgsql: Don't leak memory if query returns multiple results.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
361 result->pgres = NULL;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
362 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
364 if (success) {
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 /* we'll have to read the rest of the results as well */
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 i_assert(db->io == NULL);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 consume_results(db);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 } else {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
369 driver_pgsql_set_idle(db);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
372 if (array_is_created(&result->binary_values)) {
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
373 struct pgsql_binary_value *value;
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
374
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
375 array_foreach_modifiable(&result->binary_values, value)
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
376 PQfreemem(value->value);
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
377 array_free(&result->binary_values);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
378 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
379
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 i_free(result->fields);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 i_free(result->values);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 i_free(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
385 static void result_finish(struct pgsql_result *result)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
386 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
387 struct pgsql_db *db = (struct pgsql_db *)result->api.db;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
388 bool free_result = TRUE;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
389
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
390 i_assert(db->io == NULL);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
391 timeout_remove(&result->to);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
392
8733
b899076947cf pgsql: Fixes to handling reconnecting to server.
Timo Sirainen <tss@iki.fi>
parents: 8684
diff changeset
393 /* if connection to server was lost, we don't yet see that the
b899076947cf pgsql: Fixes to handling reconnecting to server.
Timo Sirainen <tss@iki.fi>
parents: 8684
diff changeset
394 connection is bad. we only see the fatal error, so assume it also
b899076947cf pgsql: Fixes to handling reconnecting to server.
Timo Sirainen <tss@iki.fi>
parents: 8684
diff changeset
395 means disconnection. */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
396 if (PQstatus(db->pg) == CONNECTION_BAD || result->pgres == NULL ||
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
397 PQresultStatus(result->pgres) == PGRES_FATAL_ERROR)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
398 db->fatal_error = TRUE;
8617
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
399
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
400 if (db->fatal_error) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
401 result->api.failed = TRUE;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
402 result->api.failed_try_retry = TRUE;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
403 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
404 result->api.callback = TRUE;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
405 T_BEGIN {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
406 result->callback(&result->api, result->context);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
407 } T_END;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
408 result->api.callback = FALSE;
8617
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
409
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
410 free_result = db->sync_result != &result->api;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
411 if (db->ioloop != NULL)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
412 io_loop_stop(db->ioloop);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
413
19057
0770ab82703d lib-sql: Debugging help - Added assert before clearing sql_result.callback.
Timo Sirainen <tss@iki.fi>
parents: 19056
diff changeset
414 i_assert(!free_result || result->api.refcount > 0);
0770ab82703d lib-sql: Debugging help - Added assert before clearing sql_result.callback.
Timo Sirainen <tss@iki.fi>
parents: 19056
diff changeset
415 result->callback = NULL;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
416 if (free_result)
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 9248
diff changeset
417 sql_result_unref(&result->api);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
418 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
419
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4465
diff changeset
420 static void get_result(struct pgsql_result *result)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 struct pgsql_db *db = (struct pgsql_db *)result->api.db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
424 driver_pgsql_stop_io(db);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
425
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 if (!PQconsumeInput(db->pg)) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 result_finish(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 return;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 if (PQisBusy(db->pg)) {
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
432 db->io = io_add(PQsocket(db->pg), IO_READ,
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
433 get_result, result);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
434 db->io_dir = IO_READ;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 return;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 result->pgres = PQgetResult(db->pg);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 result_finish(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4465
diff changeset
442 static void flush_callback(struct pgsql_result *result)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 struct pgsql_db *db = (struct pgsql_db *)result->api.db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 int ret;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
447 driver_pgsql_stop_io(db);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
448
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 ret = PQflush(db->pg);
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
450 if (ret > 0) {
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
451 db->io = io_add(PQsocket(db->pg), IO_WRITE,
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
452 flush_callback, result);
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
453 db->io_dir = IO_WRITE;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 return;
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
455 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 if (ret < 0) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 result_finish(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 } else {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 /* all flushed */
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 get_result(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
465 static void query_timeout(struct pgsql_result *result)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
466 {
12735
7d265040cd02 pgsql: Don't assert-crash on "query timed out" error.
Timo Sirainen <tss@iki.fi>
parents: 12690
diff changeset
467 struct pgsql_db *db = (struct pgsql_db *)result->api.db;
7d265040cd02 pgsql: Don't assert-crash on "query timed out" error.
Timo Sirainen <tss@iki.fi>
parents: 12690
diff changeset
468
7d265040cd02 pgsql: Don't assert-crash on "query timed out" error.
Timo Sirainen <tss@iki.fi>
parents: 12690
diff changeset
469 driver_pgsql_stop_io(db);
7d265040cd02 pgsql: Don't assert-crash on "query timed out" error.
Timo Sirainen <tss@iki.fi>
parents: 12690
diff changeset
470
12799
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
471 i_error("%s: Query timed out, aborting", pgsql_prefix(db));
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
472 result->timeout = TRUE;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
473 result_finish(result);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
474 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
475
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
476 static void do_query(struct pgsql_result *result, const char *query)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 struct pgsql_db *db = (struct pgsql_db *)result->api.db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 int ret;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
481 i_assert(SQL_DB_IS_READY(&db->api));
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
482 i_assert(db->cur_result == NULL);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 i_assert(db->io == NULL);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484
12816
f95b1e26f1f2 pgsql: Don't assert-crash if query fails when trying to send it.
Timo Sirainen <tss@iki.fi>
parents: 12815
diff changeset
485 driver_pgsql_set_state(db, SQL_DB_STATE_BUSY);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
486 db->cur_result = result;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
487 result->to = timeout_add(SQL_QUERY_TIMEOUT_SECS * 1000,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
488 query_timeout, result);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
489
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
490 if (!PQsendQuery(db->pg, query) ||
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
491 (ret = PQflush(db->pg)) < 0) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
492 /* failed to send query */
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 result_finish(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 return;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 }
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 if (ret > 0) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 /* write blocks */
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 db->io = io_add(PQsocket(db->pg), IO_WRITE,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 flush_callback, result);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
501 db->io_dir = IO_WRITE;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 } else {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 get_result(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 }
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
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
507 static const char *
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
508 driver_pgsql_escape_string(struct sql_db *_db, const char *string)
6251
3200be63749b Timeout queued queries after a while if we can't connect to server.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
509 {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
510 struct pgsql_db *db = (struct pgsql_db *)_db;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
511 size_t len = strlen(string);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
512 char *to;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
514 #ifdef HAVE_PQESCAPE_STRING_CONN
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
515 if (db->api.state == SQL_DB_STATE_DISCONNECTED) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
516 /* try connecting again */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
517 (void)sql_connect(&db->api);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 }
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
519 if (db->api.state != SQL_DB_STATE_DISCONNECTED) {
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14390
diff changeset
520 int error;
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14390
diff changeset
521
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
522 to = t_buffer_get(len * 2 + 1);
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14390
diff changeset
523 len = PQescapeStringConn(db->pg, to, string, len, &error);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
524 } else
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
525 #endif
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
526 {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
527 to = t_buffer_get(len * 2 + 1);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
528 len = PQescapeString(to, string, len);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 }
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
530 t_buffer_alloc(len + 1);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
531 return to;
2754
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
8617
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
534 static void exec_callback(struct sql_result *_result,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6252
diff changeset
535 void *context ATTR_UNUSED)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
536 {
8617
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
537 struct pgsql_db *db = (struct pgsql_db *)_result->db;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538
12799
965b9019ef2e mysql/pgsql: Log prefixes now contain also the hostname.
Timo Sirainen <tss@iki.fi>
parents: 12736
diff changeset
539 i_error("%s: sql_exec() failed: %s", pgsql_prefix(db), last_error(db));
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
542 static void driver_pgsql_exec(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
543 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 struct pgsql_result *result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 result = i_new(struct pgsql_result, 1);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 result->api = driver_pgsql_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 result->api.db = db;
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 9248
diff changeset
549 result->api.refcount = 1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 result->callback = exec_callback;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 do_query(result, query);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
554 static void driver_pgsql_query(struct sql_db *db, const char *query,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
555 sql_query_callback_t *callback, void *context)
2754
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 struct pgsql_result *result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 result = i_new(struct pgsql_result, 1);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560 result->api = driver_pgsql_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 result->api.db = db;
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 9248
diff changeset
562 result->api.refcount = 1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 result->callback = callback;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 result->context = context;
8617
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
565 do_query(result, query);
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
566 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
568 static void pgsql_query_s_callback(struct sql_result *result, void *context)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
569 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
570 struct pgsql_db *db = context;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
571
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
572 db->sync_result = result;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
573 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
574
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
575 static void driver_pgsql_sync_init(struct pgsql_db *db)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
576 {
12690
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
577 bool add_to_connect;
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
578
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
579 db->orig_ioloop = current_ioloop;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
580 if (db->io == NULL) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
581 db->ioloop = io_loop_create();
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
582 return;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
583 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
584
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
585 i_assert(db->api.state == SQL_DB_STATE_CONNECTING);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
586
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
587 /* have to move our existing I/O and timeout handlers to new I/O loop */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
588 io_remove(&db->io);
12690
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
589 if (db->to_connect != NULL) {
11654
2167bea550e1 pgsql: Fixes for errors handling with synchronous sql queries.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
590 timeout_remove(&db->to_connect);
12690
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
591 add_to_connect = TRUE;
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
592 } else {
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
593 add_to_connect = FALSE;
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
594 }
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
595
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
596 db->ioloop = io_loop_create();
12690
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
597 if (add_to_connect) {
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
598 db->to_connect = timeout_add(SQL_CONNECT_TIMEOUT_SECS * 1000,
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
599 driver_pgsql_connect_timeout, db);
f043ef71b936 pgsql: When executing synchronous queries, don't wrongly add a connect timeout.
Timo Sirainen <tss@iki.fi>
parents: 12676
diff changeset
600 }
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
601 db->io = io_add(PQsocket(db->pg), db->io_dir, connect_callback, db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
602 /* wait for connecting to finish */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
603 io_loop_run(db->ioloop);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
604 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
605
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
606 static void driver_pgsql_sync_deinit(struct pgsql_db *db)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
607 {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
608 io_loop_destroy(&db->ioloop);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
609 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
610
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
611 static struct sql_result *
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
612 driver_pgsql_sync_query(struct pgsql_db *db, const char *query)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
613 {
7968
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
614 struct sql_result *result;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
615
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
616 i_assert(db->sync_result == NULL);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
617
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
618 switch (db->api.state) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
619 case SQL_DB_STATE_CONNECTING:
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
620 case SQL_DB_STATE_BUSY:
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
621 i_unreached();
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
622 case SQL_DB_STATE_DISCONNECTED:
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
623 sql_not_connected_result.refcount++;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
624 return &sql_not_connected_result;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
625 case SQL_DB_STATE_IDLE:
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
626 break;
7967
6d9f2185b9e0 pgsql: Don't break with synchronous queries (with dict-sql)
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
627 }
6d9f2185b9e0 pgsql: Don't break with synchronous queries (with dict-sql)
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
628
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
629 driver_pgsql_query(&db->api, query, pgsql_query_s_callback, db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
630 if (db->sync_result == NULL)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
631 io_loop_run(db->ioloop);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
632
11921
e31570bccb92 pgsql: Changed the way IO handlers are added/removed.
Timo Sirainen <tss@iki.fi>
parents: 11654
diff changeset
633 i_assert(db->io == NULL);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
634
7968
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
635 result = db->sync_result;
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
636 if (result == &sql_not_connected_result) {
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
637 /* we don't end up in pgsql's free function, so sync_result
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
638 won't be set to NULL if we don't do it here. */
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
639 db->sync_result = NULL;
14390
e05be9afaed0 pgsql: Fixed a potential crash if connection got closed during synchronous query.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
640 } else if (result == NULL) {
e05be9afaed0 pgsql: Fixed a potential crash if connection got closed during synchronous query.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
641 result = &sql_not_connected_result;
e05be9afaed0 pgsql: Fixed a potential crash if connection got closed during synchronous query.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
642 result->refcount++;
7968
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
643 }
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
644
7968
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
645 i_assert(db->io == NULL);
47483377feb4 pgsql: Don't crash in sync queries if db can't be connected to.
Timo Sirainen <tss@iki.fi>
parents: 7967
diff changeset
646 return result;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
647 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
648
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
649 static struct sql_result *
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
650 driver_pgsql_query_s(struct sql_db *_db, const char *query)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
651 {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
652 struct pgsql_db *db = (struct pgsql_db *)_db;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
653 struct sql_result *result;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
654
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
655 driver_pgsql_sync_init(db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
656 result = driver_pgsql_sync_query(db, query);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
657 driver_pgsql_sync_deinit(db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
658 return result;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
659 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
660
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 static int driver_pgsql_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
662 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
663 struct pgsql_result *result = (struct pgsql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 struct pgsql_db *db = (struct pgsql_db *)_result->db;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 if (result->rows != 0) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 /* second time we're here */
9271
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
668 if (++result->rownum < result->rows)
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
669 return 1;
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
670
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
671 /* end of this packet. see if there's more. FIXME: this may
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
672 block, but the current API doesn't provide a non-blocking
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
673 way to do this.. */
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
674 PQclear(result->pgres);
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
675 result->pgres = PQgetResult(db->pg);
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
676 if (result->pgres == NULL)
d467712aee77 pgsql: We didn't read all the SQL packets replies from the server.
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
677 return 0;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
679
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
680 if (result->pgres == NULL) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
681 _result->failed = TRUE;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 return -1;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
683 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 switch (PQresultStatus(result->pgres)) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 case PGRES_COMMAND_OK:
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 /* no rows returned */
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 return 0;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689 case PGRES_TUPLES_OK:
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 result->rows = PQntuples(result->pgres);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 return result->rows > 0;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 case PGRES_EMPTY_QUERY:
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 case PGRES_NONFATAL_ERROR:
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694 /* nonfatal error */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
695 _result->failed = TRUE;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696 return -1;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697 default:
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 /* treat as fatal error */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
699 _result->failed = TRUE;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
700 db->fatal_error = TRUE;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701 return -1;
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
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 static void driver_pgsql_result_fetch_fields(struct pgsql_result *result)
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 unsigned int i;
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 if (result->fields != NULL)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710 return;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712 /* @UNSAFE */
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 result->fields_count = PQnfields(result->pgres);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714 result->fields = i_new(const char *, result->fields_count);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715 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
716 result->fields[i] = PQfname(result->pgres, i);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 static unsigned int
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 driver_pgsql_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
721 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722 struct pgsql_result *result = (struct pgsql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
723
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724 driver_pgsql_result_fetch_fields(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 return result->fields_count;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 static const char *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729 driver_pgsql_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
730 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 struct pgsql_result *result = (struct pgsql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 driver_pgsql_result_fetch_fields(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734 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
735 return result->fields[idx];
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
737
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
738 static int driver_pgsql_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
739 const char *field_name)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741 struct pgsql_result *result = (struct pgsql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 unsigned int i;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 driver_pgsql_result_fetch_fields(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745 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
746 if (strcmp(result->fields[i], field_name) == 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 return i;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 return -1;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 static const char *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
753 driver_pgsql_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
754 unsigned int idx)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756 struct pgsql_result *result = (struct pgsql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
758 if (PQgetisnull(result->pgres, result->rownum, idx))
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759 return NULL;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761 return PQgetvalue(result->pgres, result->rownum, idx);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
764 static const unsigned char *
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
765 driver_pgsql_result_get_field_value_binary(struct sql_result *_result,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
766 unsigned int idx, size_t *size_r)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
767 {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
768 struct pgsql_result *result = (struct pgsql_result *)_result;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
769 const char *value;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
770 struct pgsql_binary_value *binary_value;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
771
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
772 if (PQgetisnull(result->pgres, result->rownum, idx)) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
773 *size_r = 0;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
774 return NULL;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
775 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
776
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
777 value = PQgetvalue(result->pgres, result->rownum, idx);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
778
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
779 if (!array_is_created(&result->binary_values))
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
780 i_array_init(&result->binary_values, idx + 1);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
781
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
782 binary_value = array_idx_modifiable(&result->binary_values, idx);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
783 if (binary_value->value == NULL) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
784 binary_value->value =
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
785 PQunescapeBytea((const unsigned char *)value,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
786 &binary_value->size);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
787 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
788
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
789 *size_r = binary_value->size;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
790 return binary_value->value;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
791 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
792
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
793 static const char *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
794 driver_pgsql_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
795 const char *field_name)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797 int idx;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
798
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 idx = driver_pgsql_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
800 if (idx < 0)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 return NULL;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802 return driver_pgsql_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
803 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805 static const char *const *
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806 driver_pgsql_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
807 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
808 struct pgsql_result *result = (struct pgsql_result *)_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
809 unsigned int i;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811 if (result->values == NULL) {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
812 driver_pgsql_result_fetch_fields(result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 result->values = i_new(const char *, result->fields_count);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
814 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816 /* @UNSAFE */
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
817 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
818 result->values[i] =
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
819 driver_pgsql_result_get_field_value(_result, i);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
820 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
821
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
822 return result->values;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
823 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
824
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
825 static const char *driver_pgsql_result_get_error(struct sql_result *_result)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
826 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827 struct pgsql_result *result = (struct pgsql_result *)_result;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
828 struct pgsql_db *db = (struct pgsql_db *)_result->db;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
829 const char *msg;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830 size_t len;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831
8615
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
832 i_free_and_null(db->error);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
834 if (result->timeout) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
835 db->error = i_strdup("Query timed out");
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
836 } else if (result->pgres == NULL) {
8615
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
837 /* connection error */
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
838 db->error = i_strdup(last_error(db));
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
839 } else {
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
840 msg = PQresultErrorMessage(result->pgres);
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
841 if (msg == NULL)
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
842 return "(no error set)";
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
843
8615
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
844 /* Error message should contain trailing \n, we don't want it */
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
845 len = strlen(msg);
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
846 db->error = len == 0 || msg[len-1] != '\n' ?
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
847 i_strdup(msg) : i_strndup(msg, len-1);
57b00471cdc6 pgsql: If query fails because connection gets closed, return a proper error message.
Timo Sirainen <tss@iki.fi>
parents: 8614
diff changeset
848 }
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
849 return db->error;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
850 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
851
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
852 static struct sql_transaction_context *
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
853 driver_pgsql_transaction_begin(struct sql_db *db)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
854 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
855 struct pgsql_transaction_context *ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
856
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
857 ctx = i_new(struct pgsql_transaction_context, 1);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
858 ctx->ctx.db = db;
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
859 /* we need to be able to handle multiple open transactions, so at least
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
860 for now just keep them in memory until commit time. */
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
861 ctx->query_pool = pool_alloconly_create("pgsql transaction", 1024);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
862 return &ctx->ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
863 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
864
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
865 static void
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
866 driver_pgsql_transaction_free(struct pgsql_transaction_context *ctx)
8650
81fd92599c7f pgsql: Don't write to freed memory if transaction is aborted while SQL commands are being executed.
Timo Sirainen <tss@iki.fi>
parents: 8648
diff changeset
867 {
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
868 pool_unref(&ctx->query_pool);
8650
81fd92599c7f pgsql: Don't write to freed memory if transaction is aborted while SQL commands are being executed.
Timo Sirainen <tss@iki.fi>
parents: 8648
diff changeset
869 i_free(ctx);
81fd92599c7f pgsql: Don't write to freed memory if transaction is aborted while SQL commands are being executed.
Timo Sirainen <tss@iki.fi>
parents: 8648
diff changeset
870 }
81fd92599c7f pgsql: Don't write to freed memory if transaction is aborted while SQL commands are being executed.
Timo Sirainen <tss@iki.fi>
parents: 8648
diff changeset
871
81fd92599c7f pgsql: Don't write to freed memory if transaction is aborted while SQL commands are being executed.
Timo Sirainen <tss@iki.fi>
parents: 8648
diff changeset
872 static void
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
873 transaction_commit_callback(struct sql_result *result,
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
874 struct pgsql_transaction_context *ctx)
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
875 {
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
876 if (sql_result_next_row(result) < 0)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
877 ctx->callback(sql_result_get_error(result), ctx->context);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
878 else
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
879 ctx->callback(NULL, ctx->context);
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
880 driver_pgsql_transaction_free(ctx);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
881 }
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
882
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
883 static bool transaction_send_next(void *context)
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
884 {
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
885 struct pgsql_transaction_context *ctx = context;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
886
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
887 i_assert(!ctx->failed);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
888
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
889 if (ctx->ctx.db->state == SQL_DB_STATE_BUSY) {
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
890 /* kludgy.. */
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
891 ctx->ctx.db->state = SQL_DB_STATE_IDLE;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
892 } else if (!SQL_DB_IS_READY(ctx->ctx.db)) {
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
893 ctx->callback("Not connected", ctx->context);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
894 return FALSE;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
895 }
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
896
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
897 if (ctx->ctx.head != NULL) {
19211
68dd32223db7 pgsql: Avoid crash in multi-command transaction if one of the queries couldn't be sent to server.
Timo Sirainen <tss@iki.fi>
parents: 19204
diff changeset
898 struct sql_transaction_query *query = ctx->ctx.head;
68dd32223db7 pgsql: Avoid crash in multi-command transaction if one of the queries couldn't be sent to server.
Timo Sirainen <tss@iki.fi>
parents: 19204
diff changeset
899
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
900 ctx->ctx.head = ctx->ctx.head->next;
19211
68dd32223db7 pgsql: Avoid crash in multi-command transaction if one of the queries couldn't be sent to server.
Timo Sirainen <tss@iki.fi>
parents: 19204
diff changeset
901 sql_query(ctx->ctx.db, query->query,
68dd32223db7 pgsql: Avoid crash in multi-command transaction if one of the queries couldn't be sent to server.
Timo Sirainen <tss@iki.fi>
parents: 19204
diff changeset
902 transaction_update_callback, query);
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
903 } else {
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
904 sql_query(ctx->ctx.db, "COMMIT",
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
905 transaction_commit_callback, ctx);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
906 }
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
907 return TRUE;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
908 }
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
909
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
910 static void
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
911 transaction_begin_callback(struct sql_result *result,
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
912 struct pgsql_transaction_context *ctx)
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
913 {
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
914 struct pgsql_db *db = (struct pgsql_db *)result->db;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
915
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
916 i_assert(result->db == ctx->ctx.db);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
917
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
918 if (sql_result_next_row(result) < 0) {
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
919 ctx->callback(sql_result_get_error(result), ctx->context);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
920 driver_pgsql_transaction_free(ctx);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
921 return;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
922 }
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
923 i_assert(db->next_callback == NULL);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
924 db->next_callback = transaction_send_next;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
925 db->next_context = ctx;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
926 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
927
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
928 static void
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
929 transaction_update_callback(struct sql_result *result,
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
930 struct sql_transaction_query *query)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
931 {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
932 struct pgsql_transaction_context *ctx =
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
933 (struct pgsql_transaction_context *)query->trans;
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
934 struct pgsql_db *db = (struct pgsql_db *)result->db;
8617
e3fd1a6467f2 pgsql: If query failed because connection was lost, retry it automatically.
Timo Sirainen <tss@iki.fi>
parents: 8616
diff changeset
935
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
936 if (sql_result_next_row(result) < 0) {
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
937 ctx->callback(sql_result_get_error(result), ctx->context);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
938 driver_pgsql_transaction_free(ctx);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
939 return;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
940 }
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
941
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
942 if (query->affected_rows != NULL) {
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
943 struct pgsql_result *pg_result = (struct pgsql_result *)result;
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
944
19036
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
945 if (str_to_uint(PQcmdTuples(pg_result->pgres),
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
946 query->affected_rows) < 0)
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
947 i_unreached();
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
948 }
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
949 i_assert(db->next_callback == NULL);
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
950 db->next_callback = transaction_send_next;
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
951 db->next_context = ctx;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
952 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
953
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
954 static void
19204
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
955 transaction_trans_query_callback(struct sql_result *result,
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
956 struct sql_transaction_query *query)
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
957 {
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
958 struct pgsql_transaction_context *ctx =
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
959 (struct pgsql_transaction_context *)query->trans;
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
960
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
961 if (sql_result_next_row(result) < 0) {
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
962 ctx->callback(sql_result_get_error(result), ctx->context);
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
963 driver_pgsql_transaction_free(ctx);
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
964 return;
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
965 }
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
966
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
967 if (query->affected_rows != NULL) {
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
968 struct pgsql_result *pg_result = (struct pgsql_result *)result;
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
969
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
970 if (str_to_uint(PQcmdTuples(pg_result->pgres),
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
971 query->affected_rows) < 0)
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
972 i_unreached();
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
973 }
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
974 ctx->callback(NULL, ctx->context);
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
975 driver_pgsql_transaction_free(ctx);
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
976 }
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
977
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
978 static void
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
979 driver_pgsql_transaction_commit(struct sql_transaction_context *_ctx,
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
980 sql_commit_callback_t *callback, void *context)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
981 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
982 struct pgsql_transaction_context *ctx =
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
983 (struct pgsql_transaction_context *)_ctx;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
984
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
985 ctx->callback = callback;
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
986 ctx->context = context;
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
987
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
988 if (ctx->failed || _ctx->head == NULL) {
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
989 callback(ctx->failed ? ctx->error : NULL, context);
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
990 driver_pgsql_transaction_free(ctx);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
991 } else if (_ctx->head->next == NULL) {
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
992 /* just a single query, send it */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
993 sql_query(_ctx->db, _ctx->head->query,
19204
beb3b8496b7d pgsql: Fixed committing a single sql_update_get_rows() transaction.
Timo Sirainen <tss@iki.fi>
parents: 19203
diff changeset
994 transaction_trans_query_callback, _ctx->head);
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
995 } else {
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
996 /* multiple queries, use a transaction */
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
997 i_assert(_ctx->db->v.query == driver_pgsql_query);
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
998 sql_query(_ctx->db, "BEGIN", transaction_begin_callback, ctx);
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
999 }
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1000 }
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
1001
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1002 static void
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1003 commit_multi_fail(struct pgsql_transaction_context *ctx,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1004 struct sql_result *result, const char *query)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1005 {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1006 ctx->failed = TRUE;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1007 ctx->error = t_strdup_printf("%s (query: %s)",
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1008 sql_result_get_error(result), query);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1009 sql_result_unref(result);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1010 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1011
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1012 static struct sql_result *
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1013 driver_pgsql_transaction_commit_multi(struct pgsql_transaction_context *ctx)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1014 {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1015 struct pgsql_db *db = (struct pgsql_db *)ctx->ctx.db;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1016 struct sql_result *result;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1017 struct sql_transaction_query *query;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1018
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1019 result = driver_pgsql_sync_query(db, "BEGIN");
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1020 if (sql_result_next_row(result) < 0) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1021 commit_multi_fail(ctx, result, "BEGIN");
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1022 return NULL;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1023 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1024 sql_result_unref(result);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1025
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1026 /* send queries */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1027 for (query = ctx->ctx.head; query != NULL; query = query->next) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1028 result = driver_pgsql_sync_query(db, query->query);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1029 if (sql_result_next_row(result) < 0) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1030 commit_multi_fail(ctx, result, query->query);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1031 break;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1032 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1033 if (query->affected_rows != NULL) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1034 struct pgsql_result *pg_result =
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1035 (struct pgsql_result *)result;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1036
19036
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
1037 if (str_to_uint(PQcmdTuples(pg_result->pgres),
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
1038 query->affected_rows) < 0)
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
1039 i_unreached();
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1040 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1041 sql_result_unref(result);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1042 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1043
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1044 return driver_pgsql_sync_query(db, ctx->failed ?
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1045 "ROLLBACK" : "COMMIT");
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1046 }
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1047
13821
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1048 static void
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1049 driver_pgsql_try_commit_s(struct pgsql_transaction_context *ctx,
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1050 const char **error_r)
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1051 {
13821
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1052 struct sql_transaction_context *_ctx = &ctx->ctx;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1053 struct pgsql_db *db = (struct pgsql_db *)_ctx->db;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1054 struct sql_transaction_query *single_query = NULL;
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1055 struct sql_result *result;
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1056
13821
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1057 if (_ctx->head->next == NULL) {
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1058 /* just a single query, send it */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1059 single_query = _ctx->head;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1060 result = sql_query_s(_ctx->db, single_query->query);
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1061 } else {
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1062 /* multiple queries, use a transaction */
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1063 driver_pgsql_sync_init(db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1064 result = driver_pgsql_transaction_commit_multi(ctx);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1065 driver_pgsql_sync_deinit(db);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
1066 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
1067
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1068 if (ctx->failed) {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1069 i_assert(ctx->error != NULL);
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1070 *error_r = ctx->error;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1071 } else if (result != NULL) {
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1072 if (sql_result_next_row(result) < 0)
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1073 *error_r = sql_result_get_error(result);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1074 else if (single_query != NULL &&
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1075 single_query->affected_rows != NULL) {
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
1076 struct pgsql_result *pg_result =
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
1077 (struct pgsql_result *)result;
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
1078
19036
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
1079 if (str_to_uint(PQcmdTuples(pg_result->pgres),
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
1080 single_query->affected_rows) < 0)
f78e38c7cba2 Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents: 18698
diff changeset
1081 i_unreached();
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
1082 }
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1083 }
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1084 if (result != NULL)
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 9248
diff changeset
1085 sql_result_unref(result);
13821
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1086 }
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1087
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1088 static int
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1089 driver_pgsql_transaction_commit_s(struct sql_transaction_context *_ctx,
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1090 const char **error_r)
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1091 {
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1092 struct pgsql_transaction_context *ctx =
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1093 (struct pgsql_transaction_context *)_ctx;
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1094 struct pgsql_db *db = (struct pgsql_db *)_ctx->db;
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1095
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1096 *error_r = NULL;
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1097
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1098 if (_ctx->head != NULL) {
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1099 driver_pgsql_try_commit_s(ctx, error_r);
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1100 if (_ctx->db->state == SQL_DB_STATE_DISCONNECTED) {
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1101 *error_r = t_strdup(*error_r);
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1102 i_info("%s: Disconnected from database, "
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1103 "retrying commit", pgsql_prefix(db));
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1104 if (sql_connect(_ctx->db) >= 0) {
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1105 ctx->failed = FALSE;
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1106 *error_r = NULL;
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1107 driver_pgsql_try_commit_s(ctx, error_r);
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1108 }
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1109 }
782f09d13ece lib-sql: If mysql/pgsql commit fails due to server disconnection, reconnect and retry.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
1110 }
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1111
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
1112 driver_pgsql_transaction_free(ctx);
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1113 return *error_r == NULL ? 0 : -1;
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1114 }
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1115
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1116 static void
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1117 driver_pgsql_transaction_rollback(struct sql_transaction_context *_ctx)
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1118 {
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1119 struct pgsql_transaction_context *ctx =
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1120 (struct pgsql_transaction_context *)_ctx;
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1121
19203
9ceeb1a5c492 pgsql: Fixed committing multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 19191
diff changeset
1122 driver_pgsql_transaction_free(ctx);
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1123 }
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1124
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1125 static void
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
1126 driver_pgsql_update(struct sql_transaction_context *_ctx, const char *query,
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9271
diff changeset
1127 unsigned int *affected_rows)
8684
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1128 {
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1129 struct pgsql_transaction_context *ctx =
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1130 (struct pgsql_transaction_context *)_ctx;
ad35aae691ce pgsql: Don't break when using multiple transactions.
Timo Sirainen <tss@iki.fi>
parents: 8653
diff changeset
1131
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1132 sql_transaction_add_query(_ctx, ctx->query_pool, query, affected_rows);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1133 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1134
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1135 static const char *
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1136 driver_pgsql_escape_blob(struct sql_db *_db ATTR_UNUSED,
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1137 const unsigned char *data, size_t size)
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1138 {
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1139 string_t *str = t_str_new(128);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1140
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1141 str_append(str, "E'\\x");
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1142 binary_to_hex_append(str, data, size);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1143 str_append_c(str, '\'');
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1144 return str_c(str);
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1145 }
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1146
11253
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 11003
diff changeset
1147 const struct sql_db driver_pgsql_db = {
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1148 .name = "pgsql",
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 11253
diff changeset
1149 .flags = SQL_DB_FLAG_POOLED,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
1150
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10000
diff changeset
1151 .v = {
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1152 .init = driver_pgsql_init_v,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1153 .deinit = driver_pgsql_deinit_v,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1154 .connect = driver_pgsql_connect,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1155 .disconnect = driver_pgsql_disconnect,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1156 .escape_string = driver_pgsql_escape_string,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1157 .exec = driver_pgsql_exec,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1158 .query = driver_pgsql_query,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1159 .query_s = driver_pgsql_query_s,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
1160
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1161 .transaction_begin = driver_pgsql_transaction_begin,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1162 .transaction_commit = driver_pgsql_transaction_commit,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1163 .transaction_commit_s = driver_pgsql_transaction_commit_s,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1164 .transaction_rollback = driver_pgsql_transaction_rollback,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
1165
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1166 .update = driver_pgsql_update,
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 19057
diff changeset
1167
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1168 .escape_blob = driver_pgsql_escape_blob,
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1169 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1170 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1171
11253
da497a62cf44 lib-sql: Make driver structs const.
Timo Sirainen <tss@iki.fi>
parents: 11003
diff changeset
1172 const struct sql_result driver_pgsql_result = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10000
diff changeset
1173 .v = {
22513
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1174 .free = driver_pgsql_result_free,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1175 .next_row = driver_pgsql_result_next_row,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1176 .get_fields_count = driver_pgsql_result_get_fields_count,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1177 .get_field_name = driver_pgsql_result_get_field_name,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1178 .find_field = driver_pgsql_result_find_field,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1179 .get_field_value = driver_pgsql_result_get_field_value,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1180 .get_field_value_binary = driver_pgsql_result_get_field_value_binary,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1181 .find_field_value = driver_pgsql_result_find_field_value,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1182 .get_values = driver_pgsql_result_get_values,
59b0c5ee8adf lib-sql: Explicitly specify used *_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
1183 .get_error = driver_pgsql_result_get_error,
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 5495
diff changeset
1184 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1185 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1186
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
1187 const char *driver_pgsql_version = DOVECOT_ABI_VERSION;
12676
b8896cfa38cb lib-sql: Include Dovecot version number check when loading SQL plugins.
Timo Sirainen <tss@iki.fi>
parents: 12176
diff changeset
1188
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1189 void driver_pgsql_init(void);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1190 void driver_pgsql_deinit(void);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1191
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1192 void driver_pgsql_init(void)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1193 {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1194 sql_driver_register(&driver_pgsql_db);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1195 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1196
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1197 void driver_pgsql_deinit(void)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1198 {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1199 sql_driver_unregister(&driver_pgsql_db);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1200 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1201
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1202 #endif