summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/test/csuite/scope/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/test/csuite/scope/main.c')
-rw-r--r--src/third_party/wiredtiger/test/csuite/scope/main.c538
1 files changed, 262 insertions, 276 deletions
diff --git a/src/third_party/wiredtiger/test/csuite/scope/main.c b/src/third_party/wiredtiger/test/csuite/scope/main.c
index b65c9df8790..dc7b312e5c8 100644
--- a/src/third_party/wiredtiger/test/csuite/scope/main.c
+++ b/src/third_party/wiredtiger/test/csuite/scope/main.c
@@ -27,322 +27,308 @@
*/
#include "test_util.h"
-#define KEY "key"
-#define VALUE "value,value,value"
+#define KEY "key"
+#define VALUE "value,value,value"
static int ignore_errors;
static int
-handle_error(WT_EVENT_HANDLER *handler,
- WT_SESSION *session, int error, const char *message)
+handle_error(WT_EVENT_HANDLER *handler, WT_SESSION *session, int error, const char *message)
{
- (void)(handler);
+ (void)(handler);
- /* Skip the error messages we're expecting to see. */
- if (ignore_errors > 0 &&
- (strstr(message, "requires key be set") != NULL ||
- strstr(message, "requires value be set") != NULL)) {
- --ignore_errors;
- return (0);
- }
+ /* Skip the error messages we're expecting to see. */
+ if (ignore_errors > 0 && (strstr(message, "requires key be set") != NULL ||
+ strstr(message, "requires value be set") != NULL)) {
+ --ignore_errors;
+ return (0);
+ }
- (void)fprintf(stderr, "%s: %s\n",
- message, session->strerror(session, error));
- return (0);
+ (void)fprintf(stderr, "%s: %s\n", message, session->strerror(session, error));
+ return (0);
}
-static WT_EVENT_HANDLER event_handler = {
- handle_error,
- NULL,
- NULL,
- NULL
-};
+static WT_EVENT_HANDLER event_handler = {handle_error, NULL, NULL, NULL};
static void
cursor_scope_ops(WT_SESSION *session, const char *uri)
{
- struct {
- const char *op;
- enum { INSERT, MODIFY, SEARCH, SEARCH_NEAR,
- REMOVE, REMOVE_POS, RESERVE, UPDATE } func;
- const char *config;
- } *op, ops[] = {
- /*
- * The ops order is specific: insert has to happen first so
- * other operations are possible, and remove has to be last.
- */
- { "insert", INSERT, NULL, },
- { "search", SEARCH, NULL, },
- { "search", SEARCH_NEAR, NULL, },
- { "reserve", RESERVE, NULL, },
- { "insert", MODIFY, NULL, },
- { "update", UPDATE, NULL, },
- { "remove", REMOVE, NULL, },
- { "remove", REMOVE_POS, NULL, },
- { NULL, INSERT, NULL }
- };
- WT_CURSOR *cursor;
-#define MODIFY_ENTRIES 2
- WT_MODIFY entries[MODIFY_ENTRIES];
- WT_ITEM vu;
- uint64_t keyr;
- const char *key, *vs;
- char keybuf[100], valuebuf[100];
- int exact;
- bool recno, vstring;
+ struct {
+ const char *op;
+ enum { INSERT, MODIFY, SEARCH, SEARCH_NEAR, REMOVE, REMOVE_POS, RESERVE, UPDATE } func;
+ const char *config;
+ } * op, ops[] = {/*
+ * The ops order is specific: insert has to happen first so
+ * other operations are possible, and remove has to be last.
+ */
+ {
+ "insert", INSERT, NULL,
+ },
+ {
+ "search", SEARCH, NULL,
+ },
+ {
+ "search", SEARCH_NEAR, NULL,
+ },
+ {
+ "reserve", RESERVE, NULL,
+ },
+ {
+ "insert", MODIFY, NULL,
+ },
+ {
+ "update", UPDATE, NULL,
+ },
+ {
+ "remove", REMOVE, NULL,
+ },
+ {
+ "remove", REMOVE_POS, NULL,
+ },
+ {NULL, INSERT, NULL}};
+ WT_CURSOR *cursor;
+#define MODIFY_ENTRIES 2
+ WT_MODIFY entries[MODIFY_ENTRIES];
+ WT_ITEM vu;
+ uint64_t keyr;
+ const char *key, *vs;
+ char keybuf[100], valuebuf[100];
+ int exact;
+ bool recno, vstring;
- /* Reserve requires a running transaction. */
- testutil_check(session->begin_transaction(session, NULL));
+ /*
+ * Modify and reserve require a transaction, modify requires snapshot isolation.
+ */
+ testutil_check(session->begin_transaction(session, "isolation=snapshot"));
- cursor = NULL;
- for (op = ops; op->op != NULL; op++) {
- key = vs = NULL;
- memset(&vu, 0, sizeof(vu));
+ cursor = NULL;
+ for (op = ops; op->op != NULL; op++) {
+ key = vs = NULL;
+ memset(&vu, 0, sizeof(vu));
- /* Open a cursor. */
- if (cursor != NULL)
- testutil_check(cursor->close(cursor));
- testutil_check(session->open_cursor(
- session, uri, NULL, op->config, &cursor));
+ /* Open a cursor. */
+ if (cursor != NULL)
+ testutil_check(cursor->close(cursor));
+ testutil_check(session->open_cursor(session, uri, NULL, op->config, &cursor));
- /* Operations change based on the key/value formats. */
- recno = strcmp(cursor->key_format, "r") == 0;
- vstring = strcmp(cursor->value_format, "S") == 0;
+ /* Operations change based on the key/value formats. */
+ recno = strcmp(cursor->key_format, "r") == 0;
+ vstring = strcmp(cursor->value_format, "S") == 0;
- /* Modify is only possible with "item" values. */
- if (vstring && op->func == MODIFY)
- continue;
+ /* Modify is only possible with "item" values. */
+ if (vstring && op->func == MODIFY)
+ continue;
- /*
- * Set up application buffers so we can detect overwrites
- * or failure to copy application information into library
- * memory.
- */
- if (recno)
- cursor->set_key(cursor, (uint64_t)1);
- else {
- strcpy(keybuf, KEY);
- cursor->set_key(cursor, keybuf);
- }
- strcpy(valuebuf, VALUE);
- if (vstring)
- cursor->set_value(cursor, valuebuf);
- else {
- vu.size = strlen(vu.data = valuebuf);
- cursor->set_value(cursor, &vu);
- }
+ /*
+ * Set up application buffers so we can detect overwrites or failure to copy application
+ * information into library memory.
+ */
+ if (recno)
+ cursor->set_key(cursor, (uint64_t)1);
+ else {
+ strcpy(keybuf, KEY);
+ cursor->set_key(cursor, keybuf);
+ }
+ strcpy(valuebuf, VALUE);
+ if (vstring)
+ cursor->set_value(cursor, valuebuf);
+ else {
+ vu.size = strlen(vu.data = valuebuf);
+ cursor->set_value(cursor, &vu);
+ }
- /*
- * The application must keep key and value memory valid until
- * the next operation that positions the cursor, modifies the
- * data, or resets or closes the cursor.
- *
- * Modifying either the key or value buffers is not permitted.
- */
- switch (op->func) {
- case INSERT:
- testutil_check(cursor->insert(cursor));
- break;
- case MODIFY:
- /* Modify, but don't really change anything. */
- entries[0].data.data = &VALUE[0];
- entries[0].data.size = 2;
- entries[0].offset = 0;
- entries[0].size = 2;
- entries[1].data.data = &VALUE[3];
- entries[1].data.size = 5;
- entries[1].offset = 3;
- entries[1].size = 5;
+ /*
+ * The application must keep key and value memory valid until
+ * the next operation that positions the cursor, modifies the
+ * data, or resets or closes the cursor.
+ *
+ * Modifying either the key or value buffers is not permitted.
+ */
+ switch (op->func) {
+ case INSERT:
+ testutil_check(cursor->insert(cursor));
+ break;
+ case MODIFY:
+ /* Modify, but don't really change anything. */
+ entries[0].data.data = &VALUE[0];
+ entries[0].data.size = 2;
+ entries[0].offset = 0;
+ entries[0].size = 2;
+ entries[1].data.data = &VALUE[3];
+ entries[1].data.size = 5;
+ entries[1].offset = 3;
+ entries[1].size = 5;
- testutil_check(
- cursor->modify(cursor, entries, MODIFY_ENTRIES));
- break;
- case SEARCH:
- testutil_check(cursor->search(cursor));
- break;
- case SEARCH_NEAR:
- testutil_check(cursor->search_near(cursor, &exact));
- break;
- case REMOVE_POS:
- /*
- * Remove has two modes, one where the remove is based
- * on a cursor position, the other where it's based on
- * a set key. The results are different, so test them
- * separately.
- */
- testutil_check(cursor->search(cursor));
- /* FALLTHROUGH */
- case REMOVE:
- testutil_check(cursor->remove(cursor));
- break;
- case RESERVE:
- testutil_check(cursor->reserve(cursor));
- break;
- case UPDATE:
- testutil_check(cursor->update(cursor));
- break;
- }
+ testutil_check(cursor->modify(cursor, entries, MODIFY_ENTRIES));
+ break;
+ case SEARCH:
+ testutil_check(cursor->search(cursor));
+ break;
+ case SEARCH_NEAR:
+ testutil_check(cursor->search_near(cursor, &exact));
+ break;
+ case REMOVE_POS:
+ /*
+ * Remove has two modes, one where the remove is based on a cursor position, the other
+ * where it's based on a set key. The results are different, so test them separately.
+ */
+ testutil_check(cursor->search(cursor));
+ /* FALLTHROUGH */
+ case REMOVE:
+ testutil_check(cursor->remove(cursor));
+ break;
+ case RESERVE:
+ testutil_check(cursor->reserve(cursor));
+ break;
+ case UPDATE:
+ testutil_check(cursor->update(cursor));
+ break;
+ }
- /*
- * The cursor should no longer reference application memory,
- * and application buffers can be safely overwritten.
- */
- memset(keybuf, 'K', sizeof(keybuf));
- memset(valuebuf, 'V', sizeof(valuebuf));
+ /*
+ * The cursor should no longer reference application memory, and application buffers can be
+ * safely overwritten.
+ */
+ memset(keybuf, 'K', sizeof(keybuf));
+ memset(valuebuf, 'V', sizeof(valuebuf));
- /*
- * Check that get_key/get_value behave as expected after the
- * operation.
- */
- switch (op->func) {
- case INSERT:
- case REMOVE:
- /*
- * Insert and remove configured with a search key do
- * not position the cursor and have no key or value.
- *
- * There should be two error messages, ignore them.
- */
- ignore_errors = 2;
- if (recno)
- testutil_assert(
- cursor->get_key(cursor, &keyr) != 0);
- else
- testutil_assert(
- cursor->get_key(cursor, &key) != 0);
- if (vstring)
- testutil_assert(
- cursor->get_value(cursor, &vs) != 0);
- else
- testutil_assert(
- cursor->get_value(cursor, &vu) != 0);
- testutil_assert(ignore_errors == 0);
- break;
- case REMOVE_POS:
- /*
- * Remove configured with a cursor position has a key,
- * but no value.
- *
- * There should be one error message, ignore it.
- */
- if (recno) {
- testutil_assert(
- cursor->get_key(cursor, &keyr) == 0);
- testutil_assert(keyr == 1);
- } else {
- testutil_assert(
- cursor->get_key(cursor, &key) == 0);
- testutil_assert(key != keybuf);
- testutil_assert(strcmp(key, KEY) == 0);
- }
- ignore_errors = 1;
- if (vstring)
- testutil_assert(
- cursor->get_value(cursor, &vs) != 0);
- else
- testutil_assert(
- cursor->get_value(cursor, &vu) != 0);
- testutil_assert(ignore_errors == 0);
- break;
- case MODIFY:
- case RESERVE:
- case SEARCH:
- case SEARCH_NEAR:
- case UPDATE:
- /*
- * Modify, reserve, search, search-near and update all
- * position the cursor and have both a key and value.
- *
- * Any key/value should not reference application
- * memory.
- */
- if (recno) {
- testutil_assert(
- cursor->get_key(cursor, &keyr) == 0);
- testutil_assert(keyr == 1);
- } else {
- testutil_assert(
- cursor->get_key(cursor, &key) == 0);
- testutil_assert(key != keybuf);
- testutil_assert(strcmp(key, KEY) == 0);
- }
- if (vstring) {
- testutil_assert(
- cursor->get_value(cursor, &vs) == 0);
- testutil_assert(vs != valuebuf);
- testutil_assert(strcmp(vs, VALUE) == 0);
- } else {
- testutil_assert(
- cursor->get_value(cursor, &vu) == 0);
- testutil_assert(vu.data != valuebuf);
- testutil_assert(vu.size == strlen(VALUE));
- testutil_assert(
- memcmp(vu.data, VALUE, strlen(VALUE)) == 0);
- }
- break;
- }
+ /*
+ * Check that get_key/get_value behave as expected after the operation.
+ */
+ switch (op->func) {
+ case INSERT:
+ case REMOVE:
+ /*
+ * Insert and remove configured with a search key do
+ * not position the cursor and have no key or value.
+ *
+ * There should be two error messages, ignore them.
+ */
+ ignore_errors = 2;
+ if (recno)
+ testutil_assert(cursor->get_key(cursor, &keyr) != 0);
+ else
+ testutil_assert(cursor->get_key(cursor, &key) != 0);
+ if (vstring)
+ testutil_assert(cursor->get_value(cursor, &vs) != 0);
+ else
+ testutil_assert(cursor->get_value(cursor, &vu) != 0);
+ testutil_assert(ignore_errors == 0);
+ break;
+ case REMOVE_POS:
+ /*
+ * Remove configured with a cursor position has a key,
+ * but no value.
+ *
+ * There should be one error message, ignore it.
+ */
+ if (recno) {
+ testutil_assert(cursor->get_key(cursor, &keyr) == 0);
+ testutil_assert(keyr == 1);
+ } else {
+ testutil_assert(cursor->get_key(cursor, &key) == 0);
+ testutil_assert(key != keybuf);
+ testutil_assert(strcmp(key, KEY) == 0);
+ }
+ ignore_errors = 1;
+ if (vstring)
+ testutil_assert(cursor->get_value(cursor, &vs) != 0);
+ else
+ testutil_assert(cursor->get_value(cursor, &vu) != 0);
+ testutil_assert(ignore_errors == 0);
+ break;
+ case MODIFY:
+ case RESERVE:
+ case SEARCH:
+ case SEARCH_NEAR:
+ case UPDATE:
+ /*
+ * Modify, reserve, search, search-near and update all
+ * position the cursor and have both a key and value.
+ *
+ * Any key/value should not reference application
+ * memory.
+ */
+ if (recno) {
+ testutil_assert(cursor->get_key(cursor, &keyr) == 0);
+ testutil_assert(keyr == 1);
+ } else {
+ testutil_assert(cursor->get_key(cursor, &key) == 0);
+ testutil_assert(key != keybuf);
+ testutil_assert(strcmp(key, KEY) == 0);
+ }
+ if (vstring) {
+ testutil_assert(cursor->get_value(cursor, &vs) == 0);
+ testutil_assert(vs != valuebuf);
+ testutil_assert(strcmp(vs, VALUE) == 0);
+ } else {
+ testutil_assert(cursor->get_value(cursor, &vu) == 0);
+ testutil_assert(vu.data != valuebuf);
+ testutil_assert(vu.size == strlen(VALUE));
+ testutil_assert(memcmp(vu.data, VALUE, strlen(VALUE)) == 0);
+ }
+ break;
+ }
- /*
- * We have more than one remove operation, add the key back
- * in.
- */
- if (op->func == REMOVE || op->func == REMOVE_POS) {
- if (recno)
- cursor->set_key(cursor, (uint64_t)1);
- else {
- strcpy(keybuf, KEY);
- cursor->set_key(cursor, keybuf);
- }
- strcpy(valuebuf, VALUE);
- if (vstring)
- cursor->set_value(cursor, valuebuf);
- else {
- vu.size = strlen(vu.data = valuebuf);
- cursor->set_value(cursor, &vu);
- }
- testutil_check(cursor->insert(cursor));
- }
- }
+ /*
+ * We have more than one remove operation, add the key back in.
+ */
+ if (op->func == REMOVE || op->func == REMOVE_POS) {
+ if (recno)
+ cursor->set_key(cursor, (uint64_t)1);
+ else {
+ strcpy(keybuf, KEY);
+ cursor->set_key(cursor, keybuf);
+ }
+ strcpy(valuebuf, VALUE);
+ if (vstring)
+ cursor->set_value(cursor, valuebuf);
+ else {
+ vu.size = strlen(vu.data = valuebuf);
+ cursor->set_value(cursor, &vu);
+ }
+ testutil_check(cursor->insert(cursor));
+ }
+ }
}
static void
run(WT_CONNECTION *conn, const char *uri, const char *config)
{
- WT_SESSION *session;
+ WT_SESSION *session;
- testutil_check(conn->open_session(conn, NULL, NULL, &session));
- testutil_check(session->create(session, uri, config));
- cursor_scope_ops(session, uri);
- testutil_check(session->close(session, NULL));
+ testutil_check(conn->open_session(conn, NULL, NULL, &session));
+ testutil_check(session->create(session, uri, config));
+ cursor_scope_ops(session, uri);
+ testutil_check(session->close(session, NULL));
}
int
main(int argc, char *argv[])
{
- TEST_OPTS *opts, _opts;
+ TEST_OPTS *opts, _opts;
- opts = &_opts;
- memset(opts, 0, sizeof(*opts));
- testutil_check(testutil_parse_opts(argc, argv, opts));
- testutil_make_work_dir(opts->home);
+ opts = &_opts;
+ memset(opts, 0, sizeof(*opts));
+ testutil_check(testutil_parse_opts(argc, argv, opts));
+ testutil_make_work_dir(opts->home);
- testutil_check(
- wiredtiger_open(opts->home, &event_handler, "create", &opts->conn));
+ testutil_check(wiredtiger_open(opts->home, &event_handler, "create", &opts->conn));
- run(opts->conn, "file:file.SS", "key_format=S,value_format=S");
- run(opts->conn, "file:file.Su", "key_format=S,value_format=u");
- run(opts->conn, "file:file.rS", "key_format=r,value_format=S");
- run(opts->conn, "file:file.ru", "key_format=r,value_format=u");
+ run(opts->conn, "file:file.SS", "key_format=S,value_format=S");
+ run(opts->conn, "file:file.Su", "key_format=S,value_format=u");
+ run(opts->conn, "file:file.rS", "key_format=r,value_format=S");
+ run(opts->conn, "file:file.ru", "key_format=r,value_format=u");
- run(opts->conn, "lsm:lsm.SS", "key_format=S,value_format=S");
- run(opts->conn, "lsm:lsm.Su", "key_format=S,value_format=u");
+ run(opts->conn, "lsm:lsm.SS", "key_format=S,value_format=S");
+ run(opts->conn, "lsm:lsm.Su", "key_format=S,value_format=u");
- run(opts->conn, "table:table.SS", "key_format=S,value_format=S");
- run(opts->conn, "table:table.Su", "key_format=S,value_format=u");
- run(opts->conn, "table:table.rS", "key_format=r,value_format=S");
- run(opts->conn, "table:table.ru", "key_format=r,value_format=u");
+ run(opts->conn, "table:table.SS", "key_format=S,value_format=S");
+ run(opts->conn, "table:table.Su", "key_format=S,value_format=u");
+ run(opts->conn, "table:table.rS", "key_format=r,value_format=S");
+ run(opts->conn, "table:table.ru", "key_format=r,value_format=u");
- testutil_cleanup(opts);
+ testutil_cleanup(opts);
- return (EXIT_SUCCESS);
+ return (EXIT_SUCCESS);
}