#include "portable.h"
#include <stdio.h>
-#include <errno.h>
+#include <ac/errno.h>
#include <ac/string.h>
#define PORTER_OBJ "bdb2_backend"
-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 ( ( slapMode != SLAP_SERVER_MODE ) && ( slapMode != SLAP_TOOL_MODE ) )
- 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_TRACE, "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 ( ( slapMode != SLAP_SERVER_MODE ) && ( slapMode != SLAP_TOOL_MODE ) )
- 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_TRACE, "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 );
}