Merge pull request #423 from zerebubuth/c_iterate_upper_bound
C iterate upper bound
This commit is contained in:
commit
a486352e07
15
db/c.cc
15
db/c.cc
@ -80,7 +80,10 @@ struct rocksdb_writebatch_t { WriteBatch rep; };
|
|||||||
struct rocksdb_snapshot_t { const Snapshot* rep; };
|
struct rocksdb_snapshot_t { const Snapshot* rep; };
|
||||||
struct rocksdb_flushoptions_t { FlushOptions rep; };
|
struct rocksdb_flushoptions_t { FlushOptions rep; };
|
||||||
struct rocksdb_fifo_compaction_options_t { CompactionOptionsFIFO rep; };
|
struct rocksdb_fifo_compaction_options_t { CompactionOptionsFIFO rep; };
|
||||||
struct rocksdb_readoptions_t { ReadOptions rep; };
|
struct rocksdb_readoptions_t {
|
||||||
|
ReadOptions rep;
|
||||||
|
Slice upper_bound; // stack variable to set pointer to in ReadOptions
|
||||||
|
};
|
||||||
struct rocksdb_writeoptions_t { WriteOptions rep; };
|
struct rocksdb_writeoptions_t { WriteOptions rep; };
|
||||||
struct rocksdb_options_t { Options rep; };
|
struct rocksdb_options_t { Options rep; };
|
||||||
struct rocksdb_block_based_table_options_t { BlockBasedTableOptions rep; };
|
struct rocksdb_block_based_table_options_t { BlockBasedTableOptions rep; };
|
||||||
@ -1891,8 +1894,14 @@ void rocksdb_readoptions_set_snapshot(
|
|||||||
void rocksdb_readoptions_set_iterate_upper_bound(
|
void rocksdb_readoptions_set_iterate_upper_bound(
|
||||||
rocksdb_readoptions_t* opt,
|
rocksdb_readoptions_t* opt,
|
||||||
const char* key, size_t keylen) {
|
const char* key, size_t keylen) {
|
||||||
Slice prefix = Slice(key, keylen);
|
if (key == nullptr) {
|
||||||
opt->rep.iterate_upper_bound = &prefix;
|
opt->upper_bound = Slice();
|
||||||
|
opt->rep.iterate_upper_bound = nullptr;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
opt->upper_bound = Slice(key, keylen);
|
||||||
|
opt->rep.iterate_upper_bound = &opt->upper_bound;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rocksdb_readoptions_set_read_tier(
|
void rocksdb_readoptions_set_read_tier(
|
||||||
|
60
db/c_test.c
60
db/c_test.c
@ -823,6 +823,66 @@ int main(int argc, char** argv) {
|
|||||||
rocksdb_cuckoo_options_destroy(cuckoo_options);
|
rocksdb_cuckoo_options_destroy(cuckoo_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StartPhase("iterate_upper_bound");
|
||||||
|
{
|
||||||
|
// Create new empty database
|
||||||
|
rocksdb_close(db);
|
||||||
|
rocksdb_destroy_db(options, dbname, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
|
||||||
|
rocksdb_options_set_prefix_extractor(options, NULL);
|
||||||
|
db = rocksdb_open(options, dbname, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
|
||||||
|
rocksdb_put(db, woptions, "a", 1, "0", 1, &err); CheckNoError(err);
|
||||||
|
rocksdb_put(db, woptions, "foo", 3, "bar", 3, &err); CheckNoError(err);
|
||||||
|
rocksdb_put(db, woptions, "foo1", 4, "bar1", 4, &err); CheckNoError(err);
|
||||||
|
rocksdb_put(db, woptions, "g1", 2, "0", 1, &err); CheckNoError(err);
|
||||||
|
|
||||||
|
// testing basic case with no iterate_upper_bound and no prefix_extractor
|
||||||
|
{
|
||||||
|
rocksdb_readoptions_set_iterate_upper_bound(roptions, NULL, 0);
|
||||||
|
rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);
|
||||||
|
|
||||||
|
rocksdb_iter_seek(iter, "foo", 3);
|
||||||
|
CheckCondition(rocksdb_iter_valid(iter));
|
||||||
|
CheckIter(iter, "foo", "bar");
|
||||||
|
|
||||||
|
rocksdb_iter_next(iter);
|
||||||
|
CheckCondition(rocksdb_iter_valid(iter));
|
||||||
|
CheckIter(iter, "foo1", "bar1");
|
||||||
|
|
||||||
|
rocksdb_iter_next(iter);
|
||||||
|
CheckCondition(rocksdb_iter_valid(iter));
|
||||||
|
CheckIter(iter, "g1", "0");
|
||||||
|
|
||||||
|
rocksdb_iter_destroy(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// testing iterate_upper_bound and forward iterator
|
||||||
|
// to make sure it stops at bound
|
||||||
|
{
|
||||||
|
// iterate_upper_bound points beyond the last expected entry
|
||||||
|
rocksdb_readoptions_set_iterate_upper_bound(roptions, "foo2", 4);
|
||||||
|
|
||||||
|
rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);
|
||||||
|
|
||||||
|
rocksdb_iter_seek(iter, "foo", 3);
|
||||||
|
CheckCondition(rocksdb_iter_valid(iter));
|
||||||
|
CheckIter(iter, "foo", "bar");
|
||||||
|
|
||||||
|
rocksdb_iter_next(iter);
|
||||||
|
CheckCondition(rocksdb_iter_valid(iter));
|
||||||
|
CheckIter(iter, "foo1", "bar1");
|
||||||
|
|
||||||
|
rocksdb_iter_next(iter);
|
||||||
|
// should stop here...
|
||||||
|
CheckCondition(!rocksdb_iter_valid(iter));
|
||||||
|
|
||||||
|
rocksdb_iter_destroy(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StartPhase("cleanup");
|
StartPhase("cleanup");
|
||||||
rocksdb_close(db);
|
rocksdb_close(db);
|
||||||
rocksdb_options_destroy(options);
|
rocksdb_options_destroy(options);
|
||||||
|
Loading…
Reference in New Issue
Block a user