lmdb 0.6 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/ext/lmdb_ext/extconf.rb +7 -3
  3. data/ext/lmdb_ext/lmdb_ext.c +120 -110
  4. data/lib/lmdb/version.rb +1 -1
  5. data/lmdb.gemspec +4 -4
  6. data/{ext/lmdb_ext → vendor/libraries}/liblmdb/.gitignore +8 -0
  7. data/{ext/lmdb_ext → vendor/libraries}/liblmdb/COPYRIGHT +1 -1
  8. data/vendor/libraries/liblmdb/Doxyfile +1631 -0
  9. data/{ext/lmdb_ext → vendor/libraries}/liblmdb/LICENSE +0 -0
  10. data/vendor/libraries/liblmdb/Makefile +118 -0
  11. data/vendor/libraries/liblmdb/intro.doc +192 -0
  12. data/{ext/lmdb_ext → vendor/libraries}/liblmdb/lmdb.h +161 -61
  13. data/{ext/lmdb_ext → vendor/libraries}/liblmdb/mdb.c +3244 -1302
  14. data/vendor/libraries/liblmdb/mdb_copy.1 +61 -0
  15. data/vendor/libraries/liblmdb/mdb_copy.c +84 -0
  16. data/vendor/libraries/liblmdb/mdb_drop.1 +40 -0
  17. data/vendor/libraries/liblmdb/mdb_drop.c +135 -0
  18. data/vendor/libraries/liblmdb/mdb_dump.1 +81 -0
  19. data/vendor/libraries/liblmdb/mdb_dump.c +319 -0
  20. data/vendor/libraries/liblmdb/mdb_load.1 +84 -0
  21. data/vendor/libraries/liblmdb/mdb_load.c +492 -0
  22. data/vendor/libraries/liblmdb/mdb_stat.1 +70 -0
  23. data/vendor/libraries/liblmdb/mdb_stat.c +264 -0
  24. data/{ext/lmdb_ext → vendor/libraries}/liblmdb/midl.c +66 -5
  25. data/{ext/lmdb_ext → vendor/libraries}/liblmdb/midl.h +19 -5
  26. data/vendor/libraries/liblmdb/mtest.c +177 -0
  27. data/vendor/libraries/liblmdb/mtest2.c +124 -0
  28. data/vendor/libraries/liblmdb/mtest3.c +133 -0
  29. data/vendor/libraries/liblmdb/mtest4.c +168 -0
  30. data/vendor/libraries/liblmdb/mtest5.c +135 -0
  31. data/vendor/libraries/liblmdb/mtest6.c +141 -0
  32. data/vendor/libraries/liblmdb/sample-bdb.txt +73 -0
  33. data/vendor/libraries/liblmdb/sample-mdb.txt +62 -0
  34. data/vendor/libraries/liblmdb/tooltag +27 -0
  35. metadata +34 -14
  36. data/.gitignore +0 -15
  37. data/.travis.yml +0 -14
  38. data/ext/lmdb_ext/liblmdb/CHANGES +0 -112
@@ -0,0 +1,61 @@
1
+ .TH MDB_COPY 1 "2017/07/31" "LMDB 0.9.70"
2
+ .\" Copyright 2012-2021 Howard Chu, Symas Corp. All Rights Reserved.
3
+ .\" Copying restrictions apply. See COPYRIGHT/LICENSE.
4
+ .SH NAME
5
+ mdb_copy \- LMDB environment copy tool
6
+ .SH SYNOPSIS
7
+ .B mdb_copy
8
+ [\c
9
+ .BR \-V ]
10
+ [\c
11
+ .BR \-c ]
12
+ [\c
13
+ .BR \-n ]
14
+ [\c
15
+ .BR \-v ]
16
+ .B srcpath
17
+ [\c
18
+ .BR dstpath ]
19
+ .SH DESCRIPTION
20
+ The
21
+ .B mdb_copy
22
+ utility copies an LMDB environment. The environment can
23
+ be copied regardless of whether it is currently in use.
24
+ No lockfile is created, since it gets recreated at need.
25
+
26
+ If
27
+ .I dstpath
28
+ is specified it must be the path of an empty directory
29
+ for storing the backup. Otherwise, the backup will be
30
+ written to stdout.
31
+
32
+ .SH OPTIONS
33
+ .TP
34
+ .BR \-V
35
+ Write the library version number to the standard output, and exit.
36
+ .TP
37
+ .BR \-c
38
+ Compact while copying. Only current data pages will be copied; freed
39
+ or unused pages will be omitted from the copy. This option will
40
+ slow down the backup process as it is more CPU-intensive.
41
+ Currently it fails if the environment has suffered a page leak.
42
+ .TP
43
+ .BR \-n
44
+ Open LDMB environment(s) which do not use subdirectories.
45
+ .TP
46
+ .BR \-v
47
+ Use the previous environment state instead of the latest state.
48
+ This may be useful if the latest state has been corrupted.
49
+
50
+ .SH DIAGNOSTICS
51
+ Exit status is zero if no errors occur.
52
+ Errors result in a non-zero exit status and
53
+ a diagnostic message being written to standard error.
54
+ .SH CAVEATS
55
+ This utility can trigger significant file size growth if run
56
+ in parallel with write transactions, because pages which they
57
+ free during copying cannot be reused until the copy is done.
58
+ .SH "SEE ALSO"
59
+ .BR mdb_stat (1)
60
+ .SH AUTHOR
61
+ Howard Chu of Symas Corporation <http://www.symas.com>
@@ -0,0 +1,84 @@
1
+ /* mdb_copy.c - memory-mapped database backup tool */
2
+ /*
3
+ * Copyright 2012-2021 Howard Chu, Symas Corp.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted only as authorized by the OpenLDAP
8
+ * Public License.
9
+ *
10
+ * A copy of this license is available in the file LICENSE in the
11
+ * top-level directory of the distribution or, alternatively, at
12
+ * <http://www.OpenLDAP.org/license.html>.
13
+ */
14
+ #ifdef _WIN32
15
+ #include <windows.h>
16
+ #define MDB_STDOUT GetStdHandle(STD_OUTPUT_HANDLE)
17
+ #else
18
+ #define MDB_STDOUT 1
19
+ #endif
20
+ #include <stdio.h>
21
+ #include <stdlib.h>
22
+ #include <signal.h>
23
+ #include "lmdb.h"
24
+
25
+ static void
26
+ sighandle(int sig)
27
+ {
28
+ }
29
+
30
+ int main(int argc,char * argv[])
31
+ {
32
+ int rc;
33
+ MDB_env *env;
34
+ const char *progname = argv[0], *act;
35
+ unsigned flags = MDB_RDONLY;
36
+ unsigned cpflags = 0;
37
+
38
+ for (; argc > 1 && argv[1][0] == '-'; argc--, argv++) {
39
+ if (argv[1][1] == 'n' && argv[1][2] == '\0')
40
+ flags |= MDB_NOSUBDIR;
41
+ else if (argv[1][1] == 'v' && argv[1][2] == '\0')
42
+ flags |= MDB_PREVSNAPSHOT;
43
+ else if (argv[1][1] == 'c' && argv[1][2] == '\0')
44
+ cpflags |= MDB_CP_COMPACT;
45
+ else if (argv[1][1] == 'V' && argv[1][2] == '\0') {
46
+ printf("%s\n", MDB_VERSION_STRING);
47
+ exit(0);
48
+ } else
49
+ argc = 0;
50
+ }
51
+
52
+ if (argc<2 || argc>3) {
53
+ fprintf(stderr, "usage: %s [-V] [-c] [-n] [-v] srcpath [dstpath]\n", progname);
54
+ exit(EXIT_FAILURE);
55
+ }
56
+
57
+ #ifdef SIGPIPE
58
+ signal(SIGPIPE, sighandle);
59
+ #endif
60
+ #ifdef SIGHUP
61
+ signal(SIGHUP, sighandle);
62
+ #endif
63
+ signal(SIGINT, sighandle);
64
+ signal(SIGTERM, sighandle);
65
+
66
+ act = "opening environment";
67
+ rc = mdb_env_create(&env);
68
+ if (rc == MDB_SUCCESS) {
69
+ rc = mdb_env_open(env, argv[1], flags, 0600);
70
+ }
71
+ if (rc == MDB_SUCCESS) {
72
+ act = "copying";
73
+ if (argc == 2)
74
+ rc = mdb_env_copyfd2(env, MDB_STDOUT, cpflags);
75
+ else
76
+ rc = mdb_env_copy2(env, argv[2], cpflags);
77
+ }
78
+ if (rc)
79
+ fprintf(stderr, "%s: %s failed, error %d (%s)\n",
80
+ progname, act, rc, mdb_strerror(rc));
81
+ mdb_env_close(env);
82
+
83
+ return rc ? EXIT_FAILURE : EXIT_SUCCESS;
84
+ }
@@ -0,0 +1,40 @@
1
+ .TH MDB_DROP 1 "2017/11/19" "LMDB 0.9.70"
2
+ .\" Copyright 2014-2021 Howard Chu, Symas Corp. All Rights Reserved.
3
+ .\" Copying restrictions apply. See COPYRIGHT/LICENSE.
4
+ .SH NAME
5
+ mdb_drop \- LMDB database delete tool
6
+ .SH SYNOPSIS
7
+ .B mdb_drop
8
+ [\c
9
+ .BR \-V ]
10
+ [\c
11
+ .BR \-n ]
12
+ [\c
13
+ .BR \-d ]
14
+ [\c
15
+ .BI \-s \ subdb\fR]
16
+ .BR \ envpath
17
+ .SH DESCRIPTION
18
+ The
19
+ .B mdb_drop
20
+ utility empties or deletes a database in the specified
21
+ environment.
22
+ .SH OPTIONS
23
+ .TP
24
+ .BR \-V
25
+ Write the library version number to the standard output, and exit.
26
+ .TP
27
+ .BR \-n
28
+ Operate on an LMDB database which does not use subdirectories.
29
+ .TP
30
+ .BR \-d
31
+ Delete the specified database, don't just empty it.
32
+ .TP
33
+ .BR \-s \ subdb
34
+ Operate on a specific subdatabase. If no database is specified, only the main database is dropped.
35
+ .SH DIAGNOSTICS
36
+ Exit status is zero if no errors occur.
37
+ Errors result in a non-zero exit status and
38
+ a diagnostic message being written to standard error.
39
+ .SH AUTHOR
40
+ Howard Chu of Symas Corporation <http://www.symas.com>
@@ -0,0 +1,135 @@
1
+ /* mdb_drop.c - memory-mapped database delete tool */
2
+ /*
3
+ * Copyright 2016-2021 Howard Chu, Symas Corp.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted only as authorized by the OpenLDAP
8
+ * Public License.
9
+ *
10
+ * A copy of this license is available in the file LICENSE in the
11
+ * top-level directory of the distribution or, alternatively, at
12
+ * <http://www.OpenLDAP.org/license.html>.
13
+ */
14
+ #include <stdio.h>
15
+ #include <errno.h>
16
+ #include <stdlib.h>
17
+ #include <string.h>
18
+ #include <ctype.h>
19
+ #include <unistd.h>
20
+ #include <signal.h>
21
+ #include "lmdb.h"
22
+
23
+ static volatile sig_atomic_t gotsig;
24
+
25
+ static void dumpsig( int sig )
26
+ {
27
+ gotsig=1;
28
+ }
29
+
30
+ static void usage(char *prog)
31
+ {
32
+ fprintf(stderr, "usage: %s [-V] [-n] [-d] [-s subdb] dbpath\n", prog);
33
+ exit(EXIT_FAILURE);
34
+ }
35
+
36
+ int main(int argc, char *argv[])
37
+ {
38
+ int i, rc;
39
+ MDB_env *env;
40
+ MDB_txn *txn;
41
+ MDB_dbi dbi;
42
+ char *prog = argv[0];
43
+ char *envname;
44
+ char *subname = NULL;
45
+ int envflags = 0, delete = 0;
46
+
47
+ if (argc < 2) {
48
+ usage(prog);
49
+ }
50
+
51
+ /* -d: delete the db, don't just empty it
52
+ * -s: drop the named subDB
53
+ * -n: use NOSUBDIR flag on env_open
54
+ * -V: print version and exit
55
+ * (default) empty the main DB
56
+ */
57
+ while ((i = getopt(argc, argv, "dns:V")) != EOF) {
58
+ switch(i) {
59
+ case 'V':
60
+ printf("%s\n", MDB_VERSION_STRING);
61
+ exit(0);
62
+ break;
63
+ case 'd':
64
+ delete = 1;
65
+ break;
66
+ case 'n':
67
+ envflags |= MDB_NOSUBDIR;
68
+ break;
69
+ case 's':
70
+ subname = optarg;
71
+ break;
72
+ default:
73
+ usage(prog);
74
+ }
75
+ }
76
+
77
+ if (optind != argc - 1)
78
+ usage(prog);
79
+
80
+ #ifdef SIGPIPE
81
+ signal(SIGPIPE, dumpsig);
82
+ #endif
83
+ #ifdef SIGHUP
84
+ signal(SIGHUP, dumpsig);
85
+ #endif
86
+ signal(SIGINT, dumpsig);
87
+ signal(SIGTERM, dumpsig);
88
+
89
+ envname = argv[optind];
90
+ rc = mdb_env_create(&env);
91
+ if (rc) {
92
+ fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc));
93
+ return EXIT_FAILURE;
94
+ }
95
+
96
+ mdb_env_set_maxdbs(env, 2);
97
+
98
+ rc = mdb_env_open(env, envname, envflags, 0664);
99
+ if (rc) {
100
+ fprintf(stderr, "mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
101
+ goto env_close;
102
+ }
103
+
104
+ rc = mdb_txn_begin(env, NULL, 0, &txn);
105
+ if (rc) {
106
+ fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
107
+ goto env_close;
108
+ }
109
+
110
+ rc = mdb_open(txn, subname, 0, &dbi);
111
+ if (rc) {
112
+ fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
113
+ goto txn_abort;
114
+ }
115
+
116
+ rc = mdb_drop(txn, dbi, delete);
117
+ if (rc) {
118
+ fprintf(stderr, "mdb_drop failed, error %d %s\n", rc, mdb_strerror(rc));
119
+ goto txn_abort;
120
+ }
121
+ rc = mdb_txn_commit(txn);
122
+ if (rc) {
123
+ fprintf(stderr, "mdb_txn_commit failed, error %d %s\n", rc, mdb_strerror(rc));
124
+ goto txn_abort;
125
+ }
126
+ txn = NULL;
127
+
128
+ txn_abort:
129
+ if (txn)
130
+ mdb_txn_abort(txn);
131
+ env_close:
132
+ mdb_env_close(env);
133
+
134
+ return rc ? EXIT_FAILURE : EXIT_SUCCESS;
135
+ }
@@ -0,0 +1,81 @@
1
+ .TH MDB_DUMP 1 "2017/07/31" "LMDB 0.9.70"
2
+ .\" Copyright 2014-2021 Howard Chu, Symas Corp. All Rights Reserved.
3
+ .\" Copying restrictions apply. See COPYRIGHT/LICENSE.
4
+ .SH NAME
5
+ mdb_dump \- LMDB environment export tool
6
+ .SH SYNOPSIS
7
+ .B mdb_dump
8
+ [\c
9
+ .BR \-V ]
10
+ [\c
11
+ .BI \-f \ file\fR]
12
+ [\c
13
+ .BR \-l ]
14
+ [\c
15
+ .BR \-n ]
16
+ [\c
17
+ .BR \-v ]
18
+ [\c
19
+ .BR \-p ]
20
+ [\c
21
+ .BR \-a \ |
22
+ .BI \-s \ subdb\fR]
23
+ .BR \ envpath
24
+ .SH DESCRIPTION
25
+ The
26
+ .B mdb_dump
27
+ utility reads a database and writes its contents to the
28
+ standard output using a portable flat-text format
29
+ understood by the
30
+ .BR mdb_load (1)
31
+ utility.
32
+ .SH OPTIONS
33
+ .TP
34
+ .BR \-V
35
+ Write the library version number to the standard output, and exit.
36
+ .TP
37
+ .BR \-f \ file
38
+ Write to the specified file instead of to the standard output.
39
+ .TP
40
+ .BR \-l
41
+ List the databases stored in the environment. Just the
42
+ names will be listed, no data will be output.
43
+ .TP
44
+ .BR \-n
45
+ Dump an LMDB database which does not use subdirectories.
46
+ .TP
47
+ .BR \-v
48
+ Use the previous environment state instead of the latest state.
49
+ This may be useful if the latest state has been corrupted.
50
+ .TP
51
+ .BR \-p
52
+ If characters in either the key or data items are printing characters (as
53
+ defined by isprint(3)), output them directly. This option permits users to
54
+ use standard text editors and tools to modify the contents of databases.
55
+
56
+ Note: different systems may have different notions about what characters
57
+ are considered printing characters, and databases dumped in this manner may
58
+ be less portable to external systems.
59
+ .TP
60
+ .BR \-a
61
+ Dump all of the subdatabases in the environment.
62
+ .TP
63
+ .BR \-s \ subdb
64
+ Dump a specific subdatabase. If no database is specified, only the main database is dumped.
65
+ .SH DIAGNOSTICS
66
+ Exit status is zero if no errors occur.
67
+ Errors result in a non-zero exit status and
68
+ a diagnostic message being written to standard error.
69
+
70
+ Dumping and reloading databases that use user-defined comparison functions
71
+ will result in new databases that use the default comparison functions.
72
+ \fBIn this case it is quite likely that the reloaded database will be
73
+ damaged beyond repair permitting neither record storage nor retrieval.\fP
74
+
75
+ The only available workaround is to modify the source for the
76
+ .BR mdb_load (1)
77
+ utility to load the database using the correct comparison functions.
78
+ .SH "SEE ALSO"
79
+ .BR mdb_load (1)
80
+ .SH AUTHOR
81
+ Howard Chu of Symas Corporation <http://www.symas.com>
@@ -0,0 +1,319 @@
1
+ /* mdb_dump.c - memory-mapped database dump tool */
2
+ /*
3
+ * Copyright 2011-2021 Howard Chu, Symas Corp.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted only as authorized by the OpenLDAP
8
+ * Public License.
9
+ *
10
+ * A copy of this license is available in the file LICENSE in the
11
+ * top-level directory of the distribution or, alternatively, at
12
+ * <http://www.OpenLDAP.org/license.html>.
13
+ */
14
+ #include <stdio.h>
15
+ #include <errno.h>
16
+ #include <stdlib.h>
17
+ #include <string.h>
18
+ #include <ctype.h>
19
+ #include <unistd.h>
20
+ #include <signal.h>
21
+ #include "lmdb.h"
22
+
23
+ #define Yu MDB_PRIy(u)
24
+
25
+ #define PRINT 1
26
+ static int mode;
27
+
28
+ typedef struct flagbit {
29
+ int bit;
30
+ char *name;
31
+ } flagbit;
32
+
33
+ flagbit dbflags[] = {
34
+ { MDB_REVERSEKEY, "reversekey" },
35
+ { MDB_DUPSORT, "dupsort" },
36
+ { MDB_INTEGERKEY, "integerkey" },
37
+ { MDB_DUPFIXED, "dupfixed" },
38
+ { MDB_INTEGERDUP, "integerdup" },
39
+ { MDB_REVERSEDUP, "reversedup" },
40
+ { 0, NULL }
41
+ };
42
+
43
+ static volatile sig_atomic_t gotsig;
44
+
45
+ static void dumpsig( int sig )
46
+ {
47
+ gotsig=1;
48
+ }
49
+
50
+ static const char hexc[] = "0123456789abcdef";
51
+
52
+ static void hex(unsigned char c)
53
+ {
54
+ putchar(hexc[c >> 4]);
55
+ putchar(hexc[c & 0xf]);
56
+ }
57
+
58
+ static void text(MDB_val *v)
59
+ {
60
+ unsigned char *c, *end;
61
+
62
+ putchar(' ');
63
+ c = v->mv_data;
64
+ end = c + v->mv_size;
65
+ while (c < end) {
66
+ if (isprint(*c)) {
67
+ if (*c == '\\')
68
+ putchar('\\');
69
+ putchar(*c);
70
+ } else {
71
+ putchar('\\');
72
+ hex(*c);
73
+ }
74
+ c++;
75
+ }
76
+ putchar('\n');
77
+ }
78
+
79
+ static void byte(MDB_val *v)
80
+ {
81
+ unsigned char *c, *end;
82
+
83
+ putchar(' ');
84
+ c = v->mv_data;
85
+ end = c + v->mv_size;
86
+ while (c < end) {
87
+ hex(*c++);
88
+ }
89
+ putchar('\n');
90
+ }
91
+
92
+ /* Dump in BDB-compatible format */
93
+ static int dumpit(MDB_txn *txn, MDB_dbi dbi, char *name)
94
+ {
95
+ MDB_cursor *mc;
96
+ MDB_stat ms;
97
+ MDB_val key, data;
98
+ MDB_envinfo info;
99
+ unsigned int flags;
100
+ int rc, i;
101
+
102
+ rc = mdb_dbi_flags(txn, dbi, &flags);
103
+ if (rc) return rc;
104
+
105
+ rc = mdb_stat(txn, dbi, &ms);
106
+ if (rc) return rc;
107
+
108
+ rc = mdb_env_info(mdb_txn_env(txn), &info);
109
+ if (rc) return rc;
110
+
111
+ printf("VERSION=3\n");
112
+ printf("format=%s\n", mode & PRINT ? "print" : "bytevalue");
113
+ if (name)
114
+ printf("database=%s\n", name);
115
+ printf("type=btree\n");
116
+ printf("mapsize=%"Yu"\n", info.me_mapsize);
117
+ if (info.me_mapaddr)
118
+ printf("mapaddr=%p\n", info.me_mapaddr);
119
+ printf("maxreaders=%u\n", info.me_maxreaders);
120
+
121
+ if (flags & MDB_DUPSORT)
122
+ printf("duplicates=1\n");
123
+
124
+ for (i=0; dbflags[i].bit; i++)
125
+ if (flags & dbflags[i].bit)
126
+ printf("%s=1\n", dbflags[i].name);
127
+
128
+ printf("db_pagesize=%d\n", ms.ms_psize);
129
+ printf("HEADER=END\n");
130
+
131
+ rc = mdb_cursor_open(txn, dbi, &mc);
132
+ if (rc) return rc;
133
+
134
+ while ((rc = mdb_cursor_get(mc, &key, &data, MDB_NEXT) == MDB_SUCCESS)) {
135
+ if (gotsig) {
136
+ rc = EINTR;
137
+ break;
138
+ }
139
+ if (mode & PRINT) {
140
+ text(&key);
141
+ text(&data);
142
+ } else {
143
+ byte(&key);
144
+ byte(&data);
145
+ }
146
+ }
147
+ printf("DATA=END\n");
148
+ if (rc == MDB_NOTFOUND)
149
+ rc = MDB_SUCCESS;
150
+
151
+ return rc;
152
+ }
153
+
154
+ static void usage(char *prog)
155
+ {
156
+ fprintf(stderr, "usage: %s [-V] [-f output] [-l] [-n] [-p] [-v] [-a|-s subdb] dbpath\n", prog);
157
+ exit(EXIT_FAILURE);
158
+ }
159
+
160
+ int main(int argc, char *argv[])
161
+ {
162
+ int i, rc;
163
+ MDB_env *env;
164
+ MDB_txn *txn;
165
+ MDB_dbi dbi;
166
+ char *prog = argv[0];
167
+ char *envname;
168
+ char *subname = NULL;
169
+ int alldbs = 0, envflags = 0, list = 0;
170
+
171
+ if (argc < 2) {
172
+ usage(prog);
173
+ }
174
+
175
+ /* -a: dump main DB and all subDBs
176
+ * -s: dump only the named subDB
177
+ * -n: use NOSUBDIR flag on env_open
178
+ * -p: use printable characters
179
+ * -f: write to file instead of stdout
180
+ * -v: use previous snapshot
181
+ * -V: print version and exit
182
+ * (default) dump only the main DB
183
+ */
184
+ while ((i = getopt(argc, argv, "af:lnps:vV")) != EOF) {
185
+ switch(i) {
186
+ case 'V':
187
+ printf("%s\n", MDB_VERSION_STRING);
188
+ exit(0);
189
+ break;
190
+ case 'l':
191
+ list = 1;
192
+ /*FALLTHROUGH*/;
193
+ case 'a':
194
+ if (subname)
195
+ usage(prog);
196
+ alldbs++;
197
+ break;
198
+ case 'f':
199
+ if (freopen(optarg, "w", stdout) == NULL) {
200
+ fprintf(stderr, "%s: %s: reopen: %s\n",
201
+ prog, optarg, strerror(errno));
202
+ exit(EXIT_FAILURE);
203
+ }
204
+ break;
205
+ case 'n':
206
+ envflags |= MDB_NOSUBDIR;
207
+ break;
208
+ case 'v':
209
+ envflags |= MDB_PREVSNAPSHOT;
210
+ break;
211
+ case 'p':
212
+ mode |= PRINT;
213
+ break;
214
+ case 's':
215
+ if (alldbs)
216
+ usage(prog);
217
+ subname = optarg;
218
+ break;
219
+ default:
220
+ usage(prog);
221
+ }
222
+ }
223
+
224
+ if (optind != argc - 1)
225
+ usage(prog);
226
+
227
+ #ifdef SIGPIPE
228
+ signal(SIGPIPE, dumpsig);
229
+ #endif
230
+ #ifdef SIGHUP
231
+ signal(SIGHUP, dumpsig);
232
+ #endif
233
+ signal(SIGINT, dumpsig);
234
+ signal(SIGTERM, dumpsig);
235
+
236
+ envname = argv[optind];
237
+ rc = mdb_env_create(&env);
238
+ if (rc) {
239
+ fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc));
240
+ return EXIT_FAILURE;
241
+ }
242
+
243
+ if (alldbs || subname) {
244
+ mdb_env_set_maxdbs(env, 2);
245
+ }
246
+
247
+ rc = mdb_env_open(env, envname, envflags | MDB_RDONLY, 0664);
248
+ if (rc) {
249
+ fprintf(stderr, "mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
250
+ goto env_close;
251
+ }
252
+
253
+ rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
254
+ if (rc) {
255
+ fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
256
+ goto env_close;
257
+ }
258
+
259
+ rc = mdb_open(txn, subname, 0, &dbi);
260
+ if (rc) {
261
+ fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
262
+ goto txn_abort;
263
+ }
264
+
265
+ if (alldbs) {
266
+ MDB_cursor *cursor;
267
+ MDB_val key;
268
+ int count = 0;
269
+
270
+ rc = mdb_cursor_open(txn, dbi, &cursor);
271
+ if (rc) {
272
+ fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
273
+ goto txn_abort;
274
+ }
275
+ while ((rc = mdb_cursor_get(cursor, &key, NULL, MDB_NEXT_NODUP)) == 0) {
276
+ char *str;
277
+ MDB_dbi db2;
278
+ if (memchr(key.mv_data, '\0', key.mv_size))
279
+ continue;
280
+ count++;
281
+ str = malloc(key.mv_size+1);
282
+ memcpy(str, key.mv_data, key.mv_size);
283
+ str[key.mv_size] = '\0';
284
+ rc = mdb_open(txn, str, 0, &db2);
285
+ if (rc == MDB_SUCCESS) {
286
+ if (list) {
287
+ printf("%s\n", str);
288
+ list++;
289
+ } else {
290
+ rc = dumpit(txn, db2, str);
291
+ if (rc)
292
+ break;
293
+ }
294
+ mdb_close(env, db2);
295
+ }
296
+ free(str);
297
+ if (rc) continue;
298
+ }
299
+ mdb_cursor_close(cursor);
300
+ if (!count) {
301
+ fprintf(stderr, "%s: %s does not contain multiple databases\n", prog, envname);
302
+ rc = MDB_NOTFOUND;
303
+ } else if (rc == MDB_NOTFOUND) {
304
+ rc = MDB_SUCCESS;
305
+ }
306
+ } else {
307
+ rc = dumpit(txn, dbi, subname);
308
+ }
309
+ if (rc && rc != MDB_NOTFOUND)
310
+ fprintf(stderr, "%s: %s: %s\n", prog, envname, mdb_strerror(rc));
311
+
312
+ mdb_close(env, dbi);
313
+ txn_abort:
314
+ mdb_txn_abort(txn);
315
+ env_close:
316
+ mdb_env_close(env);
317
+
318
+ return rc ? EXIT_FAILURE : EXIT_SUCCESS;
319
+ }