changeset 8733:b899076947cf HEAD

pgsql: Fixes to handling reconnecting to server.
author Timo Sirainen <tss@iki.fi>
date Fri, 06 Feb 2009 17:40:10 -0500
parents 4142c933e231
children f8e407d832b8
files src/lib-sql/driver-pgsql.c
diffstat 1 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-sql/driver-pgsql.c	Fri Feb 06 17:19:57 2009 -0500
+++ b/src/lib-sql/driver-pgsql.c	Fri Feb 06 17:40:10 2009 -0500
@@ -254,7 +254,10 @@
 			return;
 	} while (PQgetResult(db->pg) != NULL);
 
-	io_remove(&db->io);
+	if (PQstatus(db->pg) == CONNECTION_BAD)
+		io_remove_closed(&db->io);
+	else
+		io_remove(&db->io);
 
 	db->querying = FALSE;
 	if (db->queue != NULL && db->connected)
@@ -310,8 +313,12 @@
 	bool free_result = TRUE, retry = FALSE;
 	bool disconnected;
 
-	disconnected = PQstatus(db->pg) == CONNECTION_BAD;
-	if (disconnected && result->pgres == NULL && result->retry_query) {
+	/* if connection to server was lost, we don't yet see that the
+	   connection is bad. we only see the fatal error, so assume it also
+	   means disconnection. */
+	disconnected = PQstatus(db->pg) == CONNECTION_BAD ||
+		PQresultStatus(result->pgres) == PGRES_FATAL_ERROR;
+	if (disconnected && result->retry_query) {
 		/* retry the query */
 		i_error("pgsql: Query failed, retrying: %s", last_error(db));
 		retry = TRUE;
@@ -328,6 +335,10 @@
 
 	if (disconnected) {
 		/* disconnected */
+		if (result->pgres != NULL) {
+			PQclear(result->pgres);
+			result->pgres = NULL;
+		}
 		driver_pgsql_close(db);
 
 		if (retry) {