/* * __curmetadata_metadata_search -- * Retrieve the metadata for the metadata table */ static int __curmetadata_metadata_search(WT_SESSION_IMPL *session, WT_CURSOR *cursor) { WT_CURSOR_METADATA *mdc; WT_DECL_RET; const char *value; mdc = (WT_CURSOR_METADATA *)cursor; /* The metadata search interface allocates a new string in value. */ WT_RET(__wt_metadata_search(session, WT_METAFILE_URI, &value)); /* * Copy the value to the underlying btree cursor's tmp item which will * be freed when the cursor is closed. */ ret = __wt_buf_setstr(session, &cursor->value, value); __wt_free(session, value); WT_RET(ret); WT_RET(__wt_buf_setstr(session, &cursor->key, WT_METADATA_URI)); F_SET(mdc, WT_MDC_ONMETADATA | WT_MDC_POSITIONED); F_SET(cursor, WT_CURSTD_KEY_EXT | WT_CURSTD_VALUE_EXT); return (0); }
/* * __curmetadata_metadata_search -- * Retrieve the metadata for the metadata table */ static int __curmetadata_metadata_search(WT_SESSION_IMPL *session, WT_CURSOR *cursor) { WT_CURSOR_METADATA *mdc; WT_DECL_RET; char *value, *stripped; mdc = (WT_CURSOR_METADATA *)cursor; /* The metadata search interface allocates a new string in value. */ WT_RET(__wt_metadata_search(session, WT_METAFILE_URI, &value)); if (F_ISSET(mdc, WT_MDC_CREATEONLY)) { ret = __schema_create_strip(session, value, &stripped); __wt_free(session, value); WT_RET(ret); value = stripped; } ret = __wt_buf_setstr(session, &cursor->value, value); __wt_free(session, value); WT_RET(ret); WT_RET(__wt_buf_setstr(session, &cursor->key, WT_METADATA_URI)); F_SET(mdc, WT_MDC_ONMETADATA | WT_MDC_POSITIONED); F_SET(cursor, WT_CURSTD_KEY_EXT | WT_CURSTD_VALUE_EXT); return (0); }
/* * __posix_directory_sync -- * Flush a directory to ensure file creation, remove or rename is durable. */ static int __posix_directory_sync(WT_SESSION_IMPL *session, const char *path) { WT_DECL_ITEM(tmp); WT_DECL_RET; int fd, tret; char *dir; WT_RET(__wt_scr_alloc(session, 0, &tmp)); WT_ERR(__wt_buf_setstr(session, tmp, path)); /* * This layer should never see a path that doesn't include a trailing * path separator, this code asserts that fact. */ dir = tmp->mem; strrchr(dir, '/')[1] = '\0'; fd = -1; /* -Wconditional-uninitialized */ WT_SYSCALL_RETRY(( (fd = open(dir, O_RDONLY, 0444)) == -1 ? -1 : 0), ret); if (ret != 0) WT_ERR_MSG(session, ret, "%s: directory-sync: open", dir); ret = __posix_sync(session, fd, dir, "directory-sync"); WT_SYSCALL(close(fd), tret); if (tret != 0) { __wt_err(session, tret, "%s: directory-sync: close", dir); if (ret == 0) ret = tret; } err: __wt_scr_free(session, &tmp); return (ret); }