/* mdb_load.c - memory-mapped database load tool */
/*
- * Copyright 2011-2014 Howard Chu, Symas Corp.
+ * Copyright 2011-2016 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#else
#define Z "z"
#endif
+#ifdef MDB_VL32
+#ifdef _WIN32
+#define Y "I64"
+#else
+#define Y "ll"
+#endif
+#else
+#define Y Z
+#endif
#define STRLENOF(s) (sizeof(s)-1)
{ 0, NULL, 0 }
};
-static const char hexc[] = "0123456789abcdef";
-
static void readhdr(void)
{
char *ptr;
int i;
ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
if (ptr) *ptr = '\0';
- i = sscanf((char *)dbuf.mv_data+STRLENOF("mapsize="), "%" Z "u", &info.me_mapsize);
+ i = sscanf((char *)dbuf.mv_data+STRLENOF("mapsize="), "%" Y "u", &info.me_mapsize);
if (i != 1) {
fprintf(stderr, "%s: line %" Z "d: invalid mapsize %s\n",
prog, lineno, (char *)dbuf.mv_data+STRLENOF("mapsize="));
static int readline(MDB_val *out, MDB_val *buf)
{
unsigned char *c1, *c2, *end;
- size_t len;
+ size_t len, l2;
int c;
if (!(mode & NOHDR)) {
c1 = buf->mv_data;
len = strlen((char *)c1);
+ l2 = len;
/* Is buffer too short? */
while (c1[len-1] != '\n') {
return EOF;
}
c1 = buf->mv_data;
- c1 += buf->mv_size;
- if (fgets((char *)c1, buf->mv_size, stdin) == NULL) {
+ c1 += l2;
+ if (fgets((char *)c1, buf->mv_size+1, stdin) == NULL) {
Eof = 1;
badend();
return EOF;
}
buf->mv_size *= 2;
len = strlen((char *)c1);
+ l2 += len;
}
c1 = c2 = buf->mv_data;
- len = strlen((char *)c1);
+ len = l2;
c1[--len] = '\0';
end = c1 + len;
static void usage(void)
{
- fprintf(stderr, "usage: %s dbpath [-V] [-f input] [-n] [-s name] [-N] [-T]\n", prog);
+ fprintf(stderr, "usage: %s [-V] [-f input] [-n] [-s name] [-N] [-T] dbpath\n", prog);
exit(EXIT_FAILURE);
}
putflags = MDB_NOOVERWRITE|MDB_NODUPDATA;
break;
case 'T':
- mode |= NOHDR;
+ mode |= NOHDR | PRINT;
break;
default:
usage();
envname = argv[optind];
rc = mdb_env_create(&env);
+ if (rc) {
+ fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc));
+ return EXIT_FAILURE;
+ }
mdb_env_set_maxdbs(env, 2);
while(1) {
rc = readline(&key, &kbuf);
- if (rc == EOF)
+ if (rc) /* rc == EOF */
break;
- if (rc)
- goto txn_abort;
rc = readline(&data, &dbuf);
- if (rc)
+ if (rc) {
+ fprintf(stderr, "%s: line %" Z "d: failed to read key value\n", prog, lineno);
goto txn_abort;
-
+ }
+
rc = mdb_cursor_put(mc, &key, &data, putflags);
if (rc == MDB_KEYEXIST && putflags)
continue;
- if (rc)
+ if (rc) {
+ fprintf(stderr, "mdb_cursor_put failed, error %d %s\n", rc, mdb_strerror(rc));
goto txn_abort;
+ }
batch++;
if (batch == 100) {
rc = mdb_txn_commit(txn);