]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb_load.c
Happy New Year
[openldap] / libraries / liblmdb / mdb_load.c
index e0d95e13c3f6f006888e19b55d4f35a4d0c7eb80..27aee4029000e9b1555c680e23c7f09910378648 100644 (file)
@@ -1,6 +1,6 @@
 /* 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
@@ -43,6 +43,15 @@ static MDB_val kbuf, dbuf;
 #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)
 
@@ -112,7 +121,7 @@ static void readhdr(void)
                        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="));
@@ -176,7 +185,7 @@ static int unhex(unsigned char *c2)
 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)) {
@@ -206,6 +215,7 @@ badend:
 
        c1 = buf->mv_data;
        len = strlen((char *)c1);
+       l2 = len;
 
        /* Is buffer too short? */
        while (c1[len-1] != '\n') {
@@ -217,17 +227,18 @@ badend:
                        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;
 
@@ -274,7 +285,7 @@ badend:
 
 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);
 }
 
@@ -325,7 +336,7 @@ int main(int argc, char *argv[])
                        putflags = MDB_NOOVERWRITE|MDB_NODUPDATA;
                        break;
                case 'T':
-                       mode |= NOHDR;
+                       mode |= NOHDR | PRINT;
                        break;
                default:
                        usage();
@@ -398,20 +409,22 @@ int main(int argc, char *argv[])
 
                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);