changeset 6791:4d6ba6cd1bbc HEAD

Don't break if driver_pgsql_query_s() fails because we're not connected.
author Timo Sirainen <tss@iki.fi>
date Mon, 12 Nov 2007 19:16:30 +0200
parents 7a985b3e6a7c
children 7005fc7e69dc
files src/lib-sql/driver-pgsql.c
diffstat 1 files changed, 24 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-sql/driver-pgsql.c	Mon Nov 12 19:02:14 2007 +0200
+++ b/src/lib-sql/driver-pgsql.c	Mon Nov 12 19:16:30 2007 +0200
@@ -403,21 +403,25 @@
 	i_free(queue);
 }
 
-static void queue_drop_timed_out_queries(struct pgsql_db *db)
+static void queue_abort_next(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 = queue_unlink_first(db);
 
-		queue->result->api = sql_not_connected_result;
-		queue->result->callback(&queue->result->api,
-					queue->result->context);
-		i_free(queue->result);
-		i_free(queue->query);
-		i_free(queue);
-	}
+	queue->result->callback(&sql_not_connected_result,
+				queue->result->context);
+	i_free(queue->result);
+	i_free(queue->query);
+	i_free(queue);
+}
+
+static void queue_drop_timed_out_queries(struct pgsql_db *db)
+{
+	while (db->queue != NULL &&
+	       db->queue->created + QUERY_TIMEOUT_SECS < ioloop_time)
+		queue_abort_next(db);
+
 }
 
 static void queue_timeout(struct pgsql_db *db)
@@ -569,8 +573,15 @@
 	db->query_finished = FALSE;
 	driver_pgsql_query(_db, query, pgsql_query_s_callback, db);
 
-	if (!db->query_finished)
-		io_loop_run(db->ioloop);
+	if (!db->query_finished) {
+		if (db->connected)
+			io_loop_run(db->ioloop);
+		else {
+			if (db->queue_to != NULL)
+				timeout_remove(&db->queue_to);
+			queue_abort_next(db);
+		}
+	}
 	io_loop_destroy(&db->ioloop);
 
 	i_assert(db->io == NULL);