summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/utilities/util_loadtext.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/utilities/util_loadtext.c')
-rw-r--r--src/third_party/wiredtiger/src/utilities/util_loadtext.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/src/utilities/util_loadtext.c b/src/third_party/wiredtiger/src/utilities/util_loadtext.c
new file mode 100644
index 00000000000..27c4c23b50c
--- /dev/null
+++ b/src/third_party/wiredtiger/src/utilities/util_loadtext.c
@@ -0,0 +1,157 @@
+/*-
+ * Copyright (c) 2008-2014 WiredTiger, Inc.
+ * All rights reserved.
+ *
+ * See the file LICENSE for redistribution information.
+ */
+
+#include "util.h"
+
+static int insert(WT_CURSOR *, const char *, int);
+static int text(WT_SESSION *, const char *);
+static int usage(void);
+
+int
+util_loadtext(WT_SESSION *session, int argc, char *argv[])
+{
+ int ch;
+ const char *uri;
+
+ while ((ch = __wt_getopt(progname, argc, argv, "f:")) != EOF)
+ switch (ch) {
+ case 'f': /* input file */
+ if (freopen(__wt_optarg, "r", stdin) == NULL)
+ return (
+ util_err(errno, "%s: reopen", __wt_optarg));
+ break;
+ case '?':
+ default:
+ return (usage());
+ }
+ argc -= __wt_optind;
+ argv += __wt_optind;
+
+ /* The remaining argument is the uri. */
+ if (argc != 1)
+ return (usage());
+ if ((uri = util_name(*argv, "table")) == NULL)
+ return (1);
+
+ return (text(session, uri));
+}
+
+/*
+ * text --
+ * Load flat-text into a file/table.
+ */
+static int
+text(WT_SESSION *session, const char *uri)
+{
+ WT_CURSOR *cursor;
+ WT_DECL_RET;
+ int readkey, tret;
+
+ /*
+ * Open the cursor, configured to append new records (in the case of
+ * column-store objects), or to overwrite existing strings (in the
+ * case of row-store objects). The two flags are mutually exclusive,
+ * but the library doesn't currently care that we set both of them.
+ */
+ if ((ret = session->open_cursor(
+ session, uri, NULL, "append,overwrite", &cursor)) != 0)
+ return (util_err(ret, "%s: session.open", uri));
+
+ /*
+ * We're about to load strings, make sure the formats match.
+ *
+ * Row-store tables have key/value pairs, column-store tables only have
+ * values.
+ */
+ if (strcmp(cursor->value_format, "S") != 0 ||
+ (strcmp(cursor->key_format, "S") != 0 &&
+ strcmp(cursor->key_format, "r") != 0))
+ return (util_err(EINVAL,
+ "the loadtext command can only load objects configured "
+ "for record number or string keys, and string values"));
+ readkey = strcmp(cursor->key_format, "r") == 0 ? 0 : 1;
+
+ /* Insert the records */
+ ret = insert(cursor, uri, readkey);
+
+ /*
+ * Technically, we don't have to close the cursor because the session
+ * handle will do it for us, but I'd like to see the flush to disk and
+ * the close succeed, it's better to fail early when loading files.
+ */
+ if ((tret = cursor->close(cursor)) != 0) {
+ tret = util_err(tret, "%s: cursor.close", uri);
+ if (ret == 0)
+ ret = tret;
+ }
+ if (ret == 0)
+ ret = util_flush(session, uri);
+
+ return (ret == 0 ? 0 : 1);
+}
+
+/*
+ * insert --
+ * Read and insert data.
+ */
+static int
+insert(WT_CURSOR *cursor, const char *name, int readkey)
+{
+ ULINE key, value;
+ WT_DECL_RET;
+ uint64_t insert_count;
+ int eof;
+
+ memset(&key, 0, sizeof(key));
+ memset(&value, 0, sizeof(value));
+
+ /* Read key/value pairs and insert them into the file. */
+ for (insert_count = 0;;) {
+ /*
+ * Three modes: in row-store, we always read a key and use it,
+ * in column-store, we might read it (a dump), we might read
+ * and ignore it (a dump with "append" set), or not read it at
+ * all (flat-text load).
+ */
+ if (readkey) {
+ if (util_read_line(&key, 1, &eof))
+ return (1);
+ if (eof == 1)
+ break;
+ cursor->set_key(cursor, key.mem);
+ }
+ if (util_read_line(&value, readkey ? 0 : 1, &eof))
+ return (1);
+ if (eof == 1)
+ break;
+ cursor->set_value(cursor, value.mem);
+
+ if ((ret = cursor->insert(cursor)) != 0)
+ return (util_err(ret, "%s: cursor.insert", name));
+
+ /* Report on progress every 100 inserts. */
+ if (verbose && ++insert_count % 100 == 0) {
+ printf("\r\t%s: %" PRIu64, name, insert_count);
+ fflush(stdout);
+ }
+ }
+
+ if (verbose)
+ printf("\r\t%s: %" PRIu64 "\n", name, insert_count);
+
+ return (0);
+}
+
+static int
+usage(void)
+{
+ (void)fprintf(stderr,
+ "usage: %s %s "
+ "loadtext [-f input-file] uri\n",
+ progname, usage_prefix);
+ return (1);
+}