diff options
author | Keith Bostic <keith@wiredtiger.com> | 2014-12-11 19:32:50 -0500 |
---|---|---|
committer | Keith Bostic <keith@wiredtiger.com> | 2014-12-11 19:32:50 -0500 |
commit | 4c26d2324bae1d7030b0142d50dbd2ccf11ddeb6 (patch) | |
tree | 2a503b40b20650427eb66039766eb5c9575ce3c7 /src/cursor | |
parent | 9b33b7c46a2672f36b9673d5e4cbc7315bc9ecf4 (diff) | |
download | mongo-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.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_config.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_ds.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_dump.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_file.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_index.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_log.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_metadata.c | 13 | ||||
-rw-r--r-- | src/cursor/cur_stat.c | 1 | ||||
-rw-r--r-- | src/cursor/cur_std.c | 127 | ||||
-rw-r--r-- | src/cursor/cur_table.c | 58 |
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; |