/* * __curjoin_endpoint_init_key -- * Set the key in the reference endpoint. */ static int __curjoin_endpoint_init_key(WT_SESSION_IMPL *session, WT_CURSOR_JOIN_ENTRY *entry, WT_CURSOR_JOIN_ENDPOINT *endpoint) { WT_CURSOR *cursor; WT_CURSOR_INDEX *cindex; WT_ITEM *k; uint64_t r; if ((cursor = endpoint->cursor) != NULL) { if (entry->index != NULL) { /* Extract and save the index's logical key. */ cindex = (WT_CURSOR_INDEX *)endpoint->cursor; WT_RET(__wt_struct_repack(session, cindex->child->key_format, (entry->repack_format != NULL ? entry->repack_format : cindex->iface.key_format), &cindex->child->key, &endpoint->key)); } else { k = &((WT_CURSOR_TABLE *)cursor)->cg_cursors[0]->key; if (WT_CURSOR_RECNO(cursor)) { r = *(uint64_t *)k->data; WT_RET(__curjoin_pack_recno(session, r, endpoint->recno_buf, sizeof(endpoint->recno_buf), &endpoint->key)); } else endpoint->key = *k; } } return (0); }
/* * __curjoin_split_key -- * Copy the primary key from a cursor (either main table or index) * to another cursor. When copying from an index file, the index * key is also returned. * */ static int __curjoin_split_key(WT_SESSION_IMPL *session, WT_CURSOR_JOIN *cjoin, WT_ITEM *idxkey, WT_CURSOR *tocur, WT_CURSOR *fromcur, const char *repack_fmt, bool isindex) { WT_CURSOR *firstcg_cur; WT_CURSOR_INDEX *cindex; WT_ITEM *keyp; const uint8_t *p; if (isindex) { cindex = ((WT_CURSOR_INDEX *)fromcur); /* * Repack tells us where the index key ends; advance past * that to get where the raw primary key starts. */ WT_RET(__wt_struct_repack(session, cindex->child->key_format, repack_fmt != NULL ? repack_fmt : cindex->iface.key_format, &cindex->child->key, idxkey)); WT_ASSERT(session, cindex->child->key.size > idxkey->size); tocur->key.data = (uint8_t *)idxkey->data + idxkey->size; tocur->key.size = cindex->child->key.size - idxkey->size; if (WT_CURSOR_RECNO(tocur)) { p = (const uint8_t *)tocur->key.data; WT_RET(__wt_vunpack_uint(&p, tocur->key.size, &tocur->recno)); } else tocur->recno = 0; } else { firstcg_cur = ((WT_CURSOR_TABLE *)fromcur)->cg_cursors[0]; keyp = &firstcg_cur->key; if (WT_CURSOR_RECNO(tocur)) { WT_ASSERT(session, keyp->size == sizeof(uint64_t)); tocur->recno = *(uint64_t *)keyp->data; WT_RET(__curjoin_pack_recno(session, tocur->recno, cjoin->recno_buf, sizeof(cjoin->recno_buf), &tocur->key)); } else { WT_ITEM_SET(tocur->key, *keyp); tocur->recno = 0; } idxkey->data = NULL; idxkey->size = 0; } return (0); }
/* * __curjoin_endpoint_init_key -- * Set the key in the reference endpoint. */ static int __curjoin_endpoint_init_key(WT_SESSION_IMPL *session, WT_CURSOR_JOIN_ENTRY *entry, WT_CURSOR_JOIN_ENDPOINT *endpoint) { WT_CURSOR *cursor; WT_CURSOR_INDEX *cindex; WT_DECL_RET; WT_ITEM *k; uint64_t r; void *allocbuf; allocbuf = NULL; if ((cursor = endpoint->cursor) != NULL) { if (entry->index != NULL) { cindex = (WT_CURSOR_INDEX *)endpoint->cursor; if (cindex->index->extractor == NULL) { WT_ERR(__wt_struct_repack(session, cindex->child->key_format, entry->main->value_format, &cindex->child->key, &endpoint->key, &allocbuf)); if (allocbuf != NULL) F_SET(endpoint, WT_CURJOIN_END_OWN_KEY); } else endpoint->key = cindex->child->key; } else { k = &((WT_CURSOR_TABLE *)cursor)->cg_cursors[0]->key; if (WT_CURSOR_RECNO(cursor)) { r = *(uint64_t *)k->data; WT_ERR(__curjoin_pack_recno(session, r, endpoint->recno_buf, sizeof(endpoint->recno_buf), &endpoint->key)); } else endpoint->key = *k; } } if (0) { err: __wt_free(session, allocbuf); } return (ret); }
/* * __curjoin_entry_iter_next -- * Get the next item in an iteration. * */ static int __curjoin_entry_iter_next(WT_CURSOR_JOIN_ITER *iter, WT_ITEM *primkey, uint64_t *rp) { WT_CURSOR *firstcg_cur; WT_CURSOR_JOIN *cjoin; WT_DECL_RET; WT_SESSION_IMPL *session; uint64_t r; if (iter->advance) WT_ERR(iter->cursor->next(iter->cursor)); else iter->advance = true; session = iter->session; cjoin = iter->cjoin; /* * Set our key to the primary key, we'll also need this * to check membership. */ if (iter->entry->index != NULL) firstcg_cur = ((WT_CURSOR_INDEX *)iter->cursor)->cg_cursors[0]; else firstcg_cur = ((WT_CURSOR_TABLE *)iter->cursor)->cg_cursors[0]; if (WT_CURSOR_RECNO(&cjoin->iface)) { r = *(uint64_t *)firstcg_cur->key.data; WT_ERR(__curjoin_pack_recno(session, r, cjoin->recno_buf, sizeof(cjoin->recno_buf), primkey)); *rp = r; } else { WT_ITEM_SET(*primkey, firstcg_cur->key); *rp = 0; } iter->curkey = primkey; iter->entry->stats.actual_count++; iter->entry->stats.accesses++; err: return (ret); }