/* * __wt_curtable_get_value -- * WT_CURSOR->get_value implementation for tables. */ int __wt_curtable_get_value(WT_CURSOR *cursor, ...) { WT_CURSOR *primary; WT_CURSOR_TABLE *ctable; WT_DECL_RET; WT_ITEM *item; WT_SESSION_IMPL *session; va_list ap; ctable = (WT_CURSOR_TABLE *)cursor; primary = *ctable->cg_cursors; CURSOR_API_CALL(cursor, session, get_value, NULL); WT_CURSOR_NEEDVALUE(primary); va_start(ap, cursor); if (F_ISSET(cursor, WT_CURSOR_RAW_OK)) { ret = __wt_schema_project_merge(session, ctable->cg_cursors, ctable->plan, cursor->value_format, &cursor->value); if (ret == 0) { item = va_arg(ap, WT_ITEM *); item->data = cursor->value.data; item->size = cursor->value.size; } } else
/* * __curfile_insert -- * WT_CURSOR->insert method for the btree cursor type. */ static int __curfile_insert(WT_CURSOR *cursor) { WT_CURSOR_BTREE *cbt; WT_DECL_RET; WT_SESSION_IMPL *session; cbt = (WT_CURSOR_BTREE *)cursor; CURSOR_UPDATE_API_CALL(cursor, session, insert, cbt->btree); if (!F_ISSET(cursor, WT_CURSTD_APPEND)) WT_CURSOR_NEEDKEY(cursor); WT_CURSOR_NEEDVALUE(cursor); WT_BTREE_CURSOR_SAVE_AND_RESTORE(cursor, __wt_btcur_insert(cbt), ret); /* * Insert is the one cursor operation that doesn't end with the cursor * pointing to an on-page item. The standard macro handles errors * correctly, but we need to leave the application cursor unchanged in * the case of success, except for column-store appends, where we are * returning a key. */ if (ret == 0) { if (!F_ISSET(cursor, WT_CURSTD_APPEND)) { F_SET(cursor, WT_CURSTD_KEY_EXT); F_CLR(cursor, WT_CURSTD_KEY_INT); } F_SET(cursor, WT_CURSTD_VALUE_EXT); F_CLR(cursor, WT_CURSTD_VALUE_INT); } err: CURSOR_UPDATE_API_END(session, ret); return (ret); }
/* * __curfile_insert -- * WT_CURSOR->insert method for the btree cursor type. */ static int __curfile_insert(WT_CURSOR *cursor) { WT_CURSOR_BTREE *cbt; WT_DECL_RET; WT_SESSION_IMPL *session; cbt = (WT_CURSOR_BTREE *)cursor; CURSOR_UPDATE_API_CALL(cursor, session, insert, cbt->btree); if (!F_ISSET(cursor, WT_CURSTD_APPEND)) WT_CURSOR_NEEDKEY(cursor); WT_CURSOR_NEEDVALUE(cursor); WT_BTREE_CURSOR_SAVE_AND_RESTORE(cursor, __wt_btcur_insert(cbt), ret); /* * Insert is the one cursor operation that doesn't end with the cursor * pointing to an on-page item (except for column-store appends, where * we are returning a key). That is, the application's cursor continues * to reference the application's memory after a successful cursor call, * which isn't true anywhere else. We don't want to have to explain that * scoping corner case, so we reset the application's cursor so it can * free the referenced memory and continue on without risking subsequent * core dumps. */ if (ret == 0) { if (!F_ISSET(cursor, WT_CURSTD_APPEND)) F_CLR(cursor, WT_CURSTD_KEY_INT); F_CLR(cursor, WT_CURSTD_VALUE_INT); } err: CURSOR_UPDATE_API_END(session, ret); return (ret); }
/* * __curstat_get_value -- * WT_CURSOR->get_value for statistics cursors. */ static int __curstat_get_value(WT_CURSOR *cursor, ...) { WT_CURSOR_STAT *cst; WT_DECL_RET; WT_ITEM *item; WT_SESSION_IMPL *session; va_list ap; size_t size; uint64_t *v; const char *desc, **p; cst = (WT_CURSOR_STAT *)cursor; va_start(ap, cursor); CURSOR_API_CALL(cursor, session, get_value, NULL); WT_CURSOR_NEEDVALUE(cursor); WT_ERR(cst->stats_desc(cst, WT_STAT_KEY_OFFSET(cst), &desc)); if (F_ISSET(cursor, WT_CURSTD_RAW)) { WT_ERR(__wt_struct_size(session, &size, cursor->value_format, desc, cst->pv.data, cst->v)); WT_ERR(__wt_buf_initsize(session, &cursor->value, size)); WT_ERR(__wt_struct_pack(session, cursor->value.mem, size, cursor->value_format, desc, cst->pv.data, cst->v)); item = va_arg(ap, WT_ITEM *); item->data = cursor->value.data; item->size = cursor->value.size; } else { /* * Don't drop core if the statistics value isn't requested; NULL * pointer support isn't documented, but it's a cheap test. */ if ((p = va_arg(ap, const char **)) != NULL)
/* * __curstat_get_value -- * WT_CURSOR->get_value for statistics cursors. */ static int __curstat_get_value(WT_CURSOR *cursor, ...) { WT_CURSOR_STAT *cst; WT_DECL_RET; WT_ITEM *item; WT_SESSION_IMPL *session; va_list ap; size_t size; cst = (WT_CURSOR_STAT *)cursor; CURSOR_API_CALL(cursor, session, get_value, cst->btree); va_start(ap, cursor); WT_CURSOR_NEEDVALUE(cursor); if (F_ISSET(cursor, WT_CURSTD_RAW)) { WT_ERR(__wt_struct_size(session, &size, cursor->value_format, cst->stats_first[cst->key].desc, cst->pv.data, cst->v)); WT_ERR(__wt_buf_initsize(session, &cursor->value, size)); WT_ERR(__wt_struct_pack(session, cursor->value.mem, size, cursor->value_format, cst->stats_first[cst->key].desc, cst->pv.data, cst->v)); item = va_arg(ap, WT_ITEM *); item->data = cursor->value.data; item->size = cursor->value.size; } else {
/* * __curds_value_set - * Set the value for the data-source. */ static inline int __curds_value_set(WT_CURSOR *cursor) { WT_DECL_RET; WT_CURSOR_NEEDVALUE(cursor); cursor->data_source->value.data = cursor->value.data; cursor->data_source->value.size = cursor->value.size; err: return (ret); }
/* * __curds_value_set -- * Set the value for the data-source. */ static int __curds_value_set(WT_CURSOR *cursor) { WT_CURSOR *source; WT_DECL_RET; source = ((WT_CURSOR_DATA_SOURCE *)cursor)->source; WT_CURSOR_NEEDVALUE(cursor); source->value.data = cursor->value.data; source->value.size = cursor->value.size; err: return (ret); }
/* * __curfile_update -- * WT_CURSOR->update method for the btree cursor type. */ static int __curfile_update(WT_CURSOR *cursor) { WT_CURSOR_BTREE *cbt; WT_DECL_RET; WT_SESSION_IMPL *session; cbt = (WT_CURSOR_BTREE *)cursor; CURSOR_UPDATE_API_CALL(cursor, session, update, cbt->btree); WT_CURSOR_NEEDKEY(cursor); WT_CURSOR_NEEDVALUE(cursor); ret = __wt_btcur_update((WT_CURSOR_BTREE *)cursor); err: CURSOR_UPDATE_API_END(session, ret); return (ret); }
/* * __curfile_insert -- * WT_CURSOR->insert method for the btree cursor type. */ static int __curfile_insert(WT_CURSOR *cursor) { WT_CURSOR_BTREE *cbt; WT_DECL_RET; WT_SESSION_IMPL *session; cbt = (WT_CURSOR_BTREE *)cursor; CURSOR_UPDATE_API_CALL(cursor, session, insert, cbt->btree); if (!F_ISSET(cursor, WT_CURSTD_APPEND)) WT_CURSOR_NEEDKEY(cursor); WT_CURSOR_NEEDVALUE(cursor); ret = __wt_btcur_insert((WT_CURSOR_BTREE *)cursor); err: CURSOR_UPDATE_API_END(session, ret); return (ret); }
/* * __curbulk_insert -- * WT_CURSOR->insert for the bulk cursor type. */ static int __curbulk_insert(WT_CURSOR *cursor) { WT_BTREE *btree; WT_CURSOR_BULK *cbulk; WT_SESSION_IMPL *session; int ret; cbulk = (WT_CURSOR_BULK *)cursor; btree = cbulk->cbt.btree; CURSOR_API_CALL(cursor, session, insert, btree); if (btree->type == BTREE_ROW) WT_CURSOR_NEEDKEY(cursor); WT_CURSOR_NEEDVALUE(cursor); WT_ERR(__wt_bulk_insert(cbulk)); err: API_END(session); return (ret); }
/* * __curindex_get_value -- * WT_CURSOR->get_value implementation for index cursors. */ static int __curindex_get_value(WT_CURSOR *cursor, ...) { WT_CURSOR_INDEX *cindex; WT_DECL_RET; WT_ITEM *item; WT_SESSION_IMPL *session; va_list ap; cindex = (WT_CURSOR_INDEX *)cursor; CURSOR_API_CALL(cursor, session, get_value, NULL); WT_CURSOR_NEEDVALUE(cursor); va_start(ap, cursor); if (F_ISSET(cursor, WT_CURSTD_RAW)) { ret = __wt_schema_project_merge(session, cindex->cg_cursors, cindex->value_plan, cursor->value_format, &cursor->value); if (ret == 0) { item = va_arg(ap, WT_ITEM *); item->data = cursor->value.data; item->size = cursor->value.size; } } else
/* * __curbulk_insert -- * WT_CURSOR->insert for the bulk cursor type. */ static int __curbulk_insert(WT_CURSOR *cursor) { WT_BTREE *btree; WT_CURSOR_BULK *cbulk; WT_DECL_RET; WT_SESSION_IMPL *session; cbulk = (WT_CURSOR_BULK *)cursor; btree = cbulk->cbt.btree; /* * Bulk cursor inserts are updates, but don't need auto-commit * transactions because they are single-threaded and not visible until * the bulk cursor is closed. */ CURSOR_API_CALL(cursor, session, insert, btree); if (btree->type == BTREE_ROW) WT_CURSOR_NEEDKEY(cursor); WT_CURSOR_NEEDVALUE(cursor); WT_ERR(__wt_bulk_insert(cbulk)); err: API_END(session); return (ret); }