[Date Prev][Date Next] [Chronological] [Thread] [Top]

Subject: Re: Fast key range iteration

Here is a faster to do way to do what you want.
Just get the last key of your range and while iterating compare the data pointer of the last key to see if you reach the end instead of the it's content.
As long as you are in the same transaction the data pointer of the last key should never change. (Someone correct me if I am wrong).

Here is a quick example of what I mean.

  MDB_cursor *cursor;
  MDB_val first_key, key, data;
  MDB_val last_key1, last_key2, last_data;
  int rc;

//Get the last key
  rc = mdb_cursor_get (cursor, &last_key1, &last_data, MDB_SET_RANGE);
   //If the current position is not equal move back one spot
  if (rc == MDB_SUCCESS && mdb_cmp (mdb_cursor_txn (cursor), mdb_cursor_dbi (cursor), &last_key1, &last_key2)) {
    rc = mdb_cursor_get (cursor, &last_key1, &last_data, MDB_PREV);
  //This means that nothing is equal or greater than the last key or the last key is at the first position
  if (rc) {
    last_data.mv_data = NULL;
  //Get the first key
  rc = mdb_cursor_get (cursor, &first_key, &data, MDB_SET_RANGE);
  if(rc == MDB_SUCCESS) {
    do {
    } while (mdb_cursor_get (cursor, &key, &data, MDB_NEXT) == MDB_SUCCESS && data.mv_data != last_data.mv_data);

> Hi all!

> Is there a way to iterate with all key-value pairs in LMDB database, where all keys is in specified range?
> I'm trying to use mdb_cursor_get() with MDB_SET_RANGE to search first pair.
> Then I see only one way - use mdb_cursor_get() with MDB_NEXT and compare key by memcmp().
> But it seems absolutely not effective.
> Is there another solution for my task?
> Thanks!