Mercurial > dovecot > core-2.2
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 |
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 | 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 | 93 i_assert(state == SQL_DB_STATE_BUSY || db->cur_result == NULL); |
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 | 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 |