@@ -76,6 +76,13 @@ STATIC mp_obj_btree_t *btree_new(DB *db, mp_obj_t stream) {
76
76
return o ;
77
77
}
78
78
79
+ STATIC void buf_to_dbt (mp_obj_t obj , DBT * dbt ) {
80
+ mp_buffer_info_t bufinfo ;
81
+ mp_get_buffer_raise (obj , & bufinfo , MP_BUFFER_READ );
82
+ dbt -> data = bufinfo .buf ;
83
+ dbt -> size = bufinfo .len ;
84
+ }
85
+
79
86
STATIC void btree_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
80
87
(void )kind ;
81
88
mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
@@ -98,16 +105,16 @@ STATIC mp_obj_t btree_put(size_t n_args, const mp_obj_t *args) {
98
105
(void )n_args ;
99
106
mp_obj_btree_t * self = MP_OBJ_TO_PTR (args [0 ]);
100
107
DBT key , val ;
101
- key . data = ( void * ) mp_obj_str_get_data ( args [1 ], & key . size );
102
- val . data = ( void * ) mp_obj_str_get_data ( args [2 ], & val . size );
108
+ buf_to_dbt ( args [1 ], & key );
109
+ buf_to_dbt ( args [2 ], & val );
103
110
return MP_OBJ_NEW_SMALL_INT (__bt_put (self -> db , & key , & val , 0 ));
104
111
}
105
112
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (btree_put_obj , 3 , 4 , btree_put );
106
113
107
114
STATIC mp_obj_t btree_get (size_t n_args , const mp_obj_t * args ) {
108
115
mp_obj_btree_t * self = MP_OBJ_TO_PTR (args [0 ]);
109
116
DBT key , val ;
110
- key . data = ( void * ) mp_obj_str_get_data ( args [1 ], & key . size );
117
+ buf_to_dbt ( args [1 ], & key );
111
118
int res = __bt_get (self -> db , & key , & val , 0 );
112
119
if (res == RET_SPECIAL ) {
113
120
if (n_args > 2 ) {
@@ -126,7 +133,7 @@ STATIC mp_obj_t btree_seq(size_t n_args, const mp_obj_t *args) {
126
133
int flags = MP_OBJ_SMALL_INT_VALUE (args [1 ]);
127
134
DBT key , val ;
128
135
if (n_args > 2 ) {
129
- key . data = ( void * ) mp_obj_str_get_data ( args [2 ], & key . size );
136
+ buf_to_dbt ( args [2 ], & key );
130
137
}
131
138
132
139
int res = __bt_seq (self -> db , & key , & val , flags );
@@ -201,7 +208,7 @@ STATIC mp_obj_t btree_iternext(mp_obj_t self_in) {
201
208
if (self -> start_key != MP_OBJ_NULL ) {
202
209
int flags = R_FIRST ;
203
210
if (self -> start_key != mp_const_none ) {
204
- key . data = ( void * ) mp_obj_str_get_data ( self -> start_key , & key . size );
211
+ buf_to_dbt ( self -> start_key , & key );
205
212
flags = R_CURSOR ;
206
213
} else if (desc ) {
207
214
flags = R_LAST ;
@@ -219,7 +226,7 @@ STATIC mp_obj_t btree_iternext(mp_obj_t self_in) {
219
226
220
227
if (self -> end_key != mp_const_none ) {
221
228
DBT end_key ;
222
- end_key . data = ( void * ) mp_obj_str_get_data ( self -> end_key , & end_key . size );
229
+ buf_to_dbt ( self -> end_key , & end_key );
223
230
BTREE * t = self -> db -> internal ;
224
231
int cmp = t -> bt_cmp (& key , & end_key );
225
232
if (desc ) {
@@ -254,7 +261,7 @@ STATIC mp_obj_t btree_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
254
261
if (value == MP_OBJ_NULL ) {
255
262
// delete
256
263
DBT key ;
257
- key . data = ( void * ) mp_obj_str_get_data ( index , & key . size );
264
+ buf_to_dbt ( index , & key );
258
265
int res = __bt_delete (self -> db , & key , 0 );
259
266
if (res == RET_SPECIAL ) {
260
267
mp_raise_type (& mp_type_KeyError );
@@ -264,7 +271,7 @@ STATIC mp_obj_t btree_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
264
271
} else if (value == MP_OBJ_SENTINEL ) {
265
272
// load
266
273
DBT key , val ;
267
- key . data = ( void * ) mp_obj_str_get_data ( index , & key . size );
274
+ buf_to_dbt ( index , & key );
268
275
int res = __bt_get (self -> db , & key , & val , 0 );
269
276
if (res == RET_SPECIAL ) {
270
277
mp_raise_type (& mp_type_KeyError );
@@ -274,8 +281,8 @@ STATIC mp_obj_t btree_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
274
281
} else {
275
282
// store
276
283
DBT key , val ;
277
- key . data = ( void * ) mp_obj_str_get_data ( index , & key . size );
278
- val . data = ( void * ) mp_obj_str_get_data ( value , & val . size );
284
+ buf_to_dbt ( index , & key );
285
+ buf_to_dbt ( value , & val );
279
286
int res = __bt_put (self -> db , & key , & val , 0 );
280
287
CHECK_ERROR (res );
281
288
return mp_const_none ;
@@ -287,7 +294,7 @@ STATIC mp_obj_t btree_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs
287
294
switch (op ) {
288
295
case MP_BINARY_OP_CONTAINS : {
289
296
DBT key , val ;
290
- key . data = ( void * ) mp_obj_str_get_data ( rhs_in , & key . size );
297
+ buf_to_dbt ( rhs_in , & key );
291
298
int res = __bt_get (self -> db , & key , & val , 0 );
292
299
CHECK_ERROR (res );
293
300
return mp_obj_new_bool (res != RET_SPECIAL );
0 commit comments