50 if (store.get_pos() >= root) {
56 int ch = store.read();
63 if (reuse > last_key.size()) {
73 store.read(buf, key_size);
74 current_key.assign(last_key, 0, reuse);
75 current_key.append(buf, key_size);
76 last_key = current_key;
82 cerr <<
"K:" << esc << endl;
86 return next_from_index();
98 for (
int i = 0; i < 8; ++i) {
99 int ch2 = store.read();
104 if (ch2 < 128)
break;
109 const char* end =
p + r;
113 if (
p != end) abort();
114 current_compressed = val_size & 1;
119 if (
true && val_size == 0)
120 current_tag.resize(0);
130 if (store.was_forced_closed()) {
134 current_tag.resize(val_size);
135 store.read(&(current_tag[0]), val_size);
138 cerr <<
"read " << val_size <<
" bytes of value data ending @"
139 << store.get_pos() << endl;
142 cerr <<
"V:" << esc << endl;
147 if (!keep_compressed && current_compressed) {
149 comp_stream.decompress_start();
151 if (!comp_stream.decompress_chunk(current_tag.data(),
157 swap(current_tag, new_tag);
158 current_compressed =
false;
161 cerr <<
"decompressed to " << current_tag.size()
162 <<
"bytes of value data" << endl;
166 return current_compressed;
179 cerr <<
"do_find(" << esc <<
", " << greater_than <<
") @"
180 << store.get_pos() << endl;
190 bool use_index =
true;
191 if (!is_at_end && !last_key.empty() && last_key[0] == key[0]) {
192 int cmp0 = last_key.compare(key);
194 current_key = last_key;
204 if (store.was_forced_closed()) {
210 int index_type = store.read();
211 switch (index_type) {
215 unsigned char first = key[0] - store.read();
216 unsigned char range = store.read();
221 store.skip(first * 4);
222 off_t jump = store.read_uint4_be();
231 size_t j = store.read_uint4_be();
236 off_t base = store.get_pos();
241 size_t k = i + (j - i) / 2;
245 while (kkey_len > 0 && kkey[kkey_len - 1] ==
'\0')
261 while (kkey_len > 0 && kkey[kkey_len - 1] ==
'\0') --kkey_len;
262 off_t jump = store.read_uint4_be();
267 last_key.assign(kkey, jump == 0 ? 0 : kkey_len);
274 string index_key, prev_index_key;
275 make_unsigned_t<off_t> ptr = 0;
279 cerr <<
"Using skiplist index\n";
283 int reuse = store.read();
284 if (reuse == EOF)
break;
285 int len = store.read();
286 if (len == EOF) abort();
289 cerr <<
"reuse = " << reuse <<
" len = " << len << endl;
292 index_key.resize(reuse + len);
293 store.read(&index_key[reuse], len);
299 cerr <<
"Index key: " << desc << endl;
303 cmp0 = index_key.compare(key);
305 index_key = prev_index_key;
311 int b = store.read();
313 if ((b & 0x80) == 0)
break;
319 cerr <<
" -> " << ptr << endl;
324 prev_index_key = index_key;
329 cerr <<
"prev_index_key -> " << desc << endl;
337 cerr <<
" index_key = " << desc <<
", cmp0 = " << cmp0
338 <<
", going to " << ptr << endl;
344 last_key = current_key = index_key;
345 bool res = next_from_index();
352 store.skip(val_size);
354 last_key = current_key = string();
361 cerr <<
"cmp0 was " << cmp0
362 <<
", Dropped to data layer on key: " << desc << endl;
369 string m =
"HoneyCursor: Unknown index type ";
370 m +=
str(index_type);
379 int cmp = current_key.compare(key);
380 if (cmp == 0)
return true;
389 if (store.was_forced_closed()) {
400 if (current_key.empty())
417 pos = store.get_pos();
420 compressed = current_compressed;
421 }
while (do_next() && current_key < key);
425 last_key = current_key = k;
427 current_compressed = compressed;
bool read_tag(bool keep_compressed=false)
bool do_find(std::string_view key, bool greater_than)
Search for key.
bool next_from_index()
Handle the value part of the (key,value).
bool prev()
Move to the item before the current one.
static void throw_database_closed()
DatabaseCorruptError indicates database corruption was detected.
DatabaseError indicates some sort of database related error.
#define HONEY_MAX_KEY_LENGTH
Maximum key length.
#define SSTINDEX_BINARY_CHOP_ENTRY_SIZE
#define SSTINDEX_BINARY_CHOP_KEY_SIZE
string str(int value)
Convert int to std::string.
bool unpack_uint(const char **p, const char *end, U *result)
Decode an unsigned integer from a string.
void description_append(std::string &desc, std::string_view s)