@ohos-ports/lmdb 2.5.3 → 2.8.5-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +72 -28
  3. package/SECURITY.md +12 -12
  4. package/bin/download-prebuilds.js +15 -0
  5. package/binding.gyp +115 -111
  6. package/build/Release/lmdb.node +0 -0
  7. package/caching.js +212 -156
  8. package/dependencies/lmdb/libraries/liblmdb/COPYRIGHT +20 -20
  9. package/dependencies/lmdb/libraries/liblmdb/Doxyfile +1631 -1631
  10. package/dependencies/lmdb/libraries/liblmdb/LICENSE +47 -47
  11. package/dependencies/lmdb/libraries/liblmdb/Makefile +136 -136
  12. package/dependencies/lmdb/libraries/liblmdb/chacha8.c +183 -183
  13. package/dependencies/lmdb/libraries/liblmdb/chacha8.h +14 -14
  14. package/dependencies/lmdb/libraries/liblmdb/crypto.c +121 -121
  15. package/dependencies/lmdb/libraries/liblmdb/intro.doc +192 -192
  16. package/dependencies/lmdb/libraries/liblmdb/lmdb.h +28 -3
  17. package/dependencies/lmdb/libraries/liblmdb/mdb.c +157 -31
  18. package/dependencies/lmdb/libraries/liblmdb/mdb_copy.1 +74 -74
  19. package/dependencies/lmdb/libraries/liblmdb/mdb_copy.c +106 -106
  20. package/dependencies/lmdb/libraries/liblmdb/mdb_drop.1 +53 -53
  21. package/dependencies/lmdb/libraries/liblmdb/mdb_drop.c +154 -154
  22. package/dependencies/lmdb/libraries/liblmdb/mdb_dump.1 +94 -94
  23. package/dependencies/lmdb/libraries/liblmdb/mdb_dump.c +333 -333
  24. package/dependencies/lmdb/libraries/liblmdb/mdb_load.1 +97 -97
  25. package/dependencies/lmdb/libraries/liblmdb/mdb_load.c +530 -530
  26. package/dependencies/lmdb/libraries/liblmdb/mdb_stat.1 +83 -83
  27. package/dependencies/lmdb/libraries/liblmdb/mdb_stat.c +276 -276
  28. package/dependencies/lmdb/libraries/liblmdb/midl-sparse.c +452 -0
  29. package/dependencies/lmdb/libraries/liblmdb/midl.c +452 -452
  30. package/dependencies/lmdb/libraries/liblmdb/midl.h +208 -208
  31. package/dependencies/lmdb/libraries/liblmdb/module.c +101 -101
  32. package/dependencies/lmdb/libraries/liblmdb/module.h +16 -16
  33. package/dependencies/lmdb/libraries/liblmdb/mtest.c +178 -178
  34. package/dependencies/lmdb/libraries/liblmdb/mtest2.c +124 -124
  35. package/dependencies/lmdb/libraries/liblmdb/mtest3.c +133 -133
  36. package/dependencies/lmdb/libraries/liblmdb/mtest4.c +168 -168
  37. package/dependencies/lmdb/libraries/liblmdb/mtest5.c +135 -135
  38. package/dependencies/lmdb/libraries/liblmdb/mtest6.c +141 -141
  39. package/dependencies/lmdb/libraries/liblmdb/mtest_enc.c +190 -190
  40. package/dependencies/lmdb/libraries/liblmdb/mtest_enc2.c +189 -189
  41. package/dependencies/lmdb/libraries/liblmdb/mtest_remap.c +177 -177
  42. package/dependencies/lmdb/libraries/liblmdb/sample-bdb.txt +73 -73
  43. package/dependencies/lmdb/libraries/liblmdb/sample-mdb.txt +62 -62
  44. package/dependencies/lmdb/libraries/liblmdb/tooltag +27 -27
  45. package/dependencies/lmdb-data-v1/libraries/liblmdb/CHANGES +266 -0
  46. package/dependencies/lmdb-data-v1/libraries/liblmdb/COPYRIGHT +20 -20
  47. package/dependencies/lmdb-data-v1/libraries/liblmdb/Doxyfile +1631 -1631
  48. package/dependencies/lmdb-data-v1/libraries/liblmdb/LICENSE +47 -47
  49. package/dependencies/lmdb-data-v1/libraries/liblmdb/intro.doc +192 -192
  50. package/dependencies/lmdb-data-v1/libraries/liblmdb/lmdb.h +1608 -1653
  51. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb.c +10320 -11359
  52. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_copy.1 +55 -61
  53. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_copy.c +82 -84
  54. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_dump.1 +75 -81
  55. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_dump.c +319 -319
  56. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_load.1 +84 -84
  57. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_load.c +496 -492
  58. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_stat.1 +64 -70
  59. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_stat.c +263 -264
  60. package/dependencies/lmdb-data-v1/libraries/liblmdb/midl.c +359 -421
  61. package/dependencies/lmdb-data-v1/libraries/liblmdb/midl.h +186 -200
  62. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest.c +177 -177
  63. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest2.c +124 -124
  64. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest3.c +133 -133
  65. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest4.c +168 -168
  66. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest5.c +135 -135
  67. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest6.c +141 -141
  68. package/dependencies/lmdb-data-v1/libraries/liblmdb/sample-bdb.txt +73 -73
  69. package/dependencies/lmdb-data-v1/libraries/liblmdb/sample-mdb.txt +62 -62
  70. package/dependencies/lmdb-data-v1/libraries/liblmdb/tooltag +22 -27
  71. package/dependencies/lz4/LICENSE +11 -11
  72. package/dependencies/lz4/lib/LICENSE +24 -24
  73. package/dependencies/lz4/lib/Makefile +225 -0
  74. package/dependencies/lz4/lib/README.md +169 -137
  75. package/dependencies/lz4/lib/dll/example/Makefile +63 -0
  76. package/dependencies/lz4/lib/dll/example/README.md +69 -69
  77. package/dependencies/lz4/lib/dll/liblz4.def +62 -62
  78. package/dependencies/lz4/lib/liblz4-dll.rc.in +35 -35
  79. package/dependencies/lz4/lib/liblz4.pc.in +14 -14
  80. package/dependencies/lz4/lib/lz4.c +2722 -2495
  81. package/dependencies/lz4/lib/lz4.h +842 -774
  82. package/dependencies/lz4/lib/lz4file.c +311 -0
  83. package/dependencies/lz4/lib/lz4file.h +93 -0
  84. package/dependencies/lz4/lib/lz4frame.c +2078 -1899
  85. package/dependencies/lz4/lib/lz4frame.h +692 -623
  86. package/dependencies/lz4/lib/lz4frame_static.h +47 -47
  87. package/dependencies/lz4/lib/lz4hc.c +1631 -1615
  88. package/dependencies/lz4/lib/lz4hc.h +413 -413
  89. package/dependencies/lz4/lib/xxhash.c +1030 -1030
  90. package/dependencies/lz4/lib/xxhash.h +328 -328
  91. package/dependencies/v8/v8-fast-api-calls-v16.h +790 -790
  92. package/dependencies/v8/v8-fast-api-calls.h +784 -888
  93. package/dist/index.cjs +1050 -584
  94. package/dist/index.cjs.map +1 -1
  95. package/index.d.cts +420 -0
  96. package/index.d.ts +450 -385
  97. package/index.js +38 -37
  98. package/keys.js +116 -102
  99. package/level.js +26 -26
  100. package/native.js +8 -5
  101. package/node-index.js +21 -17
  102. package/open.js +51 -17
  103. package/package.json +63 -21
  104. package/read.js +338 -95
  105. package/src/compression.cpp +12 -9
  106. package/src/cursor.cpp +82 -31
  107. package/src/dbi.cpp +78 -40
  108. package/src/env.cpp +336 -68
  109. package/src/lmdb-js.cpp +64 -64
  110. package/src/lmdb-js.h +83 -49
  111. package/src/misc.cpp +297 -28
  112. package/src/ordered-binary.cpp +46 -46
  113. package/src/txn.cpp +210 -257
  114. package/src/v8-functions.cpp +170 -166
  115. package/src/windows.c +34 -34
  116. package/src/writer.cpp +169 -84
  117. package/util/RangeIterable.js +112 -17
  118. package/util/set-optional-deps.cjs +14 -10
  119. package/util/when.js +8 -8
  120. package/write.js +145 -121
  121. package/dependencies/lmdb-data-v1/libraries/liblmdb/Makefile +0 -118
  122. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_drop.1 +0 -40
  123. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_drop.c +0 -135
  124. package/rollup.config.js +0 -12
@@ -1,530 +1,530 @@
1
- /* mdb_load.c - memory-mapped database load 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 <stdlib.h>
16
- #include <errno.h>
17
- #include <string.h>
18
- #include <ctype.h>
19
- #include <unistd.h>
20
- #include "lmdb.h"
21
- #include "module.h"
22
-
23
- #define PRINT 1
24
- #define NOHDR 2
25
- static int mode;
26
-
27
- static char *subname = NULL;
28
-
29
- static mdb_size_t lineno;
30
- static int version;
31
-
32
- static int flags;
33
-
34
- static char *prog;
35
-
36
- static int Eof;
37
-
38
- static MDB_envinfo info;
39
-
40
- static MDB_val kbuf, dbuf;
41
- static MDB_val k0buf;
42
-
43
- static unsigned int pagesize;
44
-
45
- #define Yu MDB_PRIy(u)
46
-
47
- #define STRLENOF(s) (sizeof(s)-1)
48
-
49
- typedef struct flagbit {
50
- int bit;
51
- char *name;
52
- int len;
53
- } flagbit;
54
-
55
- #define S(s) s, STRLENOF(s)
56
-
57
- flagbit dbflags[] = {
58
- { MDB_REVERSEKEY, S("reversekey") },
59
- { MDB_DUPSORT, S("dupsort") },
60
- { MDB_INTEGERKEY, S("integerkey") },
61
- { MDB_DUPFIXED, S("dupfixed") },
62
- { MDB_INTEGERDUP, S("integerdup") },
63
- { MDB_REVERSEDUP, S("reversedup") },
64
- { 0, NULL, 0 }
65
- };
66
-
67
- static void readhdr(void)
68
- {
69
- char *ptr;
70
-
71
- flags = 0;
72
- while (fgets(dbuf.mv_data, dbuf.mv_size, stdin) != NULL) {
73
- lineno++;
74
- if (!strncmp(dbuf.mv_data, "VERSION=", STRLENOF("VERSION="))) {
75
- version=atoi((char *)dbuf.mv_data+STRLENOF("VERSION="));
76
- if (version > 3) {
77
- fprintf(stderr, "%s: line %"Yu": unsupported VERSION %d\n",
78
- prog, lineno, version);
79
- exit(EXIT_FAILURE);
80
- }
81
- } else if (!strncmp(dbuf.mv_data, "HEADER=END", STRLENOF("HEADER=END"))) {
82
- break;
83
- } else if (!strncmp(dbuf.mv_data, "format=", STRLENOF("format="))) {
84
- if (!strncmp((char *)dbuf.mv_data+STRLENOF("FORMAT="), "print", STRLENOF("print")))
85
- mode |= PRINT;
86
- else if (strncmp((char *)dbuf.mv_data+STRLENOF("FORMAT="), "bytevalue", STRLENOF("bytevalue"))) {
87
- fprintf(stderr, "%s: line %"Yu": unsupported FORMAT %s\n",
88
- prog, lineno, (char *)dbuf.mv_data+STRLENOF("FORMAT="));
89
- exit(EXIT_FAILURE);
90
- }
91
- } else if (!strncmp(dbuf.mv_data, "database=", STRLENOF("database="))) {
92
- ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
93
- if (ptr) *ptr = '\0';
94
- if (subname) free(subname);
95
- subname = strdup((char *)dbuf.mv_data+STRLENOF("database="));
96
- } else if (!strncmp(dbuf.mv_data, "type=", STRLENOF("type="))) {
97
- if (strncmp((char *)dbuf.mv_data+STRLENOF("type="), "btree", STRLENOF("btree"))) {
98
- fprintf(stderr, "%s: line %"Yu": unsupported type %s\n",
99
- prog, lineno, (char *)dbuf.mv_data+STRLENOF("type="));
100
- exit(EXIT_FAILURE);
101
- }
102
- } else if (!strncmp(dbuf.mv_data, "mapaddr=", STRLENOF("mapaddr="))) {
103
- int i;
104
- ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
105
- if (ptr) *ptr = '\0';
106
- i = sscanf((char *)dbuf.mv_data+STRLENOF("mapaddr="), "%p", &info.me_mapaddr);
107
- if (i != 1) {
108
- fprintf(stderr, "%s: line %"Yu": invalid mapaddr %s\n",
109
- prog, lineno, (char *)dbuf.mv_data+STRLENOF("mapaddr="));
110
- exit(EXIT_FAILURE);
111
- }
112
- } else if (!strncmp(dbuf.mv_data, "mapsize=", STRLENOF("mapsize="))) {
113
- int i;
114
- ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
115
- if (ptr) *ptr = '\0';
116
- i = sscanf((char *)dbuf.mv_data+STRLENOF("mapsize="),
117
- "%" MDB_SCNy(u), &info.me_mapsize);
118
- if (i != 1) {
119
- fprintf(stderr, "%s: line %"Yu": invalid mapsize %s\n",
120
- prog, lineno, (char *)dbuf.mv_data+STRLENOF("mapsize="));
121
- exit(EXIT_FAILURE);
122
- }
123
- } else if (!strncmp(dbuf.mv_data, "maxreaders=", STRLENOF("maxreaders="))) {
124
- int i;
125
- ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
126
- if (ptr) *ptr = '\0';
127
- i = sscanf((char *)dbuf.mv_data+STRLENOF("maxreaders="), "%u", &info.me_maxreaders);
128
- if (i != 1) {
129
- fprintf(stderr, "%s: line %"Yu": invalid maxreaders %s\n",
130
- prog, lineno, (char *)dbuf.mv_data+STRLENOF("maxreaders="));
131
- exit(EXIT_FAILURE);
132
- }
133
- } else if (!strncmp(dbuf.mv_data, "db_pagesize=", STRLENOF("db_pagesize="))) {
134
- int i;
135
- ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
136
- if (ptr) *ptr = '\0';
137
- i = sscanf((char *)dbuf.mv_data+STRLENOF("db_pagesize="),
138
- "%u", &pagesize);
139
- if (i != 1) {
140
- fprintf(stderr, "%s: line %"Yu": invalid pagesize %s\n",
141
- prog, lineno, (char *)dbuf.mv_data+STRLENOF("db_pagesize="));
142
- exit(EXIT_FAILURE);
143
- }
144
- } else {
145
- int i;
146
- for (i=0; dbflags[i].bit; i++) {
147
- if (!strncmp(dbuf.mv_data, dbflags[i].name, dbflags[i].len) &&
148
- ((char *)dbuf.mv_data)[dbflags[i].len] == '=') {
149
- flags |= dbflags[i].bit;
150
- break;
151
- }
152
- }
153
- if (!dbflags[i].bit) {
154
- ptr = memchr(dbuf.mv_data, '=', dbuf.mv_size);
155
- if (!ptr) {
156
- fprintf(stderr, "%s: line %"Yu": unexpected format\n",
157
- prog, lineno);
158
- exit(EXIT_FAILURE);
159
- } else {
160
- *ptr = '\0';
161
- fprintf(stderr, "%s: line %"Yu": unrecognized keyword ignored: %s\n",
162
- prog, lineno, (char *)dbuf.mv_data);
163
- }
164
- }
165
- }
166
- }
167
- }
168
-
169
- static void badend(void)
170
- {
171
- fprintf(stderr, "%s: line %"Yu": unexpected end of input\n",
172
- prog, lineno);
173
- }
174
-
175
- static int unhex(unsigned char *c2)
176
- {
177
- int x, c;
178
- x = *c2++ & 0x4f;
179
- if (x & 0x40)
180
- x -= 55;
181
- c = x << 4;
182
- x = *c2 & 0x4f;
183
- if (x & 0x40)
184
- x -= 55;
185
- c |= x;
186
- return c;
187
- }
188
-
189
- static int readline(MDB_val *out, MDB_val *buf)
190
- {
191
- unsigned char *c1, *c2, *end;
192
- size_t len, l2;
193
- int c;
194
-
195
- if (!(mode & NOHDR)) {
196
- c = fgetc(stdin);
197
- if (c == EOF) {
198
- Eof = 1;
199
- return EOF;
200
- }
201
- if (c != ' ') {
202
- lineno++;
203
- if (fgets(buf->mv_data, buf->mv_size, stdin) == NULL) {
204
- badend:
205
- Eof = 1;
206
- badend();
207
- return EOF;
208
- }
209
- if (c == 'D' && !strncmp(buf->mv_data, "ATA=END", STRLENOF("ATA=END")))
210
- return EOF;
211
- goto badend;
212
- }
213
- }
214
- if (fgets(buf->mv_data, buf->mv_size, stdin) == NULL) {
215
- Eof = 1;
216
- return EOF;
217
- }
218
- lineno++;
219
-
220
- c1 = buf->mv_data;
221
- len = strlen((char *)c1);
222
- l2 = len;
223
-
224
- /* Is buffer too short? */
225
- while (c1[len-1] != '\n') {
226
- buf->mv_data = realloc(buf->mv_data, buf->mv_size*2);
227
- if (!buf->mv_data) {
228
- Eof = 1;
229
- fprintf(stderr, "%s: line %"Yu": out of memory, line too long\n",
230
- prog, lineno);
231
- return EOF;
232
- }
233
- c1 = buf->mv_data;
234
- c1 += l2;
235
- if (fgets((char *)c1, buf->mv_size+1, stdin) == NULL) {
236
- Eof = 1;
237
- badend();
238
- return EOF;
239
- }
240
- buf->mv_size *= 2;
241
- len = strlen((char *)c1);
242
- l2 += len;
243
- }
244
- c1 = c2 = buf->mv_data;
245
- len = l2;
246
- c1[--len] = '\0';
247
- end = c1 + len;
248
-
249
- if (mode & PRINT) {
250
- while (c2 < end) {
251
- if (*c2 == '\\') {
252
- if (c2[1] == '\\') {
253
- *c1++ = *c2;
254
- } else {
255
- if (c2+3 > end || !isxdigit(c2[1]) || !isxdigit(c2[2])) {
256
- Eof = 1;
257
- badend();
258
- return EOF;
259
- }
260
- *c1++ = unhex(++c2);
261
- }
262
- c2 += 2;
263
- } else {
264
- /* copies are redundant when no escapes were used */
265
- *c1++ = *c2++;
266
- }
267
- }
268
- } else {
269
- /* odd length not allowed */
270
- if (len & 1) {
271
- Eof = 1;
272
- badend();
273
- return EOF;
274
- }
275
- while (c2 < end) {
276
- if (!isxdigit(*c2) || !isxdigit(c2[1])) {
277
- Eof = 1;
278
- badend();
279
- return EOF;
280
- }
281
- *c1++ = unhex(c2);
282
- c2 += 2;
283
- }
284
- }
285
- c2 = out->mv_data = buf->mv_data;
286
- out->mv_size = c1 - c2;
287
-
288
- return 0;
289
- }
290
-
291
- static void usage(void)
292
- {
293
- fprintf(stderr, "usage: %s [-V] [-a] [-f input] [-n] [-m module [-w password]] [-s name] [-N] [-T] dbpath\n", prog);
294
- exit(EXIT_FAILURE);
295
- }
296
-
297
- static int greater(const MDB_val *a, const MDB_val *b)
298
- {
299
- return 1;
300
- }
301
-
302
- int main(int argc, char *argv[])
303
- {
304
- int i, rc;
305
- MDB_env *env;
306
- MDB_txn *txn;
307
- MDB_cursor *mc;
308
- MDB_dbi dbi;
309
- char *envname;
310
- int envflags = MDB_NOSYNC, putflags = 0;
311
- int dohdr = 0, append = 0;
312
- MDB_val prevk;
313
- char *module = NULL, *password = NULL, *errmsg;
314
- void *mlm = NULL;
315
-
316
- prog = argv[0];
317
-
318
- if (argc < 2) {
319
- usage();
320
- }
321
-
322
- /* -a: append records in input order
323
- * -f: load file instead of stdin
324
- * -n: use NOSUBDIR flag on env_open
325
- * -s: load into named subDB
326
- * -N: use NOOVERWRITE on puts
327
- * -T: read plaintext
328
- * -V: print version and exit
329
- */
330
- while ((i = getopt(argc, argv, "af:m:ns:w:NTV")) != EOF) {
331
- switch(i) {
332
- case 'V':
333
- printf("%s\n", MDB_VERSION_STRING);
334
- exit(0);
335
- break;
336
- case 'a':
337
- append = 1;
338
- break;
339
- case 'f':
340
- if (freopen(optarg, "r", stdin) == NULL) {
341
- fprintf(stderr, "%s: %s: reopen: %s\n",
342
- prog, optarg, strerror(errno));
343
- exit(EXIT_FAILURE);
344
- }
345
- break;
346
- case 'n':
347
- envflags |= MDB_NOSUBDIR;
348
- break;
349
- case 's':
350
- subname = strdup(optarg);
351
- break;
352
- case 'N':
353
- putflags = MDB_NOOVERWRITE|MDB_NODUPDATA;
354
- break;
355
- case 'T':
356
- mode |= NOHDR | PRINT;
357
- break;
358
- case 'm':
359
- module = optarg;
360
- break;
361
- case 'w':
362
- password = optarg;
363
- break;
364
- default:
365
- usage();
366
- }
367
- }
368
-
369
- if (optind != argc - 1)
370
- usage();
371
-
372
- dbuf.mv_size = 4096;
373
- dbuf.mv_data = malloc(dbuf.mv_size);
374
-
375
- if (!(mode & NOHDR))
376
- readhdr();
377
-
378
- envname = argv[optind];
379
- rc = mdb_env_create(&env);
380
- if (rc) {
381
- fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc));
382
- return EXIT_FAILURE;
383
- }
384
- if (module) {
385
- mlm = mlm_setup(env, module, password, &errmsg);
386
- if (!mlm) {
387
- fprintf(stderr, "Failed to load crypto module: %s\n", errmsg);
388
- goto env_close;
389
- }
390
- }
391
-
392
- mdb_env_set_maxdbs(env, 2);
393
-
394
- if (info.me_maxreaders)
395
- mdb_env_set_maxreaders(env, info.me_maxreaders);
396
-
397
- if (info.me_mapsize)
398
- mdb_env_set_mapsize(env, info.me_mapsize);
399
-
400
- if (pagesize)
401
- mdb_env_set_pagesize(env, pagesize);
402
-
403
- if (info.me_mapaddr)
404
- envflags |= MDB_FIXEDMAP;
405
-
406
- rc = mdb_env_open(env, envname, envflags, 0664);
407
- if (rc) {
408
- fprintf(stderr, "mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
409
- goto env_close;
410
- }
411
-
412
- kbuf.mv_size = mdb_env_get_maxkeysize(env) * 2 + 2;
413
- kbuf.mv_data = malloc(kbuf.mv_size * 2);
414
- k0buf.mv_size = kbuf.mv_size;
415
- k0buf.mv_data = (char *)kbuf.mv_data + kbuf.mv_size;
416
- prevk.mv_data = k0buf.mv_data;
417
-
418
- while(!Eof) {
419
- MDB_val key, data;
420
- int batch = 0;
421
- int appflag;
422
-
423
- if (!dohdr) {
424
- dohdr = 1;
425
- } else if (!(mode & NOHDR))
426
- readhdr();
427
-
428
- rc = mdb_txn_begin(env, NULL, 0, &txn);
429
- if (rc) {
430
- fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
431
- goto env_close;
432
- }
433
-
434
- rc = mdb_dbi_open(txn, subname, flags|MDB_CREATE, &dbi);
435
- if (rc) {
436
- fprintf(stderr, "mdb_dbi_open failed, error %d %s\n", rc, mdb_strerror(rc));
437
- goto txn_abort;
438
- }
439
- prevk.mv_size = 0;
440
- if (append) {
441
- mdb_set_compare(txn, dbi, greater);
442
- if (flags & MDB_DUPSORT)
443
- mdb_set_dupsort(txn, dbi, greater);
444
- }
445
-
446
- rc = mdb_cursor_open(txn, dbi, &mc);
447
- if (rc) {
448
- fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
449
- goto txn_abort;
450
- }
451
-
452
- while(1) {
453
- rc = readline(&key, &kbuf);
454
- if (rc) /* rc == EOF */
455
- break;
456
-
457
- rc = readline(&data, &dbuf);
458
- if (rc) {
459
- fprintf(stderr, "%s: line %"Yu": failed to read key value\n", prog, lineno);
460
- goto txn_abort;
461
- }
462
- if (!key.mv_size) {
463
- fprintf(stderr, "%s: line %"Yu": zero-length key(ignored)\n", prog, lineno);
464
- continue;
465
- }
466
-
467
- if (append) {
468
- appflag = MDB_APPEND;
469
- if (flags & MDB_DUPSORT) {
470
- if (prevk.mv_size == key.mv_size && !memcmp(prevk.mv_data, key.mv_data, key.mv_size))
471
- appflag = MDB_CURRENT|MDB_APPENDDUP;
472
- else {
473
- memcpy(prevk.mv_data, key.mv_data, key.mv_size);
474
- prevk.mv_size = key.mv_size;
475
- }
476
- }
477
- } else {
478
- appflag = 0;
479
- }
480
- rc = mdb_cursor_put(mc, &key, &data, putflags|appflag);
481
- if (rc == MDB_KEYEXIST && putflags)
482
- continue;
483
- if (rc) {
484
- fprintf(stderr, "mdb_cursor_put failed, error %d %s\n", rc, mdb_strerror(rc));
485
- goto txn_abort;
486
- }
487
- batch++;
488
- if (batch == 100) {
489
- rc = mdb_txn_commit(txn);
490
- if (rc) {
491
- fprintf(stderr, "%s: line %"Yu": txn_commit: %s\n",
492
- prog, lineno, mdb_strerror(rc));
493
- goto env_close;
494
- }
495
- rc = mdb_txn_begin(env, NULL, 0, &txn);
496
- if (rc) {
497
- fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
498
- goto env_close;
499
- }
500
- rc = mdb_cursor_open(txn, dbi, &mc);
501
- if (rc) {
502
- fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
503
- goto txn_abort;
504
- }
505
- if (appflag & MDB_APPENDDUP) {
506
- MDB_val k, d;
507
- mdb_cursor_get(mc, &k, &d, MDB_LAST);
508
- }
509
- batch = 0;
510
- }
511
- }
512
- rc = mdb_txn_commit(txn);
513
- txn = NULL;
514
- if (rc) {
515
- fprintf(stderr, "%s: line %"Yu": txn_commit: %s\n",
516
- prog, lineno, mdb_strerror(rc));
517
- goto env_close;
518
- }
519
- mdb_dbi_close(env, dbi);
520
- }
521
-
522
- txn_abort:
523
- mdb_txn_abort(txn);
524
- env_close:
525
- mdb_env_close(env);
526
- if (mlm)
527
- mlm_unload(mlm);
528
-
529
- return rc ? EXIT_FAILURE : EXIT_SUCCESS;
530
- }
1
+ /* mdb_load.c - memory-mapped database load 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 <stdlib.h>
16
+ #include <errno.h>
17
+ #include <string.h>
18
+ #include <ctype.h>
19
+ #include <unistd.h>
20
+ #include "lmdb.h"
21
+ #include "module.h"
22
+
23
+ #define PRINT 1
24
+ #define NOHDR 2
25
+ static int mode;
26
+
27
+ static char *subname = NULL;
28
+
29
+ static mdb_size_t lineno;
30
+ static int version;
31
+
32
+ static int flags;
33
+
34
+ static char *prog;
35
+
36
+ static int Eof;
37
+
38
+ static MDB_envinfo info;
39
+
40
+ static MDB_val kbuf, dbuf;
41
+ static MDB_val k0buf;
42
+
43
+ static unsigned int pagesize;
44
+
45
+ #define Yu MDB_PRIy(u)
46
+
47
+ #define STRLENOF(s) (sizeof(s)-1)
48
+
49
+ typedef struct flagbit {
50
+ int bit;
51
+ char *name;
52
+ int len;
53
+ } flagbit;
54
+
55
+ #define S(s) s, STRLENOF(s)
56
+
57
+ flagbit dbflags[] = {
58
+ { MDB_REVERSEKEY, S("reversekey") },
59
+ { MDB_DUPSORT, S("dupsort") },
60
+ { MDB_INTEGERKEY, S("integerkey") },
61
+ { MDB_DUPFIXED, S("dupfixed") },
62
+ { MDB_INTEGERDUP, S("integerdup") },
63
+ { MDB_REVERSEDUP, S("reversedup") },
64
+ { 0, NULL, 0 }
65
+ };
66
+
67
+ static void readhdr(void)
68
+ {
69
+ char *ptr;
70
+
71
+ flags = 0;
72
+ while (fgets(dbuf.mv_data, dbuf.mv_size, stdin) != NULL) {
73
+ lineno++;
74
+ if (!strncmp(dbuf.mv_data, "VERSION=", STRLENOF("VERSION="))) {
75
+ version=atoi((char *)dbuf.mv_data+STRLENOF("VERSION="));
76
+ if (version > 3) {
77
+ fprintf(stderr, "%s: line %"Yu": unsupported VERSION %d\n",
78
+ prog, lineno, version);
79
+ exit(EXIT_FAILURE);
80
+ }
81
+ } else if (!strncmp(dbuf.mv_data, "HEADER=END", STRLENOF("HEADER=END"))) {
82
+ break;
83
+ } else if (!strncmp(dbuf.mv_data, "format=", STRLENOF("format="))) {
84
+ if (!strncmp((char *)dbuf.mv_data+STRLENOF("FORMAT="), "print", STRLENOF("print")))
85
+ mode |= PRINT;
86
+ else if (strncmp((char *)dbuf.mv_data+STRLENOF("FORMAT="), "bytevalue", STRLENOF("bytevalue"))) {
87
+ fprintf(stderr, "%s: line %"Yu": unsupported FORMAT %s\n",
88
+ prog, lineno, (char *)dbuf.mv_data+STRLENOF("FORMAT="));
89
+ exit(EXIT_FAILURE);
90
+ }
91
+ } else if (!strncmp(dbuf.mv_data, "database=", STRLENOF("database="))) {
92
+ ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
93
+ if (ptr) *ptr = '\0';
94
+ if (subname) free(subname);
95
+ subname = strdup((char *)dbuf.mv_data+STRLENOF("database="));
96
+ } else if (!strncmp(dbuf.mv_data, "type=", STRLENOF("type="))) {
97
+ if (strncmp((char *)dbuf.mv_data+STRLENOF("type="), "btree", STRLENOF("btree"))) {
98
+ fprintf(stderr, "%s: line %"Yu": unsupported type %s\n",
99
+ prog, lineno, (char *)dbuf.mv_data+STRLENOF("type="));
100
+ exit(EXIT_FAILURE);
101
+ }
102
+ } else if (!strncmp(dbuf.mv_data, "mapaddr=", STRLENOF("mapaddr="))) {
103
+ int i;
104
+ ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
105
+ if (ptr) *ptr = '\0';
106
+ i = sscanf((char *)dbuf.mv_data+STRLENOF("mapaddr="), "%p", &info.me_mapaddr);
107
+ if (i != 1) {
108
+ fprintf(stderr, "%s: line %"Yu": invalid mapaddr %s\n",
109
+ prog, lineno, (char *)dbuf.mv_data+STRLENOF("mapaddr="));
110
+ exit(EXIT_FAILURE);
111
+ }
112
+ } else if (!strncmp(dbuf.mv_data, "mapsize=", STRLENOF("mapsize="))) {
113
+ int i;
114
+ ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
115
+ if (ptr) *ptr = '\0';
116
+ i = sscanf((char *)dbuf.mv_data+STRLENOF("mapsize="),
117
+ "%" MDB_SCNy(u), &info.me_mapsize);
118
+ if (i != 1) {
119
+ fprintf(stderr, "%s: line %"Yu": invalid mapsize %s\n",
120
+ prog, lineno, (char *)dbuf.mv_data+STRLENOF("mapsize="));
121
+ exit(EXIT_FAILURE);
122
+ }
123
+ } else if (!strncmp(dbuf.mv_data, "maxreaders=", STRLENOF("maxreaders="))) {
124
+ int i;
125
+ ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
126
+ if (ptr) *ptr = '\0';
127
+ i = sscanf((char *)dbuf.mv_data+STRLENOF("maxreaders="), "%u", &info.me_maxreaders);
128
+ if (i != 1) {
129
+ fprintf(stderr, "%s: line %"Yu": invalid maxreaders %s\n",
130
+ prog, lineno, (char *)dbuf.mv_data+STRLENOF("maxreaders="));
131
+ exit(EXIT_FAILURE);
132
+ }
133
+ } else if (!strncmp(dbuf.mv_data, "db_pagesize=", STRLENOF("db_pagesize="))) {
134
+ int i;
135
+ ptr = memchr(dbuf.mv_data, '\n', dbuf.mv_size);
136
+ if (ptr) *ptr = '\0';
137
+ i = sscanf((char *)dbuf.mv_data+STRLENOF("db_pagesize="),
138
+ "%u", &pagesize);
139
+ if (i != 1) {
140
+ fprintf(stderr, "%s: line %"Yu": invalid pagesize %s\n",
141
+ prog, lineno, (char *)dbuf.mv_data+STRLENOF("db_pagesize="));
142
+ exit(EXIT_FAILURE);
143
+ }
144
+ } else {
145
+ int i;
146
+ for (i=0; dbflags[i].bit; i++) {
147
+ if (!strncmp(dbuf.mv_data, dbflags[i].name, dbflags[i].len) &&
148
+ ((char *)dbuf.mv_data)[dbflags[i].len] == '=') {
149
+ flags |= dbflags[i].bit;
150
+ break;
151
+ }
152
+ }
153
+ if (!dbflags[i].bit) {
154
+ ptr = memchr(dbuf.mv_data, '=', dbuf.mv_size);
155
+ if (!ptr) {
156
+ fprintf(stderr, "%s: line %"Yu": unexpected format\n",
157
+ prog, lineno);
158
+ exit(EXIT_FAILURE);
159
+ } else {
160
+ *ptr = '\0';
161
+ fprintf(stderr, "%s: line %"Yu": unrecognized keyword ignored: %s\n",
162
+ prog, lineno, (char *)dbuf.mv_data);
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+
169
+ static void badend(void)
170
+ {
171
+ fprintf(stderr, "%s: line %"Yu": unexpected end of input\n",
172
+ prog, lineno);
173
+ }
174
+
175
+ static int unhex(unsigned char *c2)
176
+ {
177
+ int x, c;
178
+ x = *c2++ & 0x4f;
179
+ if (x & 0x40)
180
+ x -= 55;
181
+ c = x << 4;
182
+ x = *c2 & 0x4f;
183
+ if (x & 0x40)
184
+ x -= 55;
185
+ c |= x;
186
+ return c;
187
+ }
188
+
189
+ static int readline(MDB_val *out, MDB_val *buf)
190
+ {
191
+ unsigned char *c1, *c2, *end;
192
+ size_t len, l2;
193
+ int c;
194
+
195
+ if (!(mode & NOHDR)) {
196
+ c = fgetc(stdin);
197
+ if (c == EOF) {
198
+ Eof = 1;
199
+ return EOF;
200
+ }
201
+ if (c != ' ') {
202
+ lineno++;
203
+ if (fgets(buf->mv_data, buf->mv_size, stdin) == NULL) {
204
+ badend:
205
+ Eof = 1;
206
+ badend();
207
+ return EOF;
208
+ }
209
+ if (c == 'D' && !strncmp(buf->mv_data, "ATA=END", STRLENOF("ATA=END")))
210
+ return EOF;
211
+ goto badend;
212
+ }
213
+ }
214
+ if (fgets(buf->mv_data, buf->mv_size, stdin) == NULL) {
215
+ Eof = 1;
216
+ return EOF;
217
+ }
218
+ lineno++;
219
+
220
+ c1 = buf->mv_data;
221
+ len = strlen((char *)c1);
222
+ l2 = len;
223
+
224
+ /* Is buffer too short? */
225
+ while (c1[len-1] != '\n') {
226
+ buf->mv_data = realloc(buf->mv_data, buf->mv_size*2);
227
+ if (!buf->mv_data) {
228
+ Eof = 1;
229
+ fprintf(stderr, "%s: line %"Yu": out of memory, line too long\n",
230
+ prog, lineno);
231
+ return EOF;
232
+ }
233
+ c1 = buf->mv_data;
234
+ c1 += l2;
235
+ if (fgets((char *)c1, buf->mv_size+1, stdin) == NULL) {
236
+ Eof = 1;
237
+ badend();
238
+ return EOF;
239
+ }
240
+ buf->mv_size *= 2;
241
+ len = strlen((char *)c1);
242
+ l2 += len;
243
+ }
244
+ c1 = c2 = buf->mv_data;
245
+ len = l2;
246
+ c1[--len] = '\0';
247
+ end = c1 + len;
248
+
249
+ if (mode & PRINT) {
250
+ while (c2 < end) {
251
+ if (*c2 == '\\') {
252
+ if (c2[1] == '\\') {
253
+ *c1++ = *c2;
254
+ } else {
255
+ if (c2+3 > end || !isxdigit(c2[1]) || !isxdigit(c2[2])) {
256
+ Eof = 1;
257
+ badend();
258
+ return EOF;
259
+ }
260
+ *c1++ = unhex(++c2);
261
+ }
262
+ c2 += 2;
263
+ } else {
264
+ /* copies are redundant when no escapes were used */
265
+ *c1++ = *c2++;
266
+ }
267
+ }
268
+ } else {
269
+ /* odd length not allowed */
270
+ if (len & 1) {
271
+ Eof = 1;
272
+ badend();
273
+ return EOF;
274
+ }
275
+ while (c2 < end) {
276
+ if (!isxdigit(*c2) || !isxdigit(c2[1])) {
277
+ Eof = 1;
278
+ badend();
279
+ return EOF;
280
+ }
281
+ *c1++ = unhex(c2);
282
+ c2 += 2;
283
+ }
284
+ }
285
+ c2 = out->mv_data = buf->mv_data;
286
+ out->mv_size = c1 - c2;
287
+
288
+ return 0;
289
+ }
290
+
291
+ static void usage(void)
292
+ {
293
+ fprintf(stderr, "usage: %s [-V] [-a] [-f input] [-n] [-m module [-w password]] [-s name] [-N] [-T] dbpath\n", prog);
294
+ exit(EXIT_FAILURE);
295
+ }
296
+
297
+ static int greater(const MDB_val *a, const MDB_val *b)
298
+ {
299
+ return 1;
300
+ }
301
+
302
+ int main(int argc, char *argv[])
303
+ {
304
+ int i, rc;
305
+ MDB_env *env;
306
+ MDB_txn *txn;
307
+ MDB_cursor *mc;
308
+ MDB_dbi dbi;
309
+ char *envname;
310
+ int envflags = MDB_NOSYNC, putflags = 0;
311
+ int dohdr = 0, append = 0;
312
+ MDB_val prevk;
313
+ char *module = NULL, *password = NULL, *errmsg;
314
+ void *mlm = NULL;
315
+
316
+ prog = argv[0];
317
+
318
+ if (argc < 2) {
319
+ usage();
320
+ }
321
+
322
+ /* -a: append records in input order
323
+ * -f: load file instead of stdin
324
+ * -n: use NOSUBDIR flag on env_open
325
+ * -s: load into named subDB
326
+ * -N: use NOOVERWRITE on puts
327
+ * -T: read plaintext
328
+ * -V: print version and exit
329
+ */
330
+ while ((i = getopt(argc, argv, "af:m:ns:w:NTV")) != EOF) {
331
+ switch(i) {
332
+ case 'V':
333
+ printf("%s\n", MDB_VERSION_STRING);
334
+ exit(0);
335
+ break;
336
+ case 'a':
337
+ append = 1;
338
+ break;
339
+ case 'f':
340
+ if (freopen(optarg, "r", stdin) == NULL) {
341
+ fprintf(stderr, "%s: %s: reopen: %s\n",
342
+ prog, optarg, strerror(errno));
343
+ exit(EXIT_FAILURE);
344
+ }
345
+ break;
346
+ case 'n':
347
+ envflags |= MDB_NOSUBDIR;
348
+ break;
349
+ case 's':
350
+ subname = strdup(optarg);
351
+ break;
352
+ case 'N':
353
+ putflags = MDB_NOOVERWRITE|MDB_NODUPDATA;
354
+ break;
355
+ case 'T':
356
+ mode |= NOHDR | PRINT;
357
+ break;
358
+ case 'm':
359
+ module = optarg;
360
+ break;
361
+ case 'w':
362
+ password = optarg;
363
+ break;
364
+ default:
365
+ usage();
366
+ }
367
+ }
368
+
369
+ if (optind != argc - 1)
370
+ usage();
371
+
372
+ dbuf.mv_size = 4096;
373
+ dbuf.mv_data = malloc(dbuf.mv_size);
374
+
375
+ if (!(mode & NOHDR))
376
+ readhdr();
377
+
378
+ envname = argv[optind];
379
+ rc = mdb_env_create(&env);
380
+ if (rc) {
381
+ fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc));
382
+ return EXIT_FAILURE;
383
+ }
384
+ if (module) {
385
+ mlm = mlm_setup(env, module, password, &errmsg);
386
+ if (!mlm) {
387
+ fprintf(stderr, "Failed to load crypto module: %s\n", errmsg);
388
+ goto env_close;
389
+ }
390
+ }
391
+
392
+ mdb_env_set_maxdbs(env, 2);
393
+
394
+ if (info.me_maxreaders)
395
+ mdb_env_set_maxreaders(env, info.me_maxreaders);
396
+
397
+ if (info.me_mapsize)
398
+ mdb_env_set_mapsize(env, info.me_mapsize);
399
+
400
+ if (pagesize)
401
+ mdb_env_set_pagesize(env, pagesize);
402
+
403
+ if (info.me_mapaddr)
404
+ envflags |= MDB_FIXEDMAP;
405
+
406
+ rc = mdb_env_open(env, envname, envflags, 0664);
407
+ if (rc) {
408
+ fprintf(stderr, "mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
409
+ goto env_close;
410
+ }
411
+
412
+ kbuf.mv_size = mdb_env_get_maxkeysize(env) * 2 + 2;
413
+ kbuf.mv_data = malloc(kbuf.mv_size * 2);
414
+ k0buf.mv_size = kbuf.mv_size;
415
+ k0buf.mv_data = (char *)kbuf.mv_data + kbuf.mv_size;
416
+ prevk.mv_data = k0buf.mv_data;
417
+
418
+ while(!Eof) {
419
+ MDB_val key, data;
420
+ int batch = 0;
421
+ int appflag;
422
+
423
+ if (!dohdr) {
424
+ dohdr = 1;
425
+ } else if (!(mode & NOHDR))
426
+ readhdr();
427
+
428
+ rc = mdb_txn_begin(env, NULL, 0, &txn);
429
+ if (rc) {
430
+ fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
431
+ goto env_close;
432
+ }
433
+
434
+ rc = mdb_dbi_open(txn, subname, flags|MDB_CREATE, &dbi);
435
+ if (rc) {
436
+ fprintf(stderr, "mdb_dbi_open failed, error %d %s\n", rc, mdb_strerror(rc));
437
+ goto txn_abort;
438
+ }
439
+ prevk.mv_size = 0;
440
+ if (append) {
441
+ mdb_set_compare(txn, dbi, greater);
442
+ if (flags & MDB_DUPSORT)
443
+ mdb_set_dupsort(txn, dbi, greater);
444
+ }
445
+
446
+ rc = mdb_cursor_open(txn, dbi, &mc);
447
+ if (rc) {
448
+ fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
449
+ goto txn_abort;
450
+ }
451
+
452
+ while(1) {
453
+ rc = readline(&key, &kbuf);
454
+ if (rc) /* rc == EOF */
455
+ break;
456
+
457
+ rc = readline(&data, &dbuf);
458
+ if (rc) {
459
+ fprintf(stderr, "%s: line %"Yu": failed to read key value\n", prog, lineno);
460
+ goto txn_abort;
461
+ }
462
+ if (!key.mv_size) {
463
+ fprintf(stderr, "%s: line %"Yu": zero-length key(ignored)\n", prog, lineno);
464
+ continue;
465
+ }
466
+
467
+ if (append) {
468
+ appflag = MDB_APPEND;
469
+ if (flags & MDB_DUPSORT) {
470
+ if (prevk.mv_size == key.mv_size && !memcmp(prevk.mv_data, key.mv_data, key.mv_size))
471
+ appflag = MDB_CURRENT|MDB_APPENDDUP;
472
+ else {
473
+ memcpy(prevk.mv_data, key.mv_data, key.mv_size);
474
+ prevk.mv_size = key.mv_size;
475
+ }
476
+ }
477
+ } else {
478
+ appflag = 0;
479
+ }
480
+ rc = mdb_cursor_put(mc, &key, &data, putflags|appflag);
481
+ if (rc == MDB_KEYEXIST && putflags)
482
+ continue;
483
+ if (rc) {
484
+ fprintf(stderr, "mdb_cursor_put failed, error %d %s\n", rc, mdb_strerror(rc));
485
+ goto txn_abort;
486
+ }
487
+ batch++;
488
+ if (batch == 100) {
489
+ rc = mdb_txn_commit(txn);
490
+ if (rc) {
491
+ fprintf(stderr, "%s: line %"Yu": txn_commit: %s\n",
492
+ prog, lineno, mdb_strerror(rc));
493
+ goto env_close;
494
+ }
495
+ rc = mdb_txn_begin(env, NULL, 0, &txn);
496
+ if (rc) {
497
+ fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
498
+ goto env_close;
499
+ }
500
+ rc = mdb_cursor_open(txn, dbi, &mc);
501
+ if (rc) {
502
+ fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
503
+ goto txn_abort;
504
+ }
505
+ if (appflag & MDB_APPENDDUP) {
506
+ MDB_val k, d;
507
+ mdb_cursor_get(mc, &k, &d, MDB_LAST);
508
+ }
509
+ batch = 0;
510
+ }
511
+ }
512
+ rc = mdb_txn_commit(txn);
513
+ txn = NULL;
514
+ if (rc) {
515
+ fprintf(stderr, "%s: line %"Yu": txn_commit: %s\n",
516
+ prog, lineno, mdb_strerror(rc));
517
+ goto env_close;
518
+ }
519
+ mdb_dbi_close(env, dbi);
520
+ }
521
+
522
+ txn_abort:
523
+ mdb_txn_abort(txn);
524
+ env_close:
525
+ mdb_env_close(env);
526
+ if (mlm)
527
+ mlm_unload(mlm);
528
+
529
+ return rc ? EXIT_FAILURE : EXIT_SUCCESS;
530
+ }