changeset 20528:b885fee56a82

lib-sql: Added sql_transaction_commit2() In v2.3 the sql_transaction_commit() API was just modified, but for now we'll add this _commit2() to preserve API compatibility.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 17 Jul 2016 12:33:41 -0600
parents 231c1f214d40
children 6450eb09e83c
files src/lib-sql/driver-cassandra.c src/lib-sql/driver-mysql.c src/lib-sql/driver-pgsql.c src/lib-sql/driver-sqlite.c src/lib-sql/driver-sqlpool.c src/lib-sql/sql-api-private.h src/lib-sql/sql-api.c src/lib-sql/sql-api.h
diffstat 8 files changed, 83 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-sql/driver-cassandra.c	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/driver-cassandra.c	Sun Jul 17 12:33:41 2016 -0600
@@ -1341,7 +1341,8 @@
 
 		driver_cassandra_update,
 
-		driver_cassandra_escape_blob
+		driver_cassandra_escape_blob,
+		NULL
 	}
 };
 
--- a/src/lib-sql/driver-mysql.c	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/driver-mysql.c	Sun Jul 17 12:33:41 2016 -0600
@@ -678,7 +678,8 @@
 
 		driver_mysql_update,
 
-		driver_mysql_escape_blob
+		driver_mysql_escape_blob,
+		NULL
 	}
 };
 
--- a/src/lib-sql/driver-pgsql.c	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/driver-pgsql.c	Sun Jul 17 12:33:41 2016 -0600
@@ -1165,7 +1165,8 @@
 
 		driver_pgsql_update,
 
-		driver_pgsql_escape_blob
+		driver_pgsql_escape_blob,
+		NULL
 	}
 };
 
--- a/src/lib-sql/driver-sqlite.c	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/driver-sqlite.c	Sun Jul 17 12:33:41 2016 -0600
@@ -425,7 +425,8 @@
 		driver_sqlite_transaction_rollback,
 		driver_sqlite_update,
 
-		driver_sqlite_escape_blob
+		driver_sqlite_escape_blob,
+		NULL
 	}
 };
 
--- a/src/lib-sql/driver-sqlpool.c	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/driver-sqlpool.c	Sun Jul 17 12:33:41 2016 -0600
@@ -832,6 +832,7 @@
 
 		driver_sqlpool_update,
 
-		driver_sqlpool_escape_blob
+		driver_sqlpool_escape_blob,
+		NULL
 	}
 };
--- a/src/lib-sql/sql-api-private.h	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/sql-api-private.h	Sun Jul 17 12:33:41 2016 -0600
@@ -78,6 +78,9 @@
 		       unsigned int *affected_rows);
 	const char *(*escape_blob)(struct sql_db *db,
 				   const unsigned char *data, size_t size);
+	void (*transaction_commit2)(struct sql_transaction_context *ctx,
+				    sql_commit2_callback_t *callback,
+				    void *context);
 };
 
 struct sql_db {
--- a/src/lib-sql/sql-api.c	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/sql-api.c	Sun Jul 17 12:33:41 2016 -0600
@@ -350,6 +350,20 @@
 	return db->v.transaction_begin(db);
 }
 
+struct sql_commit1_wrap_ctx {
+	sql_commit_callback_t *callback;
+	void *context;
+};
+
+static void sql_commit1_wrap(const struct sql_commit_result *result,
+			     void *context)
+{
+	struct sql_commit1_wrap_ctx *ctx = context;
+
+	ctx->callback(result->error, ctx->context);
+	i_free(ctx);
+}
+
 #undef sql_transaction_commit
 void sql_transaction_commit(struct sql_transaction_context **_ctx,
 			    sql_commit_callback_t *callback, void *context)
@@ -357,7 +371,49 @@
 	struct sql_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
-	ctx->db->v.transaction_commit(ctx, callback, context);
+	if (ctx->db->v.transaction_commit != NULL)
+		ctx->db->v.transaction_commit(ctx, callback, context);
+	else {
+		struct sql_commit1_wrap_ctx *wrap;
+
+		wrap = i_new(struct sql_commit1_wrap_ctx, 1);
+		wrap->callback = callback;
+		wrap->context = context;
+		ctx->db->v.transaction_commit2(ctx, sql_commit1_wrap, wrap);
+	}
+}
+
+struct sql_commit2_wrap_ctx {
+	sql_commit2_callback_t *callback;
+	void *context;
+};
+
+static void sql_commit2_wrap(const char *error, void *context)
+{
+	struct sql_commit2_wrap_ctx *ctx = context;
+	struct sql_commit_result result = { .error = error };
+
+	ctx->callback(&result, ctx->context);
+	i_free(ctx);
+}
+
+#undef sql_transaction_commit2
+void sql_transaction_commit2(struct sql_transaction_context **_ctx,
+			     sql_commit2_callback_t *callback, void *context)
+{
+	struct sql_transaction_context *ctx = *_ctx;
+
+	*_ctx = NULL;
+	if (ctx->db->v.transaction_commit2 != NULL)
+		ctx->db->v.transaction_commit2(ctx, callback, context);
+	else {
+		struct sql_commit2_wrap_ctx *wrap;
+
+		wrap = i_new(struct sql_commit2_wrap_ctx, 1);
+		wrap->callback = callback;
+		wrap->context = context;
+		ctx->db->v.transaction_commit(ctx, sql_commit2_wrap, wrap);
+	}
 }
 
 int sql_transaction_commit_s(struct sql_transaction_context **_ctx,
--- a/src/lib-sql/sql-api.h	Fri Jul 15 16:40:31 2016 -0500
+++ b/src/lib-sql/sql-api.h	Sun Jul 17 12:33:41 2016 -0600
@@ -48,8 +48,14 @@
 struct sql_db;
 struct sql_result;
 
+struct sql_commit_result {
+	const char *error;
+	enum sql_result_error_type error_type;
+};
+
 typedef void sql_query_callback_t(struct sql_result *result, void *context);
 typedef void sql_commit_callback_t(const char *error, void *context);
+typedef void sql_commit2_callback_t(const struct sql_commit_result *result, void *context);
 
 void sql_drivers_init(void);
 void sql_drivers_deinit(void);
@@ -143,6 +149,13 @@
 		CALLBACK_TYPECHECK(callback, void (*)( \
 			const char *, typeof(context))), \
 		(sql_commit_callback_t *)callback, context)
+void sql_transaction_commit2(struct sql_transaction_context **ctx,
+			     sql_commit2_callback_t *callback, void *context);
+#define sql_transaction_commit2(ctx, callback, context) \
+	  sql_transaction_commit2(ctx + \
+		CALLBACK_TYPECHECK(callback, void (*)( \
+			const struct sql_commit_result *, typeof(context))), \
+		(sql_commit2_callback_t *)callback, context)
 /* Synchronous commit. Returns 0 if ok, -1 if error. */
 int sql_transaction_commit_s(struct sql_transaction_context **ctx,
 			     const char **error_r);