Blob Blame Raw
From f786600c593a78c8f1cd96a12ac6059f41837dd9 Mon Sep 17 00:00:00 2001
From: Mark Reynolds <mreynolds@redhat.com>
Date: Fri, 21 Jun 2013 10:47:09 -0400
Subject: [PATCH 37/39] Ticket 47329 - Improve slapi_back_transaction_begin() return code when transactions are not available

    Bug Description:  The slapi_back_transaction_begin() function needs it's return codes
                      to be changed to be more friendly for plug-in writers when
                      transactions are not available.

    Fix Description:  Added new error code SLAPI_BACK_TRANSACTION_NOT_SUPPORTED, and
                      updated the slapi_plugin.h

    https://fedorahosted.org/389/ticket/47329

    Reviewed by: Noriko, Ludwig, and Rich(Thanks!!!)
(cherry picked from commit 8879ed2efa48e96f2b920a3ab83036b07e3b3ae4)
(cherry picked from commit badcb1ac60bfb4c54fe264088a3c730b2ce2ac11)
---
 ldap/servers/slapd/backend.c      |   26 +++++++++++++++++++++-----
 ldap/servers/slapd/slapi-plugin.h |    2 ++
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/ldap/servers/slapd/backend.c b/ldap/servers/slapd/backend.c
index ad253f1..ead251e 100644
--- a/ldap/servers/slapd/backend.c
+++ b/ldap/servers/slapd/backend.c
@@ -648,8 +648,13 @@ int
 slapi_back_transaction_begin(Slapi_PBlock *pb)
 {
     IFP txn_begin;
-    slapi_pblock_get(pb, SLAPI_PLUGIN_DB_BEGIN_FN, (void*)&txn_begin);
-    return txn_begin(pb);
+    if(slapi_pblock_get(pb, SLAPI_PLUGIN_DB_BEGIN_FN, (void*)&txn_begin) ||
+       !txn_begin)
+    {
+        return SLAPI_BACK_TRANSACTION_NOT_SUPPORTED;
+    } else {
+        return txn_begin(pb);
+    }
 }
 
 /* API to expose DB transaction commit */
@@ -657,7 +662,13 @@ int
 slapi_back_transaction_commit(Slapi_PBlock *pb)
 {
     IFP txn_commit;
-    slapi_pblock_get(pb, SLAPI_PLUGIN_DB_COMMIT_FN, (void*)&txn_commit);
+    if(slapi_pblock_get(pb, SLAPI_PLUGIN_DB_COMMIT_FN, (void*)&txn_commit) ||
+        !txn_commit)
+    {
+        return SLAPI_BACK_TRANSACTION_NOT_SUPPORTED;
+    } else {
+        return txn_commit(pb);
+    }
     return txn_commit(pb);
 }
 
@@ -666,6 +677,11 @@ int
 slapi_back_transaction_abort(Slapi_PBlock *pb)
 {
     IFP txn_abort;
-    slapi_pblock_get(pb, SLAPI_PLUGIN_DB_ABORT_FN, (void*)&txn_abort);
-    return txn_abort(pb);
+    if(slapi_pblock_get(pb, SLAPI_PLUGIN_DB_ABORT_FN, (void*)&txn_abort) ||
+        !txn_abort)
+    {
+        return SLAPI_BACK_TRANSACTION_NOT_SUPPORTED;
+    } else {
+        return txn_abort(pb);
+    }
 }
diff --git a/ldap/servers/slapd/slapi-plugin.h b/ldap/servers/slapd/slapi-plugin.h
index 2f2152b..d456af8 100644
--- a/ldap/servers/slapd/slapi-plugin.h
+++ b/ldap/servers/slapd/slapi-plugin.h
@@ -6067,6 +6067,7 @@ const char * slapi_be_gettype(Slapi_Backend *be);
  *
  * \param pb Pblock which is supposed to set (Slapi_Backend *) to SLAPI_BACKEND
  * \return 0 if successful
+ * \return SLAPI_BACK_TRANSACTION_NOT_SUPPORTED if transaction support is not available for this backend
  * \return Non-zero if an error occurred
  *
  * \see slapi_back_transaction_commit
@@ -6904,6 +6905,7 @@ typedef struct slapi_plugindesc {
 #define SLAPI_PARENT_TXN			190
 #define SLAPI_TXN				191
 #define SLAPI_TXN_RUV_MODS_FN			1901
+#define SLAPI_BACK_TRANSACTION_NOT_SUPPORTED	1902
 
 /*
  * The following are used to pass information back and forth
-- 
1.7.1