summaryrefslogtreecommitdiff
path: root/src/cursor
diff options
context:
space:
mode:
authorKeith Bostic <keith@wiredtiger.com>2014-12-11 19:32:50 -0500
committerKeith Bostic <keith@wiredtiger.com>2014-12-11 19:32:50 -0500
commit4c26d2324bae1d7030b0142d50dbd2ccf11ddeb6 (patch)
tree2a503b40b20650427eb66039766eb5c9575ce3c7 /src/cursor
parent9b33b7c46a2672f36b9673d5e4cbc7315bc9ecf4 (diff)
downloadmongo-4c26d2324bae1d7030b0142d50dbd2ccf11ddeb6.tar.gz
Add support for a WT_CURSOR.reconfigure method, reference #1381.
Diffstat (limited to 'src/cursor')
-rw-r--r--src/cursor/cur_backup.c1
-rw-r--r--src/cursor/cur_config.c1
-rw-r--r--src/cursor/cur_ds.c1
-rw-r--r--src/cursor/cur_dump.c1
-rw-r--r--src/cursor/cur_file.c1
-rw-r--r--src/cursor/cur_index.c1
-rw-r--r--src/cursor/cur_log.c1
-rw-r--r--src/cursor/cur_metadata.c13
-rw-r--r--src/cursor/cur_stat.c1
-rw-r--r--src/cursor/cur_std.c127
-rw-r--r--src/cursor/cur_table.c58
11 files changed, 127 insertions, 79 deletions
diff --git a/src/cursor/cur_backup.c b/src/cursor/cur_backup.c
index b993e3f1af4..41bfaea7ee3 100644
--- a/src/cursor/cur_backup.c
+++ b/src/cursor/cur_backup.c
@@ -116,6 +116,7 @@ __wt_curbackup_open(WT_SESSION_IMPL *session,
__wt_cursor_notsup, /* insert */
__wt_cursor_notsup, /* update */
__wt_cursor_notsup, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curbackup_close); /* close */
WT_CURSOR *cursor;
WT_CURSOR_BACKUP *cb;
diff --git a/src/cursor/cur_config.c b/src/cursor/cur_config.c
index 868b144efc1..5e7ca487ae2 100644
--- a/src/cursor/cur_config.c
+++ b/src/cursor/cur_config.c
@@ -39,6 +39,7 @@ __wt_curconfig_open(WT_SESSION_IMPL *session,
__wt_cursor_notsup, /* insert */
__wt_cursor_notsup, /* update */
__wt_cursor_notsup, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curconfig_close);
WT_CURSOR_CONFIG *cconfig;
WT_CURSOR *cursor;
diff --git a/src/cursor/cur_ds.c b/src/cursor/cur_ds.c
index fc742ae7c3d..096a0e27f8d 100644
--- a/src/cursor/cur_ds.c
+++ b/src/cursor/cur_ds.c
@@ -461,6 +461,7 @@ __wt_curds_open(
__curds_insert, /* insert */
__curds_update, /* update */
__curds_remove, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curds_close); /* close */
WT_CONFIG_ITEM cval, metadata;
WT_CURSOR *cursor, *source;
diff --git a/src/cursor/cur_dump.c b/src/cursor/cur_dump.c
index 003b7e1f961..5760752d406 100644
--- a/src/cursor/cur_dump.c
+++ b/src/cursor/cur_dump.c
@@ -359,6 +359,7 @@ __wt_curdump_create(WT_CURSOR *child, WT_CURSOR *owner, WT_CURSOR **cursorp)
__curdump_insert, /* insert */
__curdump_update, /* update */
__curdump_remove, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curdump_close); /* close */
WT_CURSOR *cursor;
WT_CURSOR_DUMP *cdump;
diff --git a/src/cursor/cur_file.c b/src/cursor/cur_file.c
index 5d6072ceb3e..c833dfa0677 100644
--- a/src/cursor/cur_file.c
+++ b/src/cursor/cur_file.c
@@ -363,6 +363,7 @@ __wt_curfile_create(WT_SESSION_IMPL *session,
__curfile_insert, /* insert */
__curfile_update, /* update */
__curfile_remove, /* remove */
+ __wt_cursor_reconfigure, /* reconfigure */
__curfile_close); /* close */
WT_BTREE *btree;
WT_CONFIG_ITEM cval;
diff --git a/src/cursor/cur_index.c b/src/cursor/cur_index.c
index 936337047b8..b516b5c58b1 100644
--- a/src/cursor/cur_index.c
+++ b/src/cursor/cur_index.c
@@ -350,6 +350,7 @@ __wt_curindex_open(WT_SESSION_IMPL *session,
__wt_cursor_notsup, /* insert */
__wt_cursor_notsup, /* update */
__wt_cursor_notsup, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curindex_close); /* close */
WT_CURSOR_INDEX *cindex;
WT_CURSOR *cursor;
diff --git a/src/cursor/cur_log.c b/src/cursor/cur_log.c
index 1c8371fb9b5..bdb19d05c01 100644
--- a/src/cursor/cur_log.c
+++ b/src/cursor/cur_log.c
@@ -321,6 +321,7 @@ __wt_curlog_open(WT_SESSION_IMPL *session,
__wt_cursor_notsup, /* insert */
__wt_cursor_notsup, /* update */
__wt_cursor_notsup, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curlog_close); /* close */
WT_CURSOR *cursor;
WT_CURSOR_LOG *cl;
diff --git a/src/cursor/cur_metadata.c b/src/cursor/cur_metadata.c
index 5543dccec30..d6c76c48ab9 100644
--- a/src/cursor/cur_metadata.c
+++ b/src/cursor/cur_metadata.c
@@ -416,12 +416,14 @@ __wt_curmetadata_open(WT_SESSION_IMPL *session,
__curmetadata_insert, /* insert */
__curmetadata_update, /* update */
__curmetadata_remove, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curmetadata_close); /* close */
WT_CURSOR *cursor;
WT_CURSOR_METADATA *mdc;
WT_DECL_RET;
+ WT_CONFIG_ITEM cval;
- WT_RET(__wt_calloc(session, 1, sizeof(WT_CURSOR_METADATA), &mdc));
+ WT_RET(__wt_calloc_def(session, 1, &mdc));
cursor = &mdc->iface;
*cursor = iface;
@@ -434,8 +436,13 @@ __wt_curmetadata_open(WT_SESSION_IMPL *session,
WT_ERR(__wt_cursor_init(cursor, uri, owner, cfg, cursorp));
- /* Metadata cursors default to read only. */
- WT_ERR(__wt_cursor_config_readonly(cursor, cfg, 1));
+ /* Metadata cursors default to readonly. */
+ WT_ERR(__wt_config_gets_def(session, cfg, "readonly", 1, &cval));
+ if (cval.val != 0) {
+ cursor->insert = cursor->insert_orig = __wt_cursor_notsup;
+ cursor->update = cursor->update_orig = __wt_cursor_notsup;
+ cursor->remove = cursor->remove_orig = __wt_cursor_notsup;
+ }
if (0) {
err: __wt_free(session, mdc);
diff --git a/src/cursor/cur_stat.c b/src/cursor/cur_stat.c
index b9bc4039619..cc12077024f 100644
--- a/src/cursor/cur_stat.c
+++ b/src/cursor/cur_stat.c
@@ -492,6 +492,7 @@ __wt_curstat_open(WT_SESSION_IMPL *session,
__wt_cursor_notsup, /* insert */
__wt_cursor_notsup, /* update */
__wt_cursor_notsup, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
__curstat_close); /* close */
WT_CONFIG_ITEM cval, sval;
WT_CURSOR *cursor;
diff --git a/src/cursor/cur_std.c b/src/cursor/cur_std.c
index cba83b1d088..6f7168a5cc6 100644
--- a/src/cursor/cur_std.c
+++ b/src/cursor/cur_std.c
@@ -58,28 +58,6 @@ __wt_cursor_set_notsup(WT_CURSOR *cursor)
}
/*
- * __wt_cursor_config_readonly --
- * Parse read only configuration and setup cursor appropriately.
- */
-int
-__wt_cursor_config_readonly(WT_CURSOR *cursor, const char *cfg[], int def)
-{
- WT_CONFIG_ITEM cval;
- WT_SESSION_IMPL *session;
-
- session = (WT_SESSION_IMPL *)cursor->session;
-
- WT_RET(__wt_config_gets_def(session, cfg, "readonly", def, &cval));
- if (cval.val != 0) {
- /* Reset all cursor methods that could modify data. */
- cursor->insert = __wt_cursor_notsup;
- cursor->update = __wt_cursor_notsup;
- cursor->remove = __wt_cursor_notsup;
- }
- return (0);
-}
-
-/*
* __wt_cursor_kv_not_set --
* Standard error message for key/values not set.
*/
@@ -501,29 +479,72 @@ __wt_cursor_close(WT_CURSOR *cursor)
}
/*
- * __cursor_runtime_config --
+ * __wt_cursor_reconfigure --
* Set runtime-configurable settings.
*/
-static int
-__cursor_runtime_config(WT_CURSOR *cursor, const char *cfg[])
+int
+__wt_cursor_reconfigure(WT_CURSOR *cursor, const char *config)
{
WT_CONFIG_ITEM cval;
+ WT_DECL_RET;
WT_SESSION_IMPL *session;
session = (WT_SESSION_IMPL *)cursor->session;
- /*
- * !!!
- * There's no way yet to reconfigure cursor flags at runtime; if, in
- * the future there is a way to do that, similar support needs to be
- * added for data-source cursors, or, this call needs to return an
- * error in the case of a data-source cursor.
+ /* Reconfiguration resets the cursor. */
+ WT_RET(cursor->reset(cursor));
+
+ /*
+ * append
+ * Only relevant to column stores.
*/
- WT_RET(__wt_config_gets_def(session, cfg, "overwrite", 1, &cval));
- if (cval.val)
- F_SET(cursor, WT_CURSTD_OVERWRITE);
- else
- F_CLR(cursor, WT_CURSTD_OVERWRITE);
+ if (WT_CURSOR_RECNO(cursor)) {
+ if ((ret = __wt_config_getones(
+ session, config, "append", &cval)) == 0) {
+ if (cval.val)
+ F_SET(cursor, WT_CURSTD_APPEND);
+ else
+ F_CLR(cursor, WT_CURSTD_APPEND);
+ } else
+ WT_RET_NOTFOUND_OK(ret);
+ }
+
+ /*
+ * overwrite
+ */
+ if ((ret = __wt_config_getones(
+ session, config, "overwrite", &cval)) == 0) {
+ if (cval.val)
+ F_SET(cursor, WT_CURSTD_OVERWRITE);
+ else
+ F_CLR(cursor, WT_CURSTD_OVERWRITE);
+ } else
+ WT_RET_NOTFOUND_OK(ret);
+
+ /*
+ * readonly
+ */
+ if ((ret = __wt_config_getones(
+ session, config, "readonly", &cval)) == 0) {
+ if (cval.val == 0) {
+ /*
+ * Fail if the user is turning readonly off and the
+ * cursor never supported writing in the first place.
+ */
+ if (cursor->insert_orig ==
+ (int (*)(WT_CURSOR *))__wt_cursor_set_notsup)
+ WT_RET_MSG(session, EINVAL,
+ "cursor cannot be used for data update");
+ cursor->insert = cursor->insert_orig;
+ cursor->remove = cursor->remove_orig;
+ cursor->update = cursor->update_orig;
+ } else {
+ cursor->insert = __wt_cursor_notsup;
+ cursor->remove = __wt_cursor_notsup;
+ cursor->update = __wt_cursor_notsup;
+ }
+ } else
+ WT_RET_NOTFOUND_OK(ret);
return (0);
}
@@ -580,15 +601,13 @@ __wt_cursor_init(WT_CURSOR *cursor,
WT_CONFIG_ITEM cval;
WT_CURSOR *cdump;
WT_SESSION_IMPL *session;
+ int readonly;
session = (WT_SESSION_IMPL *)cursor->session;
if (cursor->internal_uri == NULL)
WT_RET(__wt_strdup(session, uri, &cursor->internal_uri));
- /* Set runtime-configurable settings. */
- WT_RET(__cursor_runtime_config(cursor, cfg));
-
/*
* append
* The append flag is only relevant to column stores.
@@ -600,14 +619,22 @@ __wt_cursor_init(WT_CURSOR *cursor,
}
/*
- * checkpoint
- * Checkpoint cursors are read-only.
+ * checkpoint, readonly
+ * Checkpoint cursors are read-only, avoid any extra work.
*/
+ readonly = 0;
WT_RET(__wt_config_gets_def(session, cfg, "checkpoint", 0, &cval));
- if (cval.len != 0) {
- cursor->insert = __wt_cursor_notsup;
- cursor->update = __wt_cursor_notsup;
- cursor->remove = __wt_cursor_notsup;
+ if (cval.len == 0) {
+ WT_RET(
+ __wt_config_gets_def(session, cfg, "readonly", 0, &cval));
+ if (cval.val != 0)
+ readonly = 1;
+ } else
+ readonly = 1;
+ if (readonly) {
+ cursor->insert = cursor->insert_orig = __wt_cursor_notsup;
+ cursor->update = cursor->update_orig = __wt_cursor_notsup;
+ cursor->remove = cursor->remove_orig = __wt_cursor_notsup;
}
/*
@@ -634,14 +661,18 @@ __wt_cursor_init(WT_CURSOR *cursor,
} else
cdump = NULL;
+ /* overwrite */
+ WT_RET(__wt_config_gets_def(session, cfg, "overwrite", 1, &cval));
+ if (cval.val)
+ F_SET(cursor, WT_CURSTD_OVERWRITE);
+ else
+ F_CLR(cursor, WT_CURSTD_OVERWRITE);
+
/* raw */
WT_RET(__wt_config_gets_def(session, cfg, "raw", 0, &cval));
if (cval.val != 0)
F_SET(cursor, WT_CURSTD_RAW);
- /* readonly */
- WT_RET(__wt_cursor_config_readonly(cursor, cfg, 0));
-
/*
* Cursors that are internal to some other cursor (such as file cursors
* inside a table cursor) should be closed after the containing cursor.
diff --git a/src/cursor/cur_table.c b/src/cursor/cur_table.c
index 25479a166b1..50d76609411 100644
--- a/src/cursor/cur_table.c
+++ b/src/cursor/cur_table.c
@@ -76,20 +76,21 @@ __curextract_insert(WT_CURSOR *cursor) {
static int
__apply_idx(WT_CURSOR_TABLE *ctable, size_t func_off, int skip_immutable) {
WT_CURSOR_STATIC_INIT(iface,
- __wt_cursor_get_key, /* get-key */
- __wt_cursor_get_value, /* get-value */
- __wt_cursor_set_key, /* set-key */
- __wt_cursor_set_value, /* set-value */
- __wt_cursor_notsup, /* compare */
- __wt_cursor_notsup, /* next */
- __wt_cursor_notsup, /* prev */
- __wt_cursor_notsup, /* reset */
- __wt_cursor_notsup, /* search */
- __wt_cursor_notsup, /* search-near */
- __curextract_insert, /* insert */
- __wt_cursor_notsup, /* update */
- __wt_cursor_notsup, /* remove */
- __wt_cursor_notsup); /* close */
+ __wt_cursor_get_key, /* get-key */
+ __wt_cursor_get_value, /* get-value */
+ __wt_cursor_set_key, /* set-key */
+ __wt_cursor_set_value, /* set-value */
+ __wt_cursor_notsup, /* compare */
+ __wt_cursor_notsup, /* next */
+ __wt_cursor_notsup, /* prev */
+ __wt_cursor_notsup, /* reset */
+ __wt_cursor_notsup, /* search */
+ __wt_cursor_notsup, /* search-near */
+ __curextract_insert, /* insert */
+ __wt_cursor_notsup, /* update */
+ __wt_cursor_notsup, /* remove */
+ __wt_cursor_notsup, /* reconfigure */
+ __wt_cursor_notsup); /* close */
WT_CURSOR **cp;
WT_CURSOR_EXTRACTOR extract_cursor;
WT_DECL_RET;
@@ -829,20 +830,21 @@ __wt_curtable_open(WT_SESSION_IMPL *session,
const char *uri, const char *cfg[], WT_CURSOR **cursorp)
{
WT_CURSOR_STATIC_INIT(iface,
- __wt_curtable_get_key, /* get-key */
- __wt_curtable_get_value, /* get-value */
- __wt_curtable_set_key, /* set-key */
- __wt_curtable_set_value, /* set-value */
- __curtable_compare, /* compare */
- __curtable_next, /* next */
- __curtable_prev, /* prev */
- __curtable_reset, /* reset */
- __curtable_search, /* search */
- __curtable_search_near, /* search-near */
- __curtable_insert, /* insert */
- __curtable_update, /* update */
- __curtable_remove, /* remove */
- __curtable_close); /* close */
+ __wt_curtable_get_key, /* get-key */
+ __wt_curtable_get_value, /* get-value */
+ __wt_curtable_set_key, /* set-key */
+ __wt_curtable_set_value, /* set-value */
+ __curtable_compare, /* compare */
+ __curtable_next, /* next */
+ __curtable_prev, /* prev */
+ __curtable_reset, /* reset */
+ __curtable_search, /* search */
+ __curtable_search_near, /* search-near */
+ __curtable_insert, /* insert */
+ __curtable_update, /* update */
+ __curtable_remove, /* remove */
+ __wt_cursor_reconfigure, /* reconfigure */
+ __curtable_close); /* close */
WT_CONFIG_ITEM cval;
WT_CURSOR *cursor;
WT_CURSOR_TABLE *ctable;