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;
 	}