|
@@ -516,12 +516,7 @@ LSUP_store_lookup(
|
|
|
LookupArgs args_s;
|
|
|
LookupArgs *args = &args_s;
|
|
|
|
|
|
- if (store->default_ctx) {
|
|
|
- if (args->ck = LSUP_sterm_to_key(sspoc[3]) == NULL_KEY)
|
|
|
- args->ck = LSUP_sterm_to_key(store->default_ctx);
|
|
|
- } else {
|
|
|
- args->ck = NULL_KEY;
|
|
|
- }
|
|
|
+ args->ck = store->default_ctx ? LSUP_sterm_to_key(sspoc[3]) : NULL_KEY;
|
|
|
|
|
|
args->ct = ct;
|
|
|
*args->ct = 0;
|
|
@@ -795,7 +790,7 @@ index_triple(
|
|
|
inline static LSUP_rc
|
|
|
lookup_0bound(struct MDBStore *store, LookupArgs *args)
|
|
|
{
|
|
|
- int rc = LSUP_NORESULT;
|
|
|
+ int rc = LSUP_NORESULT, db_rc;
|
|
|
|
|
|
MDB_txn *txn;
|
|
|
if(store->txn) txn = store->txn;
|
|
@@ -803,16 +798,32 @@ lookup_0bound(struct MDBStore *store, LookupArgs *args)
|
|
|
|
|
|
MDB_val key_v;
|
|
|
|
|
|
+ MDB_cursor *cur;
|
|
|
+
|
|
|
if(args->ct) {
|
|
|
- MDB_stat stat;
|
|
|
- mdb_stat(txn, store->dbi[IDX_S_PO], &stat);
|
|
|
+ if(args->ck != NULL_KEY) {
|
|
|
+ // Look up by given context.
|
|
|
+ db_rc = mdb_cursor_open(txn, store->dbi[IDX_C_SPO], &cur);
|
|
|
+
|
|
|
+ key_v.mv_data = &args->ck;
|
|
|
+ key_v.mv_size = KLEN;
|
|
|
+
|
|
|
+ db_rc = mdb_cursor_get(cur, &key_v, NULL, MDB_SET);
|
|
|
+ if (db_rc != MDB_SUCCESS) return rc;
|
|
|
+
|
|
|
+ db_rc = mdb_cursor_count(cur, args->ct);
|
|
|
|
|
|
- *args->ct = stat.ms_entries;
|
|
|
+ } else {
|
|
|
+ // Look up all contexts.
|
|
|
+ MDB_stat stat;
|
|
|
+ mdb_stat(txn, store->dbi[IDX_S_PO], &stat);
|
|
|
+
|
|
|
+ *args->ct = stat.ms_entries;
|
|
|
+ }
|
|
|
|
|
|
if (!args->callback_fn && *args->ct > 0) rc = LSUP_OK;
|
|
|
}
|
|
|
|
|
|
- MDB_cursor *cur;
|
|
|
mdb_cursor_open(txn, store->dbi[IDX_S_PO], &cur);
|
|
|
|
|
|
if(args->callback_fn) {
|
|
@@ -859,17 +870,17 @@ lookup_1bound(struct MDBStore *store, LookupArgs *args)
|
|
|
|
|
|
if(args->ct) {
|
|
|
db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_SET);
|
|
|
- db_rc = mdb_cursor_count(cur, args->ct);
|
|
|
+ if (db_rc != MDB_SUCCESS) return rc;
|
|
|
|
|
|
if (!args->callback_fn && *args->ct > 0) rc = LSUP_OK;
|
|
|
}
|
|
|
|
|
|
if(args->callback_fn) {
|
|
|
- rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_SET);
|
|
|
- if (rc == MDB_SUCCESS)
|
|
|
- rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_GET_MULTIPLE);
|
|
|
+ db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_SET);
|
|
|
+ if (db_rc == MDB_SUCCESS)
|
|
|
+ db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_GET_MULTIPLE);
|
|
|
|
|
|
- while (rc != MDB_NOTFOUND) {
|
|
|
+ while (db_rc != MDB_NOTFOUND) {
|
|
|
LSUP_Key **lu_dset = data_v.mv_data;
|
|
|
for (int i = 0; i < data_v.mv_size / DBL_KLEN; i++) {
|
|
|
// Build triple key from lookup key and result keys.
|
|
@@ -882,7 +893,7 @@ lookup_1bound(struct MDBStore *store, LookupArgs *args)
|
|
|
rc = args->callback_fn(spok, args->data);
|
|
|
if (rc < 0) goto _match1b_abort;
|
|
|
}
|
|
|
- rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_NEXT_MULTIPLE);
|
|
|
+ db_rc = mdb_cursor_get(cur, &key_v, &data_v, MDB_NEXT_MULTIPLE);
|
|
|
}
|
|
|
}
|
|
|
|