static inline svref* getv(svindex *i, sr *r, uint64_t vlsn, svv *key) { ssrbnode *n = NULL; int rc = sv_indexmatch(&i->i, r->scheme, sv_vpointer(key), sv_vsize(key), &n); if (rc == 0 && n) { return sv_refvisible(sscast(n, svref, node), vlsn); } return NULL; }
static inline int si_getindex(siread *q, sinode *n) { svindex *second; svindex *first = si_nodeindex_priority(n, &second); ssiter i; ss_iterinit(sv_indexiter, &i); int rc; if (first->count > 0) { rc = ss_iteropen(sv_indexiter, &i, q->r, first, SS_GTE, q->key, q->keysize); if (rc) { goto result; } } if (sslikely(second == NULL || !second->count)) return 0; rc = ss_iteropen(sv_indexiter, &i, q->r, second, SS_GTE, q->key, q->keysize); if (! rc) { return 0; } result:; si_readstat(q, 1, n, 1); sv *v = ss_iterof(sv_indexiter, &i); assert(v != NULL); svref *visible = v->v; if (sslikely(! q->has)) { visible = sv_refvisible(visible, q->vlsn); if (visible == NULL) return 0; } sv vret; sv_init(&vret, &sv_vif, visible->v, NULL); return si_getresult(q, &vret, 0); }