changeset 9270:f9ebd72a73e8 HEAD

SQL API change: SQL results can be now refed/unrefed.
author Timo Sirainen <tss@iki.fi>
date Tue, 12 May 2009 19:34:06 -0400
parents 2eecf682262a
children d467712aee77
files src/lib-dict/dict-sql.c src/lib-sql/driver-mysql.c src/lib-sql/driver-pgsql.c src/lib-sql/driver-sqlite.c src/lib-sql/sql-api-private.h src/lib-sql/sql-api.c src/lib-sql/sql-api.h
diffstat 7 files changed, 28 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict/dict-sql.c	Tue May 12 18:55:02 2009 -0400
+++ b/src/lib-dict/dict-sql.c	Tue May 12 19:34:06 2009 -0400
@@ -290,7 +290,7 @@
 			p_strdup(pool, sql_result_get_field_value(result, 0));
 	}
 
-	sql_result_free(result);
+	sql_result_unref(result);
 	return ret;
 }
 
@@ -444,7 +444,7 @@
 		(struct sql_dict_iterate_context *)_ctx;
 
 	if (ctx->result != NULL)
-		sql_result_free(ctx->result);
+		sql_result_unref(ctx->result);
 	str_free(&ctx->key);
 	i_free(ctx->path);
 	i_free(ctx);
--- a/src/lib-sql/driver-mysql.c	Tue May 12 18:55:02 2009 -0400
+++ b/src/lib-sql/driver-mysql.c	Tue May 12 19:34:06 2009 -0400
@@ -419,7 +419,7 @@
 	result->callback = TRUE;
 	callback(result, context);
 	result->callback = FALSE;
-	sql_result_free(result);
+	sql_result_unref(result);
 }
 
 static struct sql_result *
@@ -450,6 +450,7 @@
 		break;
 	}
 
+	result->api.refcount = 1;
 	result->conn = conn;
 	return &result->api;
 }
@@ -458,7 +459,8 @@
 {
 	struct mysql_result *result = (struct mysql_result *)_result;
 
-	if (_result == &sql_not_connected_result || _result->callback)
+	i_assert(_result != &sql_not_connected_result);
+	if (_result->callback)
 		return;
 
 	if (result->result != NULL)
@@ -607,7 +609,7 @@
 		ctx->failed = TRUE;
 		ret = -1;
 	}
-	sql_result_free(result);
+	sql_result_unref(result);
 	return ret;
 }
 
--- a/src/lib-sql/driver-pgsql.c	Tue May 12 18:55:02 2009 -0400
+++ b/src/lib-sql/driver-pgsql.c	Tue May 12 19:34:06 2009 -0400
@@ -351,7 +351,7 @@
 		}
 	}
 	if (free_result)
-		driver_pgsql_result_free(&result->api);
+		sql_result_unref(&result->api);
 }
 
 static void get_result(struct pgsql_result *result)
@@ -582,6 +582,7 @@
 	result = i_new(struct pgsql_result, 1);
 	result->api = driver_pgsql_result;
 	result->api.db = db;
+	result->api.refcount = 1;
 	result->callback = exec_callback;
 	if (retry_query) {
 		result->query = i_strdup(query);
@@ -605,6 +606,7 @@
 	result = i_new(struct pgsql_result, 1);
 	result->api = driver_pgsql_result;
 	result->api.db = db;
+	result->api.refcount = 1;
 	result->callback = callback;
 	result->context = context;
 	if (retry_query) {
@@ -995,7 +997,7 @@
 			*error_r = sql_result_get_error(result);
 	}
 	if (result != NULL)
-		sql_result_free(result);
+		sql_result_unref(result);
 
 	i_assert(ctx->refcount == 1);
 	driver_pgsql_transaction_unref(ctx);
--- a/src/lib-sql/driver-sqlite.c	Tue May 12 18:55:02 2009 -0400
+++ b/src/lib-sql/driver-sqlite.c	Tue May 12 19:34:06 2009 -0400
@@ -143,7 +143,7 @@
 	result->callback = TRUE;
 	callback(result, context);
 	result->callback = FALSE;
-	sql_result_free(result);
+	sql_result_unref(result);
 }
 
 static struct sql_result *
@@ -172,6 +172,7 @@
 		}
 	}
 	result->api.db = _db;
+	result->api.refcount = 1;
 
 	return &result->api;
 }
--- a/src/lib-sql/sql-api-private.h	Tue May 12 18:55:02 2009 -0400
+++ b/src/lib-sql/sql-api-private.h	Tue May 12 19:34:06 2009 -0400
@@ -73,6 +73,7 @@
 
 struct sql_result {
 	struct sql_result_vfuncs v;
+	int refcount;
 
 	struct sql_db *db;
 	const struct sql_field_def *fields;
--- a/src/lib-sql/sql-api.c	Tue May 12 18:55:02 2009 -0400
+++ b/src/lib-sql/sql-api.c	Tue May 12 19:34:06 2009 -0400
@@ -97,8 +97,17 @@
 	return db->v.query_s(db, query);
 }
 
-void sql_result_free(struct sql_result *result)
+void sql_result_ref(struct sql_result *result)
 {
+	result->refcount++;
+}
+
+void sql_result_unref(struct sql_result *result)
+{
+	i_assert(result->refcount > 0);
+	if (--result->refcount > 0)
+		return;
+
 	i_free(result->map);
 	result->v.free(result);
 }
--- a/src/lib-sql/sql-api.h	Tue May 12 18:55:02 2009 -0400
+++ b/src/lib-sql/sql-api.h	Tue May 12 19:34:06 2009 -0400
@@ -94,8 +94,10 @@
    occurred. This needs to be the first call for result. */
 int sql_result_next_row(struct sql_result *result);
 
-/* Needs to be called only with sql_query_s(). */
-void sql_result_free(struct sql_result *result);
+void sql_result_ref(struct sql_result *result);
+/* Needs to be called only with sql_query_s() or when result has been
+   explicitly referenced. */
+void sql_result_unref(struct sql_result *result);
 
 /* Return number of fields in result. */
 unsigned int sql_result_get_fields_count(struct sql_result *result);