summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/cursor/cur_dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/cursor/cur_dump.c')
-rw-r--r--src/third_party/wiredtiger/src/cursor/cur_dump.c614
1 files changed, 300 insertions, 314 deletions
diff --git a/src/third_party/wiredtiger/src/cursor/cur_dump.c b/src/third_party/wiredtiger/src/cursor/cur_dump.c
index 135bbf0027f..73690788dfb 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_dump.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_dump.c
@@ -10,296 +10,283 @@
/*
* __raw_to_dump --
- * We have a buffer where the data item contains a raw value,
- * convert it to a printable string.
+ * We have a buffer where the data item contains a raw value, convert it to a printable string.
*/
static int
-__raw_to_dump(
- WT_SESSION_IMPL *session, WT_ITEM *from, WT_ITEM *to, bool hexonly)
+__raw_to_dump(WT_SESSION_IMPL *session, WT_ITEM *from, WT_ITEM *to, bool hexonly)
{
- if (hexonly)
- WT_RET(__wt_raw_to_hex(session, from->data, from->size, to));
- else
- WT_RET(
- __wt_raw_to_esc_hex(session, from->data, from->size, to));
+ if (hexonly)
+ WT_RET(__wt_raw_to_hex(session, from->data, from->size, to));
+ else
+ WT_RET(__wt_raw_to_esc_hex(session, from->data, from->size, to));
- return (0);
+ return (0);
}
/*
* __dump_to_raw --
- * We have a buffer containing a dump string,
- * convert it to a raw value.
+ * We have a buffer containing a dump string, convert it to a raw value.
*/
static int
-__dump_to_raw(
- WT_SESSION_IMPL *session, const char *src_arg, WT_ITEM *item, bool hexonly)
+__dump_to_raw(WT_SESSION_IMPL *session, const char *src_arg, WT_ITEM *item, bool hexonly)
{
- if (hexonly)
- WT_RET(__wt_hex_to_raw(session, src_arg, item));
- else
- WT_RET(__wt_esc_hex_to_raw(session, src_arg, item));
+ if (hexonly)
+ WT_RET(__wt_hex_to_raw(session, src_arg, item));
+ else
+ WT_RET(__wt_esc_hex_to_raw(session, src_arg, item));
- return (0);
+ return (0);
}
/*
* __curdump_get_key --
- * WT_CURSOR->get_key for dump cursors.
+ * WT_CURSOR->get_key for dump cursors.
*/
static int
__curdump_get_key(WT_CURSOR *cursor, ...)
{
- WT_CURSOR *child;
- WT_CURSOR_DUMP *cdump;
- WT_CURSOR_JSON *json;
- WT_DECL_RET;
- WT_ITEM item, *itemp;
- WT_SESSION_IMPL *session;
- size_t size;
- uint64_t recno;
- const char *fmt;
- va_list ap;
- const void *buffer;
-
- cdump = (WT_CURSOR_DUMP *)cursor;
- child = cdump->child;
-
- va_start(ap, cursor);
- CURSOR_API_CALL(cursor, session, get_key, NULL);
-
- if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON)) {
- json = (WT_CURSOR_JSON *)cursor->json_private;
- WT_ASSERT(session, json != NULL);
- if (WT_CURSOR_RECNO(cursor)) {
- WT_ERR(child->get_key(child, &recno));
- buffer = &recno;
- size = sizeof(recno);
- fmt = "R";
- } else {
- WT_ERR(__wt_cursor_get_raw_key(child, &item));
- buffer = item.data;
- size = item.size;
- if (F_ISSET(cursor, WT_CURSTD_RAW))
- fmt = "u";
- else
- fmt = cursor->key_format;
- }
- ret = __wt_json_alloc_unpack(
- session, buffer, size, fmt, json, true, ap);
- } else {
- if (WT_CURSOR_RECNO(cursor) &&
- !F_ISSET(cursor, WT_CURSTD_RAW)) {
- WT_ERR(child->get_key(child, &recno));
-
- WT_ERR(__wt_buf_fmt(session, &cursor->key, "%"
- PRIu64, recno));
- } else {
- WT_ERR(child->get_key(child, &item));
-
- WT_ERR(__raw_to_dump(session, &item, &cursor->key,
- F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
- }
-
- if (F_ISSET(cursor, WT_CURSTD_RAW)) {
- itemp = va_arg(ap, WT_ITEM *);
- itemp->data = cursor->key.data;
- itemp->size = cursor->key.size;
- } else
- *va_arg(ap, const char **) = cursor->key.data;
- }
-
-err: va_end(ap);
- API_END_RET(session, ret);
+ WT_CURSOR *child;
+ WT_CURSOR_DUMP *cdump;
+ WT_CURSOR_JSON *json;
+ WT_DECL_RET;
+ WT_ITEM item, *itemp;
+ WT_SESSION_IMPL *session;
+ size_t size;
+ uint64_t recno;
+ const char *fmt;
+ va_list ap;
+ const void *buffer;
+
+ cdump = (WT_CURSOR_DUMP *)cursor;
+ child = cdump->child;
+
+ va_start(ap, cursor);
+ CURSOR_API_CALL(cursor, session, get_key, NULL);
+
+ if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON)) {
+ json = (WT_CURSOR_JSON *)cursor->json_private;
+ WT_ASSERT(session, json != NULL);
+ if (WT_CURSOR_RECNO(cursor)) {
+ WT_ERR(child->get_key(child, &recno));
+ buffer = &recno;
+ size = sizeof(recno);
+ fmt = "R";
+ } else {
+ WT_ERR(__wt_cursor_get_raw_key(child, &item));
+ buffer = item.data;
+ size = item.size;
+ if (F_ISSET(cursor, WT_CURSTD_RAW))
+ fmt = "u";
+ else
+ fmt = cursor->key_format;
+ }
+ ret = __wt_json_alloc_unpack(session, buffer, size, fmt, json, true, ap);
+ } else {
+ if (WT_CURSOR_RECNO(cursor) && !F_ISSET(cursor, WT_CURSTD_RAW)) {
+ WT_ERR(child->get_key(child, &recno));
+
+ WT_ERR(__wt_buf_fmt(session, &cursor->key, "%" PRIu64, recno));
+ } else {
+ WT_ERR(child->get_key(child, &item));
+
+ WT_ERR(
+ __raw_to_dump(session, &item, &cursor->key, F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
+ }
+
+ if (F_ISSET(cursor, WT_CURSTD_RAW)) {
+ itemp = va_arg(ap, WT_ITEM *);
+ itemp->data = cursor->key.data;
+ itemp->size = cursor->key.size;
+ } else
+ *va_arg(ap, const char **) = cursor->key.data;
+ }
+
+err:
+ va_end(ap);
+ API_END_RET(session, ret);
}
/*
* str2recno --
- * Convert a string to a record number.
+ * Convert a string to a record number.
*/
static int
str2recno(WT_SESSION_IMPL *session, const char *p, uint64_t *recnop)
{
- uint64_t recno;
- char *endptr;
-
- /*
- * strtouq takes lots of things like hex values, signs and so on and so
- * forth -- none of them are OK with us. Check the string starts with
- * digit, that turns off the special processing.
- */
- if (!__wt_isdigit((u_char)p[0]))
- goto format;
-
- errno = 0;
- recno = __wt_strtouq(p, &endptr, 0);
- if (recno == ULLONG_MAX && errno == ERANGE)
- WT_RET_MSG(session, ERANGE, "%s: invalid record number", p);
- if (endptr[0] != '\0')
-format: WT_RET_MSG(session, EINVAL, "%s: invalid record number", p);
-
- *recnop = recno;
- return (0);
+ uint64_t recno;
+ char *endptr;
+
+ /*
+ * strtouq takes lots of things like hex values, signs and so on and so forth -- none of them
+ * are OK with us. Check the string starts with digit, that turns off the special processing.
+ */
+ if (!__wt_isdigit((u_char)p[0]))
+ goto format;
+
+ errno = 0;
+ recno = __wt_strtouq(p, &endptr, 0);
+ if (recno == ULLONG_MAX && errno == ERANGE)
+ WT_RET_MSG(session, ERANGE, "%s: invalid record number", p);
+ if (endptr[0] != '\0')
+format:
+ WT_RET_MSG(session, EINVAL, "%s: invalid record number", p);
+
+ *recnop = recno;
+ return (0);
}
/*
* __curdump_set_key --
- * WT_CURSOR->set_key for dump cursors.
+ * WT_CURSOR->set_key for dump cursors.
*/
static void
__curdump_set_key(WT_CURSOR *cursor, ...)
{
- WT_CURSOR *child;
- WT_CURSOR_DUMP *cdump;
- WT_DECL_RET;
- WT_SESSION_IMPL *session;
- uint64_t recno;
- const uint8_t *up;
- const char *p;
- bool json;
- va_list ap;
-
- cdump = (WT_CURSOR_DUMP *)cursor;
- child = cdump->child;
- CURSOR_API_CALL(cursor, session, set_key, NULL);
-
- va_start(ap, cursor);
- if (F_ISSET(cursor, WT_CURSTD_RAW))
- p = va_arg(ap, WT_ITEM *)->data;
- else
- p = va_arg(ap, const char *);
- va_end(ap);
-
- json = F_ISSET(cursor, WT_CURSTD_DUMP_JSON);
- if (json)
- WT_ERR(__wt_json_to_item(session, p, cursor->key_format,
- (WT_CURSOR_JSON *)cursor->json_private, true,
- &cursor->key));
-
- if (WT_CURSOR_RECNO(cursor) && !F_ISSET(cursor, WT_CURSTD_RAW)) {
- if (json) {
- up = (const uint8_t *)cursor->key.data;
- WT_ERR(__wt_vunpack_uint(&up, cursor->key.size,
- &recno));
- } else
- WT_ERR(str2recno(session, p, &recno));
-
- child->set_key(child, recno);
- } else {
- if (!json)
- WT_ERR(__dump_to_raw(session, p, &cursor->key,
- F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
-
- child->set_key(child, &cursor->key);
- }
-
- if (0) {
-err: cursor->saved_err = ret;
- F_CLR(cursor, WT_CURSTD_KEY_SET);
- }
- API_END(session, ret);
+ WT_CURSOR *child;
+ WT_CURSOR_DUMP *cdump;
+ WT_DECL_RET;
+ WT_SESSION_IMPL *session;
+ uint64_t recno;
+ const uint8_t *up;
+ const char *p;
+ bool json;
+ va_list ap;
+
+ cdump = (WT_CURSOR_DUMP *)cursor;
+ child = cdump->child;
+ CURSOR_API_CALL(cursor, session, set_key, NULL);
+
+ va_start(ap, cursor);
+ if (F_ISSET(cursor, WT_CURSTD_RAW))
+ p = va_arg(ap, WT_ITEM *)->data;
+ else
+ p = va_arg(ap, const char *);
+ va_end(ap);
+
+ json = F_ISSET(cursor, WT_CURSTD_DUMP_JSON);
+ if (json)
+ WT_ERR(__wt_json_to_item(session, p, cursor->key_format,
+ (WT_CURSOR_JSON *)cursor->json_private, true, &cursor->key));
+
+ if (WT_CURSOR_RECNO(cursor) && !F_ISSET(cursor, WT_CURSTD_RAW)) {
+ if (json) {
+ up = (const uint8_t *)cursor->key.data;
+ WT_ERR(__wt_vunpack_uint(&up, cursor->key.size, &recno));
+ } else
+ WT_ERR(str2recno(session, p, &recno));
+
+ child->set_key(child, recno);
+ } else {
+ if (!json)
+ WT_ERR(__dump_to_raw(session, p, &cursor->key, F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
+
+ child->set_key(child, &cursor->key);
+ }
+
+ if (0) {
+err:
+ cursor->saved_err = ret;
+ F_CLR(cursor, WT_CURSTD_KEY_SET);
+ }
+ API_END(session, ret);
}
/*
* __curdump_get_value --
- * WT_CURSOR->get_value for dump cursors.
+ * WT_CURSOR->get_value for dump cursors.
*/
static int
__curdump_get_value(WT_CURSOR *cursor, ...)
{
- WT_CURSOR *child;
- WT_CURSOR_DUMP *cdump;
- WT_CURSOR_JSON *json;
- WT_DECL_RET;
- WT_ITEM item, *itemp;
- WT_SESSION_IMPL *session;
- const char *fmt;
- va_list ap;
-
- cdump = (WT_CURSOR_DUMP *)cursor;
- child = cdump->child;
-
- va_start(ap, cursor);
- CURSOR_API_CALL(cursor, session, get_value, NULL);
-
- if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON)) {
- json = (WT_CURSOR_JSON *)cursor->json_private;
- WT_ASSERT(session, json != NULL);
- WT_ERR(__wt_cursor_get_raw_value(child, &item));
- fmt = F_ISSET(cursor, WT_CURSTD_RAW) ?
- "u" : cursor->value_format;
- ret = __wt_json_alloc_unpack(
- session, item.data, item.size, fmt, json, false, ap);
- } else {
- WT_ERR(child->get_value(child, &item));
-
- WT_ERR(__raw_to_dump(session, &item, &cursor->value,
- F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
-
- if (F_ISSET(cursor, WT_CURSTD_RAW)) {
- itemp = va_arg(ap, WT_ITEM *);
- itemp->data = cursor->value.data;
- itemp->size = cursor->value.size;
- } else
- *va_arg(ap, const char **) = cursor->value.data;
- }
-
-err: va_end(ap);
- API_END_RET(session, ret);
+ WT_CURSOR *child;
+ WT_CURSOR_DUMP *cdump;
+ WT_CURSOR_JSON *json;
+ WT_DECL_RET;
+ WT_ITEM item, *itemp;
+ WT_SESSION_IMPL *session;
+ const char *fmt;
+ va_list ap;
+
+ cdump = (WT_CURSOR_DUMP *)cursor;
+ child = cdump->child;
+
+ va_start(ap, cursor);
+ CURSOR_API_CALL(cursor, session, get_value, NULL);
+
+ if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON)) {
+ json = (WT_CURSOR_JSON *)cursor->json_private;
+ WT_ASSERT(session, json != NULL);
+ WT_ERR(__wt_cursor_get_raw_value(child, &item));
+ fmt = F_ISSET(cursor, WT_CURSTD_RAW) ? "u" : cursor->value_format;
+ ret = __wt_json_alloc_unpack(session, item.data, item.size, fmt, json, false, ap);
+ } else {
+ WT_ERR(child->get_value(child, &item));
+
+ WT_ERR(__raw_to_dump(session, &item, &cursor->value, F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
+
+ if (F_ISSET(cursor, WT_CURSTD_RAW)) {
+ itemp = va_arg(ap, WT_ITEM *);
+ itemp->data = cursor->value.data;
+ itemp->size = cursor->value.size;
+ } else
+ *va_arg(ap, const char **) = cursor->value.data;
+ }
+
+err:
+ va_end(ap);
+ API_END_RET(session, ret);
}
/*
* __curdump_set_value --
- * WT_CURSOR->set_value for dump cursors.
+ * WT_CURSOR->set_value for dump cursors.
*/
static void
__curdump_set_value(WT_CURSOR *cursor, ...)
{
- WT_CURSOR *child;
- WT_CURSOR_DUMP *cdump;
- WT_DECL_RET;
- WT_SESSION_IMPL *session;
- const char *p;
- va_list ap;
-
- cdump = (WT_CURSOR_DUMP *)cursor;
- child = cdump->child;
- CURSOR_API_CALL(cursor, session, set_value, NULL);
-
- va_start(ap, cursor);
- if (F_ISSET(cursor, WT_CURSTD_RAW))
- p = va_arg(ap, WT_ITEM *)->data;
- else
- p = va_arg(ap, const char *);
- va_end(ap);
-
- if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON))
- WT_ERR(__wt_json_to_item(session, p, cursor->value_format,
- (WT_CURSOR_JSON *)cursor->json_private, false,
- &cursor->value));
- else
- WT_ERR(__dump_to_raw(session, p, &cursor->value,
- F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
-
- child->set_value(child, &cursor->value);
-
- if (0) {
-err: cursor->saved_err = ret;
- F_CLR(cursor, WT_CURSTD_VALUE_SET);
- }
- API_END(session, ret);
+ WT_CURSOR *child;
+ WT_CURSOR_DUMP *cdump;
+ WT_DECL_RET;
+ WT_SESSION_IMPL *session;
+ const char *p;
+ va_list ap;
+
+ cdump = (WT_CURSOR_DUMP *)cursor;
+ child = cdump->child;
+ CURSOR_API_CALL(cursor, session, set_value, NULL);
+
+ va_start(ap, cursor);
+ if (F_ISSET(cursor, WT_CURSTD_RAW))
+ p = va_arg(ap, WT_ITEM *)->data;
+ else
+ p = va_arg(ap, const char *);
+ va_end(ap);
+
+ if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON))
+ WT_ERR(__wt_json_to_item(session, p, cursor->value_format,
+ (WT_CURSOR_JSON *)cursor->json_private, false, &cursor->value));
+ else
+ WT_ERR(__dump_to_raw(session, p, &cursor->value, F_ISSET(cursor, WT_CURSTD_DUMP_HEX)));
+
+ child->set_value(child, &cursor->value);
+
+ if (0) {
+err:
+ cursor->saved_err = ret;
+ F_CLR(cursor, WT_CURSTD_VALUE_SET);
+ }
+ API_END(session, ret);
}
/* Pass through a call to the underlying cursor. */
-#define WT_CURDUMP_PASS(op) \
-static int \
-__curdump_##op(WT_CURSOR *cursor) \
-{ \
- WT_CURSOR *child; \
- \
- child = ((WT_CURSOR_DUMP *)cursor)->child; \
- return (child->op(child)); \
-}
+#define WT_CURDUMP_PASS(op) \
+ static int __curdump_##op(WT_CURSOR *cursor) \
+ { \
+ WT_CURSOR *child; \
+ \
+ child = ((WT_CURSOR_DUMP *)cursor)->child; \
+ return (child->op(child)); \
+ }
WT_CURDUMP_PASS(next)
WT_CURDUMP_PASS(prev)
@@ -308,15 +295,15 @@ WT_CURDUMP_PASS(search)
/*
* __curdump_search_near --
- * WT_CURSOR::search_near for dump cursors.
+ * WT_CURSOR::search_near for dump cursors.
*/
static int
__curdump_search_near(WT_CURSOR *cursor, int *exact)
{
- WT_CURSOR_DUMP *cdump;
+ WT_CURSOR_DUMP *cdump;
- cdump = (WT_CURSOR_DUMP *)cursor;
- return (cdump->child->search_near(cdump->child, exact));
+ cdump = (WT_CURSOR_DUMP *)cursor;
+ return (cdump->child->search_near(cdump->child, exact));
}
WT_CURDUMP_PASS(insert)
@@ -325,94 +312,93 @@ WT_CURDUMP_PASS(remove)
/*
* __curdump_close --
- * WT_CURSOR::close for dump cursors.
+ * WT_CURSOR::close for dump cursors.
*/
static int
__curdump_close(WT_CURSOR *cursor)
{
- WT_CURSOR *child;
- WT_CURSOR_DUMP *cdump;
- WT_DECL_RET;
- WT_SESSION_IMPL *session;
-
- cdump = (WT_CURSOR_DUMP *)cursor;
- child = cdump->child;
- CURSOR_API_CALL_PREPARE_ALLOWED(cursor, session, close, NULL);
+ WT_CURSOR *child;
+ WT_CURSOR_DUMP *cdump;
+ WT_DECL_RET;
+ WT_SESSION_IMPL *session;
+
+ cdump = (WT_CURSOR_DUMP *)cursor;
+ child = cdump->child;
+ CURSOR_API_CALL_PREPARE_ALLOWED(cursor, session, close, NULL);
err:
- if (child != NULL)
- WT_TRET(child->close(child));
- /* We shared the child's URI. */
- cursor->internal_uri = NULL;
- __wt_json_close(session, cursor);
- __wt_cursor_close(cursor);
+ if (child != NULL)
+ WT_TRET(child->close(child));
+ /* We shared the child's URI. */
+ cursor->internal_uri = NULL;
+ __wt_json_close(session, cursor);
+ __wt_cursor_close(cursor);
- API_END_RET(session, ret);
+ API_END_RET(session, ret);
}
/*
* __wt_curdump_create --
- * initialize a dump cursor.
+ * initialize a dump cursor.
*/
int
__wt_curdump_create(WT_CURSOR *child, WT_CURSOR *owner, WT_CURSOR **cursorp)
{
- WT_CURSOR_STATIC_INIT(iface,
- __curdump_get_key, /* get-key */
- __curdump_get_value, /* get-value */
- __curdump_set_key, /* set-key */
- __curdump_set_value, /* set-value */
- __wt_cursor_compare_notsup, /* compare */
- __wt_cursor_equals_notsup, /* equals */
- __curdump_next, /* next */
- __curdump_prev, /* prev */
- __curdump_reset, /* reset */
- __curdump_search, /* search */
- __curdump_search_near, /* search-near */
- __curdump_insert, /* insert */
- __wt_cursor_modify_notsup, /* modify */
- __curdump_update, /* update */
- __curdump_remove, /* remove */
- __wt_cursor_notsup, /* reserve */
- __wt_cursor_reconfigure_notsup, /* reconfigure */
- __wt_cursor_notsup, /* cache */
- __wt_cursor_reopen_notsup, /* reopen */
- __curdump_close); /* close */
- WT_CURSOR *cursor;
- WT_CURSOR_DUMP *cdump;
- WT_CURSOR_JSON *json;
- WT_DECL_RET;
- WT_SESSION_IMPL *session;
- const char *cfg[2];
-
- WT_STATIC_ASSERT(offsetof(WT_CURSOR_DUMP, iface) == 0);
-
- session = (WT_SESSION_IMPL *)child->session;
-
- WT_RET(__wt_calloc_one(session, &cdump));
- cursor = (WT_CURSOR *)cdump;
- *cursor = iface;
- cursor->session = child->session;
- cursor->internal_uri = child->internal_uri;
- cursor->key_format = child->key_format;
- cursor->value_format = child->value_format;
- cdump->child = child;
-
- /* Copy the dump flags from the child cursor. */
- F_SET(cursor, F_MASK(child,
- WT_CURSTD_DUMP_HEX | WT_CURSTD_DUMP_JSON | WT_CURSTD_DUMP_PRINT));
- if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON)) {
- WT_ERR(__wt_calloc_one(session, &json));
- cursor->json_private = child->json_private = json;
- }
-
- cfg[0] = WT_CONFIG_BASE(session, WT_SESSION_open_cursor);
- cfg[1] = NULL;
- WT_ERR(__wt_cursor_init(cursor, NULL, owner, cfg, cursorp));
-
- if (0) {
-err: WT_TRET(__curdump_close(cursor));
- *cursorp = NULL;
- }
- return (ret);
+ WT_CURSOR_STATIC_INIT(iface, __curdump_get_key, /* get-key */
+ __curdump_get_value, /* get-value */
+ __curdump_set_key, /* set-key */
+ __curdump_set_value, /* set-value */
+ __wt_cursor_compare_notsup, /* compare */
+ __wt_cursor_equals_notsup, /* equals */
+ __curdump_next, /* next */
+ __curdump_prev, /* prev */
+ __curdump_reset, /* reset */
+ __curdump_search, /* search */
+ __curdump_search_near, /* search-near */
+ __curdump_insert, /* insert */
+ __wt_cursor_modify_notsup, /* modify */
+ __curdump_update, /* update */
+ __curdump_remove, /* remove */
+ __wt_cursor_notsup, /* reserve */
+ __wt_cursor_reconfigure_notsup, /* reconfigure */
+ __wt_cursor_notsup, /* cache */
+ __wt_cursor_reopen_notsup, /* reopen */
+ __curdump_close); /* close */
+ WT_CURSOR *cursor;
+ WT_CURSOR_DUMP *cdump;
+ WT_CURSOR_JSON *json;
+ WT_DECL_RET;
+ WT_SESSION_IMPL *session;
+ const char *cfg[2];
+
+ WT_STATIC_ASSERT(offsetof(WT_CURSOR_DUMP, iface) == 0);
+
+ session = (WT_SESSION_IMPL *)child->session;
+
+ WT_RET(__wt_calloc_one(session, &cdump));
+ cursor = (WT_CURSOR *)cdump;
+ *cursor = iface;
+ cursor->session = child->session;
+ cursor->internal_uri = child->internal_uri;
+ cursor->key_format = child->key_format;
+ cursor->value_format = child->value_format;
+ cdump->child = child;
+
+ /* Copy the dump flags from the child cursor. */
+ F_SET(cursor, F_MASK(child, WT_CURSTD_DUMP_HEX | WT_CURSTD_DUMP_JSON | WT_CURSTD_DUMP_PRINT));
+ if (F_ISSET(cursor, WT_CURSTD_DUMP_JSON)) {
+ WT_ERR(__wt_calloc_one(session, &json));
+ cursor->json_private = child->json_private = json;
+ }
+
+ cfg[0] = WT_CONFIG_BASE(session, WT_SESSION_open_cursor);
+ cfg[1] = NULL;
+ WT_ERR(__wt_cursor_init(cursor, NULL, owner, cfg, cursorp));
+
+ if (0) {
+err:
+ WT_TRET(__curdump_close(cursor));
+ *cursorp = NULL;
+ }
+ return (ret);
}