Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6251:3200be63749b HEAD
Timeout queued queries after a while if we can't connect to server.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 09 Aug 2007 20:38:17 +0300 |
parents | a5db1b4bc02c |
children | 27d9b2114266 |
files | src/lib-sql/driver-pgsql.c |
diffstat | 1 files changed, 27 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-sql/driver-pgsql.c Thu Aug 09 20:00:42 2007 +0300 +++ b/src/lib-sql/driver-pgsql.c Thu Aug 09 20:38:17 2007 +0300 @@ -11,6 +11,8 @@ #include <time.h> #include <libpq-fe.h> +#define QUERY_TIMEOUT_SECS 6 + struct pgsql_db { struct sql_db api; @@ -376,7 +378,7 @@ } } -static void queue_send_next(struct pgsql_db *db) +static struct pgsql_queue *queue_unlink_first(struct pgsql_db *db) { struct pgsql_queue *queue; @@ -385,19 +387,43 @@ if (db->queue == NULL) db->queue_tail = &db->queue; + return queue; +} +static void queue_send_next(struct pgsql_db *db) +{ + struct pgsql_queue *queue; + + queue = queue_unlink_first(db); send_query(queue->result, queue->query); i_free(queue->query); i_free(queue); } +static void queue_drop_timed_out_queries(struct pgsql_db *db) +{ + struct pgsql_queue *queue; + + while (db->queue != NULL && + db->queue->created + QUERY_TIMEOUT_SECS < ioloop_time) { + queue = queue_unlink_first(db); + + queue->result->api = sql_not_connected_result; + queue->result->callback(&queue->result->api, + queue->result->context); + i_free(queue->query); + i_free(queue); + } +} + static void queue_timeout(struct pgsql_db *db) { if (db->querying) return; if (!db->connected) { + queue_drop_timed_out_queries(db); driver_pgsql_connect(&db->api); return; }