@@ -89,6 +89,12 @@ void __dbpanic(DB *db) {
89
89
mp_printf (& mp_plat_print , "__dbpanic(%p)\n" , db );
90
90
}
91
91
92
+ static void check_btree_is_open (mp_obj_btree_t * self ) {
93
+ if (!self -> db ) {
94
+ mp_raise_ValueError (MP_ERROR_TEXT ("database closed" ));
95
+ }
96
+ }
97
+
92
98
static mp_obj_btree_t * btree_new (DB * db , mp_obj_t stream ) {
93
99
mp_obj_btree_t * o = mp_obj_malloc (mp_obj_btree_t , (mp_obj_type_t * )& btree_type );
94
100
o -> stream = stream ;
@@ -114,19 +120,28 @@ static void btree_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind
114
120
115
121
static mp_obj_t btree_flush (mp_obj_t self_in ) {
116
122
mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
123
+ check_btree_is_open (self );
117
124
return MP_OBJ_NEW_SMALL_INT (__bt_sync (self -> db , 0 ));
118
125
}
119
126
static MP_DEFINE_CONST_FUN_OBJ_1 (btree_flush_obj , btree_flush ) ;
120
127
121
128
static mp_obj_t btree_close (mp_obj_t self_in ) {
122
129
mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
123
- return MP_OBJ_NEW_SMALL_INT (__bt_close (self -> db ));
130
+ int res ;
131
+ if (self -> db ) {
132
+ res = __bt_close (self -> db );
133
+ self -> db = NULL ;
134
+ } else {
135
+ res = RET_SUCCESS ; // Closing an already-closed DB always succeeds.
136
+ }
137
+ return MP_OBJ_NEW_SMALL_INT (res );
124
138
}
125
139
static MP_DEFINE_CONST_FUN_OBJ_1 (btree_close_obj , btree_close ) ;
126
140
127
141
static mp_obj_t btree_put (size_t n_args , const mp_obj_t * args ) {
128
142
(void )n_args ;
129
143
mp_obj_btree_t * self = MP_OBJ_TO_PTR (args [0 ]);
144
+ check_btree_is_open (self );
130
145
DBT key , val ;
131
146
buf_to_dbt (args [1 ], & key );
132
147
buf_to_dbt (args [2 ], & val );
@@ -136,6 +151,7 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_put_obj, 3, 4, btree_put);
136
151
137
152
static mp_obj_t btree_get (size_t n_args , const mp_obj_t * args ) {
138
153
mp_obj_btree_t * self = MP_OBJ_TO_PTR (args [0 ]);
154
+ check_btree_is_open (self );
139
155
DBT key , val ;
140
156
buf_to_dbt (args [1 ], & key );
141
157
int res = __bt_get (self -> db , & key , & val , 0 );
@@ -153,6 +169,7 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_get_obj, 2, 3, btree_get);
153
169
154
170
static mp_obj_t btree_seq (size_t n_args , const mp_obj_t * args ) {
155
171
mp_obj_btree_t * self = MP_OBJ_TO_PTR (args [0 ]);
172
+ check_btree_is_open (self );
156
173
int flags = MP_OBJ_SMALL_INT_VALUE (args [1 ]);
157
174
DBT key , val ;
158
175
if (n_args > 2 ) {
@@ -225,6 +242,7 @@ static mp_obj_t btree_getiter(mp_obj_t self_in, mp_obj_iter_buf_t *iter_buf) {
225
242
226
243
static mp_obj_t btree_iternext (mp_obj_t self_in ) {
227
244
mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
245
+ check_btree_is_open (self );
228
246
DBT key , val ;
229
247
int res ;
230
248
bool desc = self -> flags & FLAG_DESC ;
@@ -281,6 +299,7 @@ static mp_obj_t btree_iternext(mp_obj_t self_in) {
281
299
282
300
static mp_obj_t btree_subscr (mp_obj_t self_in , mp_obj_t index , mp_obj_t value ) {
283
301
mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
302
+ check_btree_is_open (self );
284
303
if (value == MP_OBJ_NULL ) {
285
304
// delete
286
305
DBT key ;
@@ -314,6 +333,7 @@ static mp_obj_t btree_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
314
333
315
334
static mp_obj_t btree_binary_op (mp_binary_op_t op , mp_obj_t lhs_in , mp_obj_t rhs_in ) {
316
335
mp_obj_btree_t * self = MP_OBJ_TO_PTR (lhs_in );
336
+ check_btree_is_open (self );
317
337
switch (op ) {
318
338
case MP_BINARY_OP_CONTAINS : {
319
339
DBT key , val ;
0 commit comments