]> git.sur5r.net Git - openldap/blob - servers/slapd/back-bdb2/porter.c
Use #ifdef, not #if
[openldap] / servers / slapd / back-bdb2 / porter.c
1 /* porter.c - port functions of the bdb2 backend */
2 /* $OpenLDAP$ */
3
4 #include "portable.h"
5
6 #include <stdio.h>
7 #include <ac/errno.h>
8
9 #include <ac/string.h>
10
11 #include "slap.h"
12 #include "back-bdb2.h"
13
14 #define  PORTER_OBJ   "bdb2_backend"
15
16
17 int
18 bdb2i_enter_backend_rw( DB_LOCK *lock, int writer )
19 {
20         u_int32_t      locker;
21         db_lockmode_t  lock_type;
22         DBT            lock_dbt;
23         int            ret = 0;
24
25         switch ( slapMode & SLAP_MODE ) {
26
27                 case SLAP_SERVER_MODE:
28                 case SLAP_TOOL_MODE:
29                         if ( ( ret = lock_id( bdb2i_dbEnv.lk_info, &locker )) != 0 ) {
30
31                                 Debug( LDAP_DEBUG_ANY,
32                                         "bdb2i_enter_backend(): unable to get locker id -- %s\n",
33                                         strerror( ret ), 0, 0 );
34                                 return( ret );
35
36                         }
37
38                         lock_type     = writer ? DB_LOCK_WRITE : DB_LOCK_READ;
39                         lock_dbt.data = PORTER_OBJ;
40                         lock_dbt.size = strlen( PORTER_OBJ );
41
42                         switch ( ( ret = lock_get( bdb2i_dbEnv.lk_info, locker, 0,
43                                                                 &lock_dbt, lock_type, lock ))) {
44
45                                 case 0:
46                                         Debug( LDAP_DEBUG_TRACE,
47                                                 "bdb2i_enter_backend() -- %s lock granted\n",
48                                                 writer ? "write" : "read", 0, 0 );
49                                         break;
50
51                                 case DB_LOCK_NOTGRANTED:
52                                         Debug( LDAP_DEBUG_ANY,
53                                                 "bdb2i_enter_backend() -- %s lock NOT granted\n",
54                                                 writer ? "write" : "read", 0, 0 );
55                                         break;
56
57                                 case DB_LOCK_DEADLOCK:
58                                         Debug( LDAP_DEBUG_ANY,
59                                                 "bdb2i_enter_backend() -- %s lock returned DEADLOCK\n",
60                                                 writer ? "write" : "read", 0, 0 );
61                                         break;
62
63                                 default: 
64                                         ret = errno;
65                                         Debug( LDAP_DEBUG_ANY,
66                                                 "bdb2i_enter_backend() -- %s lock returned ERROR: %s\n",
67                                                 writer ? "write" : "read", strerror( ret ), 0 );
68                                         break;
69
70                         }
71                         break;
72         }
73
74         /*  if we are a writer and we have the backend lock,
75                 start transaction control  */
76         if ( writer && ( ret == 0 )) {
77
78                 ret = bdb2i_start_transction( bdb2i_dbEnv.tx_info );
79
80         }
81
82         return( ret );
83 }
84
85
86 int
87 bdb2i_leave_backend_rw( DB_LOCK lock, int writer )
88 {
89         /*  since one or more error can occure,
90                 we must have several return codes that are or'ed at the end  */
91         int   ret_transaction = 0;
92         int   ret_lock        = 0;
93
94         /*  if we are a writer, finish the transaction  */
95         if ( writer ) {
96
97                 ret_transaction = bdb2i_finish_transaction();
98
99         }
100
101         /*  check whether checkpointing is needed  */
102         ret_transaction |= bdb2i_set_txn_checkpoint( bdb2i_dbEnv.tx_info, 0 );
103
104         /*  now release the lock  */
105         switch ( slapMode & SLAP_MODE ) {
106
107                 case SLAP_SERVER_MODE:
108                 case SLAP_TOOL_MODE:
109                         switch( ( ret_lock = lock_put( bdb2i_dbEnv.lk_info, lock ))) {
110
111                                 case 0:
112                                         Debug( LDAP_DEBUG_TRACE,
113                                                 "bdb2i_leave_backend() -- %s lock released\n",
114                                                 writer ? "write" : "read", 0, 0 );
115                                         break;
116
117                                 case DB_LOCK_NOTHELD:
118                                         Debug( LDAP_DEBUG_ANY,
119                                                 "bdb2i_leave_backend() -- %s lock NOT held\n",
120                                                 writer ? "write" : "read", 0, 0 );
121                                         break;
122
123                                 case DB_LOCK_DEADLOCK:
124                                         Debug( LDAP_DEBUG_ANY,
125                                                 "bdb2i_leave_backend() -- %s lock returned DEADLOCK\n",
126                                                 writer ? "write" : "read", 0, 0 );
127                                         break;
128
129                                 default:
130                                         ret_lock = errno;
131                                         Debug( LDAP_DEBUG_ANY,
132                                                 "bdb2i_leave_backend() -- %s lock returned ERROR: %s\n",
133                                                 writer ? "write" : "read", strerror( ret_lock ), 0 );
134                                         break;
135                         
136                         }
137                         break;
138         }
139
140         return( ret_transaction | ret_lock );
141 }
142
143