/* * __curmetadata_update -- * WT_CURSOR->update method for the metadata cursor type. */ static int __curmetadata_update(WT_CURSOR *cursor) { WT_CURSOR *file_cursor; WT_CURSOR_METADATA *mdc; WT_DECL_RET; WT_SESSION_IMPL *session; mdc = (WT_CURSOR_METADATA *)cursor; file_cursor = mdc->file_cursor; CURSOR_API_CALL(cursor, session, update, ((WT_CURSOR_BTREE *)file_cursor)->btree); WT_MD_CURSOR_NEEDKEY(cursor); WT_MD_CURSOR_NEEDVALUE(cursor); /* * Since the key/value formats are 's' the WT_ITEMs must contain a * NULL terminated string. */ ret = __wt_metadata_update(session, cursor->key.data, cursor->value.data); err: API_END(session, ret); return (ret); }
/* * __curmetadata_search_near -- * WT_CURSOR->search_near method for the metadata cursor type. */ static int __curmetadata_search_near(WT_CURSOR *cursor, int *exact) { WT_CURSOR *file_cursor; WT_CURSOR_METADATA *mdc; WT_DECL_RET; WT_SESSION_IMPL *session; mdc = (WT_CURSOR_METADATA *)cursor; file_cursor = mdc->file_cursor; CURSOR_API_CALL(cursor, session, search_near, ((WT_CURSOR_BTREE *)file_cursor)->btree); WT_MD_CURSOR_NEEDKEY(cursor); if (WT_STRING_MATCH( (char *)cursor->key.data, "metadata:", cursor->key.size - 1)) { WT_ERR(__curmetadata_metadata_search(session, cursor)); *exact = 1; } else { WT_ERR(file_cursor->search_near(file_cursor, exact)); WT_MD_SET_KEY_VALUE(cursor, mdc, file_cursor); } err: if (ret != 0) { F_CLR(mdc, WT_MDC_POSITIONED | WT_MDC_ONMETADATA); F_CLR(cursor, WT_CURSTD_KEY_EXT | WT_CURSTD_VALUE_EXT); } API_END(session, ret); return (ret); }
/* * __curmetadata_search -- * WT_CURSOR->search method for the metadata cursor type. */ static int __curmetadata_search(WT_CURSOR *cursor) { WT_CURSOR *file_cursor; WT_CURSOR_METADATA *mdc; WT_DECL_RET; WT_SESSION_IMPL *session; mdc = (WT_CURSOR_METADATA *)cursor; file_cursor = mdc->file_cursor; CURSOR_API_CALL(cursor, session, search, ((WT_CURSOR_BTREE *)file_cursor)->btree); WT_MD_CURSOR_NEEDKEY(cursor); if (WT_KEY_IS_METADATA(&cursor->key)) WT_ERR(__curmetadata_metadata_search(session, cursor)); else { WT_ERR(file_cursor->search(file_cursor)); WT_MD_SET_KEY_VALUE(cursor, mdc, file_cursor); } err: if (ret != 0) { F_CLR(mdc, WT_MDC_POSITIONED | WT_MDC_ONMETADATA); F_CLR(cursor, WT_CURSTD_KEY_EXT | WT_CURSTD_VALUE_EXT); } API_END_RET(session, ret); }
/* * __curmetadata_search_near -- * WT_CURSOR->search_near method for the metadata cursor type. */ static int __curmetadata_search_near(WT_CURSOR *cursor, int *exact) { WT_CURSOR *file_cursor; WT_CURSOR_METADATA *mdc; WT_DECL_RET; WT_SESSION_IMPL *session; mdc = (WT_CURSOR_METADATA *)cursor; file_cursor = mdc->file_cursor; CURSOR_API_CALL(cursor, session, search_near, ((WT_CURSOR_BTREE *)file_cursor)->btree); WT_MD_CURSOR_NEEDKEY(cursor); if (WT_KEY_IS_METADATA(&cursor->key)) { WT_ERR(__curmetadata_metadata_search(session, cursor)); *exact = 1; } else { WT_WITH_TXN_ISOLATION(session, WT_ISO_READ_UNCOMMITTED, ret = file_cursor->search_near(file_cursor, exact)); WT_ERR(ret); WT_ERR(__curmetadata_setkv(mdc, file_cursor)); } err: if (ret != 0) { F_CLR(mdc, WT_MDC_POSITIONED | WT_MDC_ONMETADATA); F_CLR(cursor, WT_CURSTD_KEY_EXT | WT_CURSTD_VALUE_EXT); } API_END_RET(session, ret); }
/* * __curmetadata_compare -- * WT_CURSOR->compare method for the metadata cursor type. */ static int __curmetadata_compare(WT_CURSOR *a, WT_CURSOR *b, int *cmpp) { WT_CURSOR *a_file_cursor, *b_file_cursor; WT_CURSOR_METADATA *a_mdc, *b_mdc; WT_DECL_RET; WT_SESSION_IMPL *session; a_mdc = ((WT_CURSOR_METADATA *)a); b_mdc = ((WT_CURSOR_METADATA *)b); a_file_cursor = a_mdc->file_cursor; b_file_cursor = b_mdc->file_cursor; CURSOR_API_CALL(a, session, compare, ((WT_CURSOR_BTREE *)a_file_cursor)->btree); if (b->compare != __curmetadata_compare) WT_ERR_MSG(session, EINVAL, "Can only compare cursors of the same type"); WT_MD_CURSOR_NEEDKEY(a); WT_MD_CURSOR_NEEDKEY(b); if (F_ISSET(a_mdc, WT_MDC_ONMETADATA)) { if (F_ISSET(b_mdc, WT_MDC_ONMETADATA)) *cmpp = 0; else *cmpp = 1; } else if (F_ISSET(b_mdc, WT_MDC_ONMETADATA)) *cmpp = -1; else ret = a_file_cursor->compare( a_file_cursor, b_file_cursor, cmpp); err: API_END(session, ret); return (ret); }
/* * __curmetadata_remove -- * WT_CURSOR->remove method for the metadata cursor type. */ static int __curmetadata_remove(WT_CURSOR *cursor) { WT_CURSOR *file_cursor; WT_CURSOR_METADATA *mdc; WT_DECL_RET; WT_SESSION_IMPL *session; mdc = (WT_CURSOR_METADATA *)cursor; file_cursor = mdc->file_cursor; CURSOR_API_CALL(cursor, session, remove, ((WT_CURSOR_BTREE *)file_cursor)->btree); WT_MD_CURSOR_NEEDKEY(cursor); /* * Since the key format is 's' the WT_ITEM must contain a NULL * terminated string. */ ret = __wt_metadata_remove(session, cursor->key.data); err: API_END_RET(session, ret); }