Mercurial > dovecot > core-2.2
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);