]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb2/porter.c
Factor out ldif2* intialization to ldif2common.c
[openldap] / servers / slapd / back-bdb2 / porter.c
index 6047463614c6611250745b16f1e8cc1d4169785e..26e36107730912ae4a10bae3266ddbfe3005505d 100644 (file)
@@ -3,7 +3,7 @@
 #include "portable.h"
 
 #include <stdio.h>
-#include <errno.h>
+#include <ac/errno.h>
 
 #include <ac/string.h>
 
 
 #define  PORTER_OBJ   "bdb2_backend"
 
-int  bdb2i_with_dbenv = 0;
 
-
-static int
-bdb2i_enter_backend( DB_ENV *dbEnv, DB_LOCK *lock, int writer )
+int
+bdb2i_enter_backend_rw( DB_LOCK *lock, int writer )
 {
        u_int32_t      locker;
        db_lockmode_t  lock_type;
        DBT            lock_dbt;
-       int            ret;
+       int            ret = 0;
 
-       if ( !bdb2i_with_dbenv ) return( 0 );
+       switch ( slapMode ) {
 
-       if ( ( ret = lock_id( dbEnv->lk_info, &locker )) != 0 ) {
+               case SLAP_SERVER_MODE:
+               case SLAP_TIMEDSERVER_MODE:
+               case SLAP_TOOL_MODE:
+               case SLAP_TOOLID_MODE:
+                       if ( ( ret = lock_id( bdb2i_dbEnv.lk_info, &locker )) != 0 ) {
 
-               Debug( LDAP_DEBUG_ANY,
-                               "bdb2i_enter_backend(): unable to get locker id -- %s\n",
-                               strerror( ret ), 0, 0 );
-               return( ret );
+                               Debug( LDAP_DEBUG_ANY,
+                                       "bdb2i_enter_backend(): unable to get locker id -- %s\n",
+                                       strerror( ret ), 0, 0 );
+                               return( ret );
 
-       }
+                       }
 
-       lock_type     = writer ? DB_LOCK_WRITE : DB_LOCK_READ;
-       lock_dbt.data = PORTER_OBJ;
-       lock_dbt.size = strlen( PORTER_OBJ );
+                       lock_type     = writer ? DB_LOCK_WRITE : DB_LOCK_READ;
+                       lock_dbt.data = PORTER_OBJ;
+                       lock_dbt.size = strlen( PORTER_OBJ );
 
-       switch ( ( ret = lock_get( dbEnv->lk_info, locker, 0, &lock_dbt,
-                                       lock_type, lock ))) {
+                       switch ( ( ret = lock_get( bdb2i_dbEnv.lk_info, locker, 0,
+                                                               &lock_dbt, lock_type, lock ))) {
 
-               case 0:
-                       Debug( LDAP_DEBUG_ANY, "bdb2i_enter_backend() -- %s lock granted\n",
+                               case 0:
+                                       Debug( LDAP_DEBUG_TRACE,
+                                               "bdb2i_enter_backend() -- %s lock granted\n",
                                                writer ? "write" : "read", 0, 0 );
-                       break;
+                                       break;
 
-               case DB_LOCK_NOTGRANTED:
-                       Debug( LDAP_DEBUG_ANY,
+                               case DB_LOCK_NOTGRANTED:
+                                       Debug( LDAP_DEBUG_ANY,
                                                "bdb2i_enter_backend() -- %s lock NOT granted\n",
                                                writer ? "write" : "read", 0, 0 );
-                       break;
+                                       break;
 
-               case DB_LOCK_DEADLOCK:
-                       Debug( LDAP_DEBUG_ANY,
+                               case DB_LOCK_DEADLOCK:
+                                       Debug( LDAP_DEBUG_ANY,
                                                "bdb2i_enter_backend() -- %s lock returned DEADLOCK\n",
                                                writer ? "write" : "read", 0, 0 );
-                       break;
+                                       break;
 
-               default:
-                       Debug( LDAP_DEBUG_ANY,
+                               default: 
+                                       ret = errno;
+                                       Debug( LDAP_DEBUG_ANY,
                                                "bdb2i_enter_backend() -- %s lock returned ERROR: %s\n",
-                                               writer ? "write" : "read", strerror( errno ), 0 );
-                       ret = errno;
+                                               writer ? "write" : "read", strerror( ret ), 0 );
+                                       break;
+
+                       }
                        break;
-                       
        }
 
-       return( ret );
-}
+       /*  if we are a writer and we have the backend lock,
+               start transaction control  */
+       if ( writer && ( ret == 0 )) {
 
+               ret = bdb2i_start_transction( bdb2i_dbEnv.tx_info );
 
-int
-bdb2i_enter_backend_r( DB_ENV *dbEnv, DB_LOCK *lock )
-{
-       return( bdb2i_enter_backend( dbEnv, lock, 0 ));
+       }
+
+       return( ret );
 }
 
 
 int
-bdb2i_enter_backend_w( DB_ENV *dbEnv, DB_LOCK *lock )
+bdb2i_leave_backend_rw( DB_LOCK lock, int writer )
 {
-       return( bdb2i_enter_backend( dbEnv, lock, 1 ));
-}
+       /*  since one or more error can occure,
+               we must have several return codes that are or'ed at the end  */
+       int   ret_transaction = 0;
+       int   ret_lock        = 0;
 
+       /*  if we are a writer, finish the transaction  */
+       if ( writer ) {
 
-int
-bdb2i_leave_backend( DB_ENV *dbEnv, DB_LOCK lock )
-{
-       int   ret;
+               ret_transaction = bdb2i_finish_transaction();
 
-       if ( !bdb2i_with_dbenv ) return( 0 );
+       }
 
-       switch( ( ret = lock_put( dbEnv->lk_info, lock ))) {
+       /*  check whether checkpointing is needed  */
+       ret_transaction |= bdb2i_set_txn_checkpoint( bdb2i_dbEnv.tx_info, 0 );
 
-               case 0:
-                       Debug( LDAP_DEBUG_ANY, "bdb2i_leave_backend() -- lock released\n",
-                                               0, 0, 0 );
-                       break;
+       /*  now release the lock  */
+       switch ( slapMode ) {
 
-               case DB_LOCK_NOTHELD:
-                       Debug( LDAP_DEBUG_ANY,
-                                               "bdb2i_leave_backend() -- lock NOT held\n",
-                                               0, 0, 0 );
-                       break;
+               case SLAP_SERVER_MODE:
+               case SLAP_TIMEDSERVER_MODE:
+               case SLAP_TOOL_MODE:
+               case SLAP_TOOLID_MODE:
+                       switch( ( ret_lock = lock_put( bdb2i_dbEnv.lk_info, lock ))) {
 
-               case DB_LOCK_DEADLOCK:
-                       Debug( LDAP_DEBUG_ANY,
-                                               "bdb2i_leave_backend() -- lock returned DEADLOCK\n",
-                                               0, 0, 0 );
-                       break;
+                               case 0:
+                                       Debug( LDAP_DEBUG_TRACE,
+                                               "bdb2i_leave_backend() -- %s lock released\n",
+                                               writer ? "write" : "read", 0, 0 );
+                                       break;
 
-               default:
-                       Debug( LDAP_DEBUG_ANY,
-                                               "bdb2i_leave_backend() -- lock returned ERROR: %s\n",
-                                               strerror( errno ), 0, 0 );
-                       ret = errno;
-                       break;
+                               case DB_LOCK_NOTHELD:
+                                       Debug( LDAP_DEBUG_ANY,
+                                               "bdb2i_leave_backend() -- %s lock NOT held\n",
+                                               writer ? "write" : "read", 0, 0 );
+                                       break;
+
+                               case DB_LOCK_DEADLOCK:
+                                       Debug( LDAP_DEBUG_ANY,
+                                               "bdb2i_leave_backend() -- %s lock returned DEADLOCK\n",
+                                               writer ? "write" : "read", 0, 0 );
+                                       break;
+
+                               default:
+                                       ret_lock = errno;
+                                       Debug( LDAP_DEBUG_ANY,
+                                               "bdb2i_leave_backend() -- %s lock returned ERROR: %s\n",
+                                               writer ? "write" : "read", strerror( ret_lock ), 0 );
+                                       break;
                        
+                       }
+                       break;
        }
 
-       return( ret );
-
+       return( ret_transaction | ret_lock );
 }