]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: Added sql_transaction_commit2()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 17 Jul 2016 18:33:41 +0000 (12:33 -0600)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 17 Jul 2016 18:35:03 +0000 (12:35 -0600)
In v2.3 the sql_transaction_commit() API was just modified, but for now
we'll add this _commit2() to preserve API compatibility.

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

index ee61cd1303a0dffd1b28805c4d4536a52a7a2b22..9b1215fd3977548e990b1a312f747b812fb5f232 100644 (file)
@@ -1341,7 +1341,8 @@ const struct sql_db driver_cassandra_db = {
 
                driver_cassandra_update,
 
-               driver_cassandra_escape_blob
+               driver_cassandra_escape_blob,
+               NULL
        }
 };
 
index d63ba1d00c14911a65be6c9989f4eb6a1b416a90..ca7788dbc69be33830bfefef84ea3fba4b3a06d7 100644 (file)
@@ -678,7 +678,8 @@ const struct sql_db driver_mysql_db = {
 
                driver_mysql_update,
 
-               driver_mysql_escape_blob
+               driver_mysql_escape_blob,
+               NULL
        }
 };
 
index dc13f8a93e7c11138d5485582b1f5504c343c263..d087f1a1629b37670a48f6d59c1ec01361818971 100644 (file)
@@ -1165,7 +1165,8 @@ const struct sql_db driver_pgsql_db = {
 
                driver_pgsql_update,
 
-               driver_pgsql_escape_blob
+               driver_pgsql_escape_blob,
+               NULL
        }
 };
 
index de8ac1edddc257347cce7f72630ab513a9bdbd97..480d3f9d77c908a1a6a50c7ee0d90b8823a4b4bc 100644 (file)
@@ -425,7 +425,8 @@ const struct sql_db driver_sqlite_db = {
                driver_sqlite_transaction_rollback,
                driver_sqlite_update,
 
-               driver_sqlite_escape_blob
+               driver_sqlite_escape_blob,
+               NULL
        }
 };
 
index 3f8feb5f405ecd75ad5cce2d8452b50cbcd313a3..f3084d2b8ab4e857be32127df86e87636042baae 100644 (file)
@@ -832,6 +832,7 @@ struct sql_db driver_sqlpool_db = {
 
                driver_sqlpool_update,
 
-               driver_sqlpool_escape_blob
+               driver_sqlpool_escape_blob,
+               NULL
        }
 };
index 530e61ab6b5c00064392abc850c329d3ed5de1c2..ff75946104ff3b01b8fbe1e84a0cccee4ec7fc26 100644 (file)
@@ -78,6 +78,9 @@ struct sql_db_vfuncs {
                       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 {
index d9e879095f6c0e1657e42899d2b0b0db6a588871..d5073902e5d4c8c747493173a4577b630bdcb12e 100644 (file)
@@ -350,6 +350,20 @@ struct sql_transaction_context *sql_transaction_begin(struct sql_db *db)
        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 @@ void sql_transaction_commit(struct sql_transaction_context **_ctx,
        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,
index b0abc3bb02f23e12d4fa11981724c79aff7cc873..065b5b842fa5cb2a26740b782388baf9b1b70051 100644 (file)
@@ -48,8 +48,14 @@ enum sql_result_error_type {
 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 @@ void sql_transaction_commit(struct sql_transaction_context **ctx,
                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);