@@ -132,6 +132,33 @@ STATIC mp_obj_t btree_range(size_t n_args, const mp_obj_t *args) {
132132}
133133STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (btree_range_obj , 3 , 4 , btree_range );
134134
135+ STATIC mp_obj_t btree_iternext (mp_obj_t self_in ) {
136+ mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
137+ DBT key , val ;
138+ int res ;
139+ if (self -> start_key != MP_OBJ_NULL ) {
140+ int flags = R_FIRST ;
141+ if (self -> start_key != mp_const_none ) {
142+ key .data = (void * )mp_obj_str_get_data (self -> start_key , & key .size );
143+ flags = R_CURSOR ;
144+ }
145+ res = __bt_seq (self -> db , & key , & val , flags );
146+ self -> start_key = MP_OBJ_NULL ;
147+ } else {
148+ res = __bt_seq (self -> db , & key , & val , R_NEXT );
149+ }
150+
151+ if (res == RET_SPECIAL ) {
152+ return MP_OBJ_STOP_ITERATION ;
153+ }
154+ CHECK_ERROR (res );
155+
156+ mp_obj_tuple_t * pair = mp_obj_new_tuple (2 , NULL );
157+ pair -> items [0 ] = mp_obj_new_bytes (key .data , key .size );
158+ pair -> items [1 ] = mp_obj_new_bytes (val .data , val .size );
159+ return pair ;
160+ }
161+
135162STATIC mp_obj_t btree_subscr (mp_obj_t self_in , mp_obj_t index , mp_obj_t value ) {
136163 mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
137164 if (value == MP_OBJ_NULL ) {
@@ -170,7 +197,7 @@ STATIC const mp_rom_map_elem_t btree_locals_dict_table[] = {
170197 { MP_ROM_QSTR (MP_QSTR_get ), MP_ROM_PTR (& btree_get_obj ) },
171198 { MP_ROM_QSTR (MP_QSTR_put ), MP_ROM_PTR (& btree_put_obj ) },
172199 { MP_ROM_QSTR (MP_QSTR_seq ), MP_ROM_PTR (& btree_seq_obj ) },
173- { MP_ROM_QSTR (MP_QSTR_range ), MP_ROM_PTR (& btree_range_obj ) },
200+ { MP_ROM_QSTR (MP_QSTR_items ), MP_ROM_PTR (& btree_range_obj ) },
174201};
175202
176203STATIC MP_DEFINE_CONST_DICT (btree_locals_dict , btree_locals_dict_table );
@@ -180,8 +207,8 @@ STATIC const mp_obj_type_t btree_type = {
180207 // Save on qstr's, reuse same as for module
181208 .name = MP_QSTR_btree ,
182209 .print = btree_print ,
183- .getiter = NULL ,
184- .iternext = NULL ,
210+ .getiter = mp_identity ,
211+ .iternext = btree_iternext ,
185212 .subscr = btree_subscr ,
186213 .locals_dict = (void * )& btree_locals_dict ,
187214};
0 commit comments