|
| 1 | +#define MICROPY_PY_BTREE (1) |
| 2 | + |
| 3 | +#include "py/dynruntime.h" |
| 4 | + |
| 5 | +#include <unistd.h> |
| 6 | + |
| 7 | +#if !defined(__linux__) |
| 8 | +void *memcpy(void *dst, const void *src, size_t n) { |
| 9 | + return mp_fun_table.memmove_(dst, src, n); |
| 10 | +} |
| 11 | +void *memset(void *s, int c, size_t n) { |
| 12 | + return mp_fun_table.memset_(s, c, n); |
| 13 | +} |
| 14 | +#endif |
| 15 | + |
| 16 | +void *memmove(void *dest, const void *src, size_t n) { |
| 17 | + return mp_fun_table.memmove_(dest, src, n); |
| 18 | +} |
| 19 | + |
| 20 | +void *malloc(size_t n) { |
| 21 | + void *ptr = m_malloc(n, false); |
| 22 | + return ptr; |
| 23 | +} |
| 24 | +void *realloc(void *ptr, size_t n) { |
| 25 | + mp_printf(&mp_plat_print, "UNDEF %d\n", __LINE__); |
| 26 | + return NULL; |
| 27 | +} |
| 28 | +void *calloc(size_t n, size_t m) { |
| 29 | + void *ptr = m_malloc(n * m, false); |
| 30 | + // memory already cleared by conservative GC |
| 31 | + return ptr; |
| 32 | +} |
| 33 | + |
| 34 | +void free(void *ptr) { |
| 35 | + m_free(ptr); |
| 36 | +} |
| 37 | + |
| 38 | +void abort_(void) { |
| 39 | + nlr_raise(mp_obj_new_exception(mp_load_global(MP_QSTR_RuntimeError))); |
| 40 | +} |
| 41 | + |
| 42 | +int native_errno; |
| 43 | +#if defined(__linux__) |
| 44 | +int *__errno_location (void) |
| 45 | +#else |
| 46 | +int *__errno (void) |
| 47 | +#endif |
| 48 | +{ |
| 49 | + return &native_errno; |
| 50 | +} |
| 51 | + |
| 52 | +ssize_t mp_stream_posix_write(void *stream, const void *buf, size_t len) { |
| 53 | + mp_obj_base_t* o = stream; |
| 54 | + const mp_stream_p_t *stream_p = o->type->protocol; |
| 55 | + mp_uint_t out_sz = stream_p->write(MP_OBJ_FROM_PTR(stream), buf, len, &native_errno); |
| 56 | + if (out_sz == MP_STREAM_ERROR) { |
| 57 | + return -1; |
| 58 | + } else { |
| 59 | + return out_sz; |
| 60 | + } |
| 61 | +} |
| 62 | + |
| 63 | +ssize_t mp_stream_posix_read(void *stream, void *buf, size_t len) { |
| 64 | + mp_obj_base_t* o = stream; |
| 65 | + const mp_stream_p_t *stream_p = o->type->protocol; |
| 66 | + mp_uint_t out_sz = stream_p->read(MP_OBJ_FROM_PTR(stream), buf, len, &native_errno); |
| 67 | + if (out_sz == MP_STREAM_ERROR) { |
| 68 | + return -1; |
| 69 | + } else { |
| 70 | + return out_sz; |
| 71 | + } |
| 72 | +} |
| 73 | + |
| 74 | +off_t mp_stream_posix_lseek(void *stream, off_t offset, int whence) { |
| 75 | + const mp_obj_base_t* o = stream; |
| 76 | + const mp_stream_p_t *stream_p = o->type->protocol; |
| 77 | + struct mp_stream_seek_t seek_s; |
| 78 | + seek_s.offset = offset; |
| 79 | + seek_s.whence = whence; |
| 80 | + mp_uint_t res = stream_p->ioctl(MP_OBJ_FROM_PTR(stream), MP_STREAM_SEEK, (mp_uint_t)(uintptr_t)&seek_s, &native_errno); |
| 81 | + if (res == MP_STREAM_ERROR) { |
| 82 | + return -1; |
| 83 | + } |
| 84 | + return seek_s.offset; |
| 85 | +} |
| 86 | + |
| 87 | +int mp_stream_posix_fsync(void *stream) { |
| 88 | + mp_obj_base_t* o = stream; |
| 89 | + const mp_stream_p_t *stream_p = o->type->protocol; |
| 90 | + mp_uint_t res = stream_p->ioctl(MP_OBJ_FROM_PTR(stream), MP_STREAM_FLUSH, 0, &native_errno); |
| 91 | + if (res == MP_STREAM_ERROR) { |
| 92 | + return -1; |
| 93 | + } |
| 94 | + return res; |
| 95 | +} |
| 96 | + |
| 97 | +mp_obj_type_t btree_type; |
| 98 | + |
| 99 | +#include "extmod/modbtree.c" |
| 100 | + |
| 101 | +mp_map_elem_t btree_locals_dict_table[8]; |
| 102 | +STATIC MP_DEFINE_CONST_DICT(btree_locals_dict, btree_locals_dict_table); |
| 103 | + |
| 104 | +STATIC mp_obj_t btree_open(size_t n_args, const mp_obj_t *args) { |
| 105 | + // Make sure we got a stream object |
| 106 | + mp_get_stream_raise(args[0], MP_STREAM_OP_READ | MP_STREAM_OP_WRITE | MP_STREAM_OP_IOCTL); |
| 107 | + |
| 108 | + BTREEINFO openinfo = {0}; |
| 109 | + openinfo.flags = mp_obj_get_int(args[1]); |
| 110 | + openinfo.cachesize = mp_obj_get_int(args[2]); |
| 111 | + openinfo.psize = mp_obj_get_int(args[3]); |
| 112 | + openinfo.minkeypage = mp_obj_get_int(args[4]); |
| 113 | + DB *db = __bt_open(MP_OBJ_TO_PTR(args[0]), &btree_stream_fvtable, &openinfo, 0); |
| 114 | + if (db == NULL) { |
| 115 | + mp_raise_OSError(native_errno); |
| 116 | + } |
| 117 | + |
| 118 | + return MP_OBJ_FROM_PTR(btree_new(db, args[0])); |
| 119 | +} |
| 120 | +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_open_obj, 5, 5, btree_open); |
| 121 | + |
| 122 | +mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) { |
| 123 | + MP_DYNRUNTIME_INIT_ENTRY |
| 124 | + |
| 125 | + btree_type.base.type = (void*)&mp_fun_table.type_type; |
| 126 | + btree_type.name = MP_QSTR_btree; |
| 127 | + btree_type.print = btree_print; |
| 128 | + btree_type.getiter = btree_getiter; |
| 129 | + btree_type.iternext = btree_iternext; |
| 130 | + btree_type.binary_op = btree_binary_op; |
| 131 | + btree_type.subscr = btree_subscr; |
| 132 | + btree_locals_dict_table[0] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_close), MP_OBJ_FROM_PTR(&btree_close_obj) }; |
| 133 | + btree_locals_dict_table[1] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_flush), MP_OBJ_FROM_PTR(&btree_flush_obj) }; |
| 134 | + btree_locals_dict_table[2] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_get), MP_OBJ_FROM_PTR(&btree_get_obj) }; |
| 135 | + btree_locals_dict_table[3] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_put), MP_OBJ_FROM_PTR(&btree_put_obj) }; |
| 136 | + btree_locals_dict_table[4] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_seq), MP_OBJ_FROM_PTR(&btree_seq_obj) }; |
| 137 | + btree_locals_dict_table[5] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_keys), MP_OBJ_FROM_PTR(&btree_keys_obj) }; |
| 138 | + btree_locals_dict_table[6] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_values), MP_OBJ_FROM_PTR(&btree_values_obj) }; |
| 139 | + btree_locals_dict_table[7] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_items), MP_OBJ_FROM_PTR(&btree_items_obj) }; |
| 140 | + btree_type.locals_dict = (void*)&btree_locals_dict; |
| 141 | + |
| 142 | + mp_store_global(MP_QSTR__open, MP_OBJ_FROM_PTR(&btree_open_obj)); |
| 143 | + mp_store_global(MP_QSTR_INCL, MP_OBJ_NEW_SMALL_INT(FLAG_END_KEY_INCL)); |
| 144 | + mp_store_global(MP_QSTR_DESC, MP_OBJ_NEW_SMALL_INT(FLAG_DESC)); |
| 145 | + |
| 146 | + MP_DYNRUNTIME_INIT_EXIT |
| 147 | +} |
0 commit comments