1 /* porter.c - port functions of the bdb2 backend */
11 #include "back-bdb2.h"
13 #define PORTER_OBJ "bdb2_backend"
17 bdb2i_enter_backend_rw( DB_LOCK *lock, int writer )
20 db_lockmode_t lock_type;
26 case SLAP_SERVER_MODE:
27 case SLAP_TIMEDSERVER_MODE:
29 case SLAP_TOOLID_MODE:
30 if ( ( ret = lock_id( bdb2i_dbEnv.lk_info, &locker )) != 0 ) {
32 Debug( LDAP_DEBUG_ANY,
33 "bdb2i_enter_backend(): unable to get locker id -- %s\n",
34 strerror( ret ), 0, 0 );
39 lock_type = writer ? DB_LOCK_WRITE : DB_LOCK_READ;
40 lock_dbt.data = PORTER_OBJ;
41 lock_dbt.size = strlen( PORTER_OBJ );
43 switch ( ( ret = lock_get( bdb2i_dbEnv.lk_info, locker, 0,
44 &lock_dbt, lock_type, lock ))) {
47 Debug( LDAP_DEBUG_TRACE,
48 "bdb2i_enter_backend() -- %s lock granted\n",
49 writer ? "write" : "read", 0, 0 );
52 case DB_LOCK_NOTGRANTED:
53 Debug( LDAP_DEBUG_ANY,
54 "bdb2i_enter_backend() -- %s lock NOT granted\n",
55 writer ? "write" : "read", 0, 0 );
58 case DB_LOCK_DEADLOCK:
59 Debug( LDAP_DEBUG_ANY,
60 "bdb2i_enter_backend() -- %s lock returned DEADLOCK\n",
61 writer ? "write" : "read", 0, 0 );
66 Debug( LDAP_DEBUG_ANY,
67 "bdb2i_enter_backend() -- %s lock returned ERROR: %s\n",
68 writer ? "write" : "read", strerror( ret ), 0 );
75 /* if we are a writer and we have the backend lock,
76 start transaction control */
77 if ( writer && ( ret == 0 )) {
79 ret = bdb2i_start_transction( bdb2i_dbEnv.tx_info );
88 bdb2i_leave_backend_rw( DB_LOCK lock, int writer )
90 /* since one or more error can occure,
91 we must have several return codes that are or'ed at the end */
92 int ret_transaction = 0;
95 /* if we are a writer, finish the transaction */
98 ret_transaction = bdb2i_finish_transaction();
102 /* check whether checkpointing is needed */
103 ret_transaction |= bdb2i_set_txn_checkpoint( bdb2i_dbEnv.tx_info, 0 );
105 /* now release the lock */
106 switch ( slapMode ) {
108 case SLAP_SERVER_MODE:
109 case SLAP_TIMEDSERVER_MODE:
111 case SLAP_TOOLID_MODE:
112 switch( ( ret_lock = lock_put( bdb2i_dbEnv.lk_info, lock ))) {
115 Debug( LDAP_DEBUG_TRACE,
116 "bdb2i_leave_backend() -- %s lock released\n",
117 writer ? "write" : "read", 0, 0 );
120 case DB_LOCK_NOTHELD:
121 Debug( LDAP_DEBUG_ANY,
122 "bdb2i_leave_backend() -- %s lock NOT held\n",
123 writer ? "write" : "read", 0, 0 );
126 case DB_LOCK_DEADLOCK:
127 Debug( LDAP_DEBUG_ANY,
128 "bdb2i_leave_backend() -- %s lock returned DEADLOCK\n",
129 writer ? "write" : "read", 0, 0 );
134 Debug( LDAP_DEBUG_ANY,
135 "bdb2i_leave_backend() -- %s lock returned ERROR: %s\n",
136 writer ? "write" : "read", strerror( ret_lock ), 0 );
143 return( ret_transaction | ret_lock );