| 1820 | } |
| 1821 | |
| 1822 | static fdb_status _fdb_iterator_seq_next(fdb_iterator *iterator) |
| 1823 | { |
| 1824 | size_t size_id, size_seq, seq_kv_len; |
| 1825 | uint8_t *seq_kv; |
| 1826 | uint64_t offset = BLK_NOT_FOUND; |
| 1827 | btree_result br = BTREE_RESULT_FAIL; |
| 1828 | hbtrie_result hr; |
| 1829 | struct docio_object _doc; |
| 1830 | struct docio_object _hbdoc; |
| 1831 | struct docio_handle *dhandle; |
| 1832 | struct snap_wal_entry *snap_item = NULL; |
| 1833 | fdb_seqnum_t seqnum; |
| 1834 | fdb_kvs_id_t kv_id; |
| 1835 | struct avl_node *cursor; |
| 1836 | |
| 1837 | size_id = sizeof(fdb_kvs_id_t); |
| 1838 | size_seq = sizeof(fdb_seqnum_t); |
| 1839 | seq_kv = alca(uint8_t, size_id + size_seq); |
| 1840 | |
| 1841 | if (iterator->direction == FDB_ITR_REVERSE) { |
| 1842 | if (iterator->status == FDB_ITR_IDX) { |
| 1843 | iterator->_offset = BLK_NOT_FOUND; // need to re-examine Trie/trees |
| 1844 | } |
| 1845 | if (iterator->tree_cursor) { |
| 1846 | iterator->tree_cursor = avl_next(iterator->tree_cursor); |
| 1847 | if (iterator->tree_cursor && |
| 1848 | iterator->status == FDB_ITR_WAL) { |
| 1849 | // if the last document was returned from WAL, |
| 1850 | // shift again, past curkey into next |
| 1851 | iterator->tree_cursor = avl_next(iterator->tree_cursor); |
| 1852 | } |
| 1853 | } |
| 1854 | } |
| 1855 | |
| 1856 | if (!iterator->tree_cursor && iterator->direction != FDB_ITR_FORWARD) { |
| 1857 | // In case reverse iteration went past the start, reset the |
| 1858 | // cursor to the start point |
| 1859 | iterator->tree_cursor = iterator->tree_cursor_start; |
| 1860 | } |
| 1861 | |
| 1862 | start_seq: |
| 1863 | seqnum = iterator->_seqnum; |
| 1864 | dhandle = iterator->handle->dhandle; |
| 1865 | |
| 1866 | // retrieve from sequence b-tree first |
| 1867 | if (iterator->_offset == BLK_NOT_FOUND) { |
| 1868 | if (iterator->handle->kvs) { // multi KV instance mode |
| 1869 | hr = hbtrie_next(iterator->seqtrie_iterator, seq_kv, &seq_kv_len, |
| 1870 | (void *)&offset); |
| 1871 | if (hr == HBTRIE_RESULT_SUCCESS) { |
| 1872 | br = BTREE_RESULT_SUCCESS; |
| 1873 | buf2kvid(size_id, seq_kv, &kv_id); |
| 1874 | if (kv_id != iterator->handle->kvs->id) { |
| 1875 | // iterator is beyond the boundary |
| 1876 | br = BTREE_RESULT_FAIL; |
| 1877 | } |
| 1878 | memcpy(&seqnum, seq_kv + size_id, size_seq); |
| 1879 | } else { |
no test coverage detected