MCPcopy Create free account
hub / github.com/couchbase/forestdb / _fdb_iterator_seq_next

Function _fdb_iterator_seq_next

src/iterator.cc:1822–2013  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1820}
1821
1822static 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
1862start_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 {

Callers 1

Calls 8

avl_nextFunction · 0.85
hbtrie_nextFunction · 0.85
buf2kvidFunction · 0.85
btree_nextFunction · 0.85
btreeblk_endFunction · 0.85
docio_read_doc_key_metaFunction · 0.85
_fdb_keycmpFunction · 0.85
hbtrie_findFunction · 0.85

Tested by

no test coverage detected