Skip to content
Snippets Groups Projects
Commit e7ee1ce5 authored by Marek Vavruša's avatar Marek Vavruša
Browse files

namedb: implemented GEQ/LEQ for lmdb backend + tests

parent de57c0a9
No related branches found
No related tags found
2 merge requests!330Knsupdate pubkey processing fix,!302Namedb iter seek
......@@ -213,7 +213,7 @@ static knot_iter_t *iter_set(knot_iter_t *iter, knot_val_t *key, unsigned flags)
case KNOT_NAMEDB_LAST: op = MDB_LAST; break;
case KNOT_NAMEDB_NEXT: op = MDB_NEXT; break;
case KNOT_NAMEDB_PREV: op = MDB_PREV; break;
case KNOT_NAMEDB_LEQ: assert(0); /* ENOTSUP */ break;
case KNOT_NAMEDB_LEQ:
case KNOT_NAMEDB_GEQ: op = MDB_SET_RANGE; break;
default: break;
}
......@@ -225,7 +225,20 @@ static knot_iter_t *iter_set(knot_iter_t *iter, knot_val_t *key, unsigned flags)
}
int ret = mdb_cursor_get(cursor, key ? &db_key : NULL, NULL, op);
if (ret != 0) {
/* LEQ is not supported in LMDB, workaround using GEQ. */
if (flags == KNOT_NAMEDB_LEQ && key) {
/* Searched key is after the last key. */
if (ret != MDB_SUCCESS) {
return iter_set(iter, NULL, KNOT_NAMEDB_LAST);
}
/* If the searched key != matched, get previous. */
if ((key->len != db_key.mv_size) || (memcmp(key->data, db_key.mv_data, key->len) != 0)) {
return iter_set(iter, NULL, KNOT_NAMEDB_PREV);
}
}
if (ret != MDB_SUCCESS) {
mdb_cursor_close(cursor);
return NULL;
}
......
......@@ -171,6 +171,24 @@ static void namedb_test_set(unsigned nkeys, char **keys, char *dbid,
it = api->iter_seek(it, &key, KNOT_NAMEDB_LAST);
ret = api->iter_key(it, &key);
is_string(last_key, key.data, "%s: iter_set(LAST)", api->name);
/* Check if prev(last_key + 1) is the last_key */
strcpy(key_buf, last_key);
key_buf[0] += 1;
KEY_SET(key, key_buf);
it = api->iter_seek(it, &key, KNOT_NAMEDB_LEQ);
assert(it);
ret = api->iter_key(it, &key);
is_int(0, ret, "LEQ ret");
is_string(last_key, key.data, "%s: iter_set(LEQ)", api->name);
/* Check if next(first_key - 1) is the first_key */
strcpy(key_buf, first_key);
key_buf[0] -= 1;
KEY_SET(key, key_buf);
it = api->iter_seek(it, &key, KNOT_NAMEDB_GEQ);
assert(it);
ret = api->iter_key(it, &key);
is_int(0, ret, "GEQ ret");
is_string(first_key, key.data, "%s: iter_set(GEQ)", api->name);
}
api->iter_finish(it);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment