p_strdup(pool, sql_result_get_field_value(result, 0));
}
- sql_result_free(result);
+ sql_result_unref(result);
return ret;
}
(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);
result->callback = TRUE;
callback(result, context);
result->callback = FALSE;
- sql_result_free(result);
+ sql_result_unref(result);
}
static struct sql_result *
break;
}
+ result->api.refcount = 1;
result->conn = conn;
return &result->api;
}
{
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)
ctx->failed = TRUE;
ret = -1;
}
- sql_result_free(result);
+ sql_result_unref(result);
return ret;
}
}
}
if (free_result)
- driver_pgsql_result_free(&result->api);
+ sql_result_unref(&result->api);
}
static void get_result(struct pgsql_result *result)
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);
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) {
*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);
result->callback = TRUE;
callback(result, context);
result->callback = FALSE;
- sql_result_free(result);
+ sql_result_unref(result);
}
static struct sql_result *
}
}
result->api.db = _db;
+ result->api.refcount = 1;
return &result->api;
}
struct sql_result {
struct sql_result_vfuncs v;
+ int refcount;
struct sql_db *db;
const struct sql_field_def *fields;
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);
}
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);