#include "ejdb2_internal.h" // Primary key scanner iwrc jbi_pk_scanner(struct _JBEXEC *ctx, JB_SCAN_CONSUMER consumer) { iwrc rc = 0; int64_t id, step; bool matched; struct JQP_AUX *aux = ctx->ux->q->aux; assert(aux->expr->flags & JQP_EXPR_NODE_FLAG_PK); JQP_EXPR_NODE_PK *pk = (void*) aux->expr; assert(pk->argument); JQVAL *jqvp = jql_unit_to_jqval(aux, pk->argument, &rc); RCGO(rc, finish); if ((jqvp->type == JQVAL_JBLNODE) && (jqvp->vnode->type == JBV_ARRAY)) { JQVAL jqv; JBL_NODE nv = jqvp->vnode->child; if (!nv) { goto finish; } step = 1; do { jql_node_to_jqval(nv, &jqv); if (jql_jqval_as_int(&jqv, &id)) { if (step > 0) { --step; } else if (step < 0) { ++step; } if (!step) { step = 1; rc = consumer(ctx, 0, id, &step, &matched, 0); RCGO(rc, finish); } } } while (step && (step > 0 ? (nv = nv->next) : (nv = nv->prev))); } else if (jql_jqval_as_int(jqvp, &id)) { rc = consumer(ctx, 0, id, &step, &matched, 0); } finish: return consumer(ctx, 0, 0, 0, 0, rc); }