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