mdbxmou 0.1.26
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.
- package/.github/workflows/ci.yml +32 -0
- package/.github/workflows/publish.yml +27 -0
- package/.gitmodules +3 -0
- package/CMakeLists.txt +53 -0
- package/LICENSE +201 -0
- package/README.md +639 -0
- package/build.js +11 -0
- package/deps/libmdbx/.clang-format +3 -0
- package/deps/libmdbx/.cmake-format.yaml +3 -0
- package/deps/libmdbx/.le.ini +40 -0
- package/deps/libmdbx/CMakeLists.txt +1269 -0
- package/deps/libmdbx/COPYRIGHT +159 -0
- package/deps/libmdbx/ChangeLog.md +2786 -0
- package/deps/libmdbx/GNUmakefile +950 -0
- package/deps/libmdbx/LICENSE +177 -0
- package/deps/libmdbx/Makefile +16 -0
- package/deps/libmdbx/NOTICE +39 -0
- package/deps/libmdbx/README.md +863 -0
- package/deps/libmdbx/TODO.md +43 -0
- package/deps/libmdbx/cmake/compiler.cmake +1221 -0
- package/deps/libmdbx/cmake/profile.cmake +58 -0
- package/deps/libmdbx/cmake/utils.cmake +524 -0
- package/deps/libmdbx/conanfile.py +323 -0
- package/deps/libmdbx/docs/Doxyfile.in +2734 -0
- package/deps/libmdbx/docs/_preface.md +47 -0
- package/deps/libmdbx/docs/_restrictions.md +248 -0
- package/deps/libmdbx/docs/_starting.md +245 -0
- package/deps/libmdbx/docs/_toc.md +34 -0
- package/deps/libmdbx/docs/header.html +96 -0
- package/deps/libmdbx/example/CMakeLists.txt +6 -0
- package/deps/libmdbx/example/README.md +1 -0
- package/deps/libmdbx/example/example-mdbx.c +154 -0
- package/deps/libmdbx/example/sample-bdb.txt +77 -0
- package/deps/libmdbx/mdbx.h +6655 -0
- package/deps/libmdbx/mdbx.h++ +6428 -0
- package/deps/libmdbx/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch +173 -0
- package/deps/libmdbx/src/alloy.c +54 -0
- package/deps/libmdbx/src/api-cold.c +543 -0
- package/deps/libmdbx/src/api-copy.c +912 -0
- package/deps/libmdbx/src/api-cursor.c +754 -0
- package/deps/libmdbx/src/api-dbi.c +315 -0
- package/deps/libmdbx/src/api-env.c +1434 -0
- package/deps/libmdbx/src/api-extra.c +165 -0
- package/deps/libmdbx/src/api-key-transform.c +197 -0
- package/deps/libmdbx/src/api-misc.c +286 -0
- package/deps/libmdbx/src/api-opts.c +575 -0
- package/deps/libmdbx/src/api-range-estimate.c +365 -0
- package/deps/libmdbx/src/api-txn-data.c +454 -0
- package/deps/libmdbx/src/api-txn.c +921 -0
- package/deps/libmdbx/src/atomics-ops.h +364 -0
- package/deps/libmdbx/src/atomics-types.h +97 -0
- package/deps/libmdbx/src/audit.c +109 -0
- package/deps/libmdbx/src/bits.md +34 -0
- package/deps/libmdbx/src/chk.c +1796 -0
- package/deps/libmdbx/src/cogs.c +309 -0
- package/deps/libmdbx/src/cogs.h +506 -0
- package/deps/libmdbx/src/coherency.c +170 -0
- package/deps/libmdbx/src/config.h.in +88 -0
- package/deps/libmdbx/src/cursor.c +2396 -0
- package/deps/libmdbx/src/cursor.h +391 -0
- package/deps/libmdbx/src/dbi.c +717 -0
- package/deps/libmdbx/src/dbi.h +142 -0
- package/deps/libmdbx/src/debug_begin.h +36 -0
- package/deps/libmdbx/src/debug_end.h +15 -0
- package/deps/libmdbx/src/dpl.c +486 -0
- package/deps/libmdbx/src/dpl.h +134 -0
- package/deps/libmdbx/src/dxb.c +1335 -0
- package/deps/libmdbx/src/env.c +607 -0
- package/deps/libmdbx/src/essentials.h +125 -0
- package/deps/libmdbx/src/gc-get.c +1345 -0
- package/deps/libmdbx/src/gc-put.c +970 -0
- package/deps/libmdbx/src/gc.h +40 -0
- package/deps/libmdbx/src/global.c +474 -0
- package/deps/libmdbx/src/internals.h +585 -0
- package/deps/libmdbx/src/layout-dxb.h +288 -0
- package/deps/libmdbx/src/layout-lck.h +289 -0
- package/deps/libmdbx/src/lck-posix.c +859 -0
- package/deps/libmdbx/src/lck-windows.c +607 -0
- package/deps/libmdbx/src/lck.c +174 -0
- package/deps/libmdbx/src/lck.h +110 -0
- package/deps/libmdbx/src/logging_and_debug.c +250 -0
- package/deps/libmdbx/src/logging_and_debug.h +159 -0
- package/deps/libmdbx/src/man1/mdbx_chk.1 +106 -0
- package/deps/libmdbx/src/man1/mdbx_copy.1 +95 -0
- package/deps/libmdbx/src/man1/mdbx_drop.1 +48 -0
- package/deps/libmdbx/src/man1/mdbx_dump.1 +101 -0
- package/deps/libmdbx/src/man1/mdbx_load.1 +105 -0
- package/deps/libmdbx/src/man1/mdbx_stat.1 +86 -0
- package/deps/libmdbx/src/mdbx.c++ +1837 -0
- package/deps/libmdbx/src/meta.c +656 -0
- package/deps/libmdbx/src/meta.h +168 -0
- package/deps/libmdbx/src/mvcc-readers.c +414 -0
- package/deps/libmdbx/src/node.c +365 -0
- package/deps/libmdbx/src/node.h +102 -0
- package/deps/libmdbx/src/ntdll.def +1246 -0
- package/deps/libmdbx/src/options.h +534 -0
- package/deps/libmdbx/src/osal.c +3485 -0
- package/deps/libmdbx/src/osal.h +587 -0
- package/deps/libmdbx/src/page-get.c +483 -0
- package/deps/libmdbx/src/page-iov.c +185 -0
- package/deps/libmdbx/src/page-iov.h +34 -0
- package/deps/libmdbx/src/page-ops.c +744 -0
- package/deps/libmdbx/src/page-ops.h +142 -0
- package/deps/libmdbx/src/pnl.c +236 -0
- package/deps/libmdbx/src/pnl.h +146 -0
- package/deps/libmdbx/src/preface.h +990 -0
- package/deps/libmdbx/src/proto.h +105 -0
- package/deps/libmdbx/src/refund.c +212 -0
- package/deps/libmdbx/src/sort.h +484 -0
- package/deps/libmdbx/src/spill.c +431 -0
- package/deps/libmdbx/src/spill.h +74 -0
- package/deps/libmdbx/src/table.c +107 -0
- package/deps/libmdbx/src/tls.c +551 -0
- package/deps/libmdbx/src/tls.h +43 -0
- package/deps/libmdbx/src/tools/chk.c +673 -0
- package/deps/libmdbx/src/tools/copy.c +166 -0
- package/deps/libmdbx/src/tools/drop.c +199 -0
- package/deps/libmdbx/src/tools/dump.c +515 -0
- package/deps/libmdbx/src/tools/load.c +831 -0
- package/deps/libmdbx/src/tools/stat.c +516 -0
- package/deps/libmdbx/src/tools/wingetopt.c +87 -0
- package/deps/libmdbx/src/tools/wingetopt.h +30 -0
- package/deps/libmdbx/src/tree-ops.c +1554 -0
- package/deps/libmdbx/src/tree-search.c +140 -0
- package/deps/libmdbx/src/txl.c +99 -0
- package/deps/libmdbx/src/txl.h +26 -0
- package/deps/libmdbx/src/txn.c +1083 -0
- package/deps/libmdbx/src/unaligned.h +205 -0
- package/deps/libmdbx/src/utils.c +32 -0
- package/deps/libmdbx/src/utils.h +76 -0
- package/deps/libmdbx/src/version.c.in +44 -0
- package/deps/libmdbx/src/walk.c +290 -0
- package/deps/libmdbx/src/walk.h +20 -0
- package/deps/libmdbx/src/windows-import.c +152 -0
- package/deps/libmdbx/src/windows-import.h +128 -0
- package/deps/libmdbx/test/CMakeLists.txt +317 -0
- package/deps/libmdbx/test/append.c++ +237 -0
- package/deps/libmdbx/test/base.h++ +92 -0
- package/deps/libmdbx/test/battery-tmux.sh +64 -0
- package/deps/libmdbx/test/cases.c++ +118 -0
- package/deps/libmdbx/test/chrono.c++ +134 -0
- package/deps/libmdbx/test/chrono.h++ +85 -0
- package/deps/libmdbx/test/config.c++ +643 -0
- package/deps/libmdbx/test/config.h++ +334 -0
- package/deps/libmdbx/test/copy.c++ +62 -0
- package/deps/libmdbx/test/dead.c++ +39 -0
- package/deps/libmdbx/test/dump-load.sh +40 -0
- package/deps/libmdbx/test/extra/crunched_delete.c++ +409 -0
- package/deps/libmdbx/test/extra/cursor_closing.c++ +410 -0
- package/deps/libmdbx/test/extra/dbi.c++ +229 -0
- package/deps/libmdbx/test/extra/doubtless_positioning.c++ +253 -0
- package/deps/libmdbx/test/extra/dupfix_addodd.c +94 -0
- package/deps/libmdbx/test/extra/dupfix_multiple.c++ +311 -0
- package/deps/libmdbx/test/extra/early_close_dbi.c++ +137 -0
- package/deps/libmdbx/test/extra/hex_base64_base58.c++ +118 -0
- package/deps/libmdbx/test/extra/maindb_ordinal.c++ +61 -0
- package/deps/libmdbx/test/extra/open.c++ +96 -0
- package/deps/libmdbx/test/extra/pcrf/README.md +2 -0
- package/deps/libmdbx/test/extra/pcrf/pcrf_test.c +380 -0
- package/deps/libmdbx/test/extra/probe.c++ +10 -0
- package/deps/libmdbx/test/extra/txn.c++ +407 -0
- package/deps/libmdbx/test/extra/upsert_alldups.c +193 -0
- package/deps/libmdbx/test/fork.c++ +263 -0
- package/deps/libmdbx/test/hill.c++ +447 -0
- package/deps/libmdbx/test/jitter.c++ +197 -0
- package/deps/libmdbx/test/keygen.c++ +393 -0
- package/deps/libmdbx/test/keygen.h++ +130 -0
- package/deps/libmdbx/test/log.c++ +358 -0
- package/deps/libmdbx/test/log.h++ +91 -0
- package/deps/libmdbx/test/main.c++ +706 -0
- package/deps/libmdbx/test/nested.c++ +318 -0
- package/deps/libmdbx/test/osal-unix.c++ +647 -0
- package/deps/libmdbx/test/osal-windows.c++ +440 -0
- package/deps/libmdbx/test/osal.h++ +41 -0
- package/deps/libmdbx/test/stochastic.sh +690 -0
- package/deps/libmdbx/test/stub/LICENSE +24 -0
- package/deps/libmdbx/test/stub/README.md +8 -0
- package/deps/libmdbx/test/stub/pthread_barrier.c +104 -0
- package/deps/libmdbx/test/stub/pthread_barrier.h +77 -0
- package/deps/libmdbx/test/test.c++ +1551 -0
- package/deps/libmdbx/test/test.h++ +298 -0
- package/deps/libmdbx/test/tmux.conf +3 -0
- package/deps/libmdbx/test/try.c++ +30 -0
- package/deps/libmdbx/test/ttl.c++ +240 -0
- package/deps/libmdbx/test/utils.c++ +203 -0
- package/deps/libmdbx/test/utils.h++ +326 -0
- package/deps/libmdbx/test/valgrind_suppress.txt +536 -0
- package/lib/mdbx_evn_async.js +211 -0
- package/lib/mdbx_worker.js +195 -0
- package/lib/nativemou.js +6 -0
- package/package.json +38 -0
- package/src/async/envmou_close.cpp +34 -0
- package/src/async/envmou_close.hpp +32 -0
- package/src/async/envmou_copy_to.cpp +29 -0
- package/src/async/envmou_copy_to.hpp +38 -0
- package/src/async/envmou_keys.cpp +201 -0
- package/src/async/envmou_keys.hpp +50 -0
- package/src/async/envmou_open.cpp +38 -0
- package/src/async/envmou_open.hpp +33 -0
- package/src/async/envmou_query.cpp +167 -0
- package/src/async/envmou_query.hpp +53 -0
- package/src/dbimou.cpp +522 -0
- package/src/dbimou.hpp +82 -0
- package/src/env_arg0.hpp +24 -0
- package/src/envmou.cpp +445 -0
- package/src/envmou.hpp +116 -0
- package/src/modulemou.cpp +113 -0
- package/src/querymou.cpp +177 -0
- package/src/querymou.hpp +93 -0
- package/src/txnmou.cpp +254 -0
- package/src/txnmou.hpp +122 -0
- package/src/typemou.hpp +239 -0
- package/src/valuemou.hpp +194 -0
- package/test/async.js +67 -0
- package/test/e3.js +38 -0
- package/test/e4.js +89 -0
- package/test/e5.js +162 -0
- package/test/test-batch-ops.js +243 -0
- package/test/test-cursor-mode.js +84 -0
- package/test/test-multi-mode.js +87 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/// \copyright SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/// \note Please refer to the COPYRIGHT file for explanations license change,
|
|
3
|
+
/// credits and acknowledgments.
|
|
4
|
+
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2025
|
|
5
|
+
///
|
|
6
|
+
/// mdbx_copy.c - memory-mapped database backup tool
|
|
7
|
+
///
|
|
8
|
+
|
|
9
|
+
#ifdef _MSC_VER
|
|
10
|
+
#if _MSC_VER > 1800
|
|
11
|
+
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
|
12
|
+
#endif
|
|
13
|
+
#pragma warning(disable : 4996) /* The POSIX name is deprecated... */
|
|
14
|
+
#endif /* _MSC_VER (warnings) */
|
|
15
|
+
|
|
16
|
+
#define xMDBX_TOOLS /* Avoid using internal eASSERT() */
|
|
17
|
+
#include "essentials.h"
|
|
18
|
+
|
|
19
|
+
#if defined(_WIN32) || defined(_WIN64)
|
|
20
|
+
#include "wingetopt.h"
|
|
21
|
+
|
|
22
|
+
static volatile BOOL user_break;
|
|
23
|
+
static BOOL WINAPI ConsoleBreakHandlerRoutine(DWORD dwCtrlType) {
|
|
24
|
+
(void)dwCtrlType;
|
|
25
|
+
user_break = true;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
#else /* WINDOWS */
|
|
30
|
+
|
|
31
|
+
static volatile sig_atomic_t user_break;
|
|
32
|
+
static void signal_handler(int sig) {
|
|
33
|
+
(void)sig;
|
|
34
|
+
user_break = 1;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#endif /* !WINDOWS */
|
|
38
|
+
|
|
39
|
+
static void usage(const char *prog) {
|
|
40
|
+
fprintf(stderr,
|
|
41
|
+
"usage: %s [-V] [-q] [-c] [-d] [-p] [-u|U] src_path [dest_path]\n"
|
|
42
|
+
" -V\t\tprint version and exit\n"
|
|
43
|
+
" -q\t\tbe quiet\n"
|
|
44
|
+
" -c\t\tenable compactification (skip unused pages)\n"
|
|
45
|
+
" -d\t\tenforce copy to be a dynamic size DB\n"
|
|
46
|
+
" -p\t\tusing transaction parking/ousting during copying MVCC-snapshot\n"
|
|
47
|
+
" \t\tto avoid stopping recycling and overflowing the DB\n"
|
|
48
|
+
" -u\t\twarmup database before copying\n"
|
|
49
|
+
" -U\t\twarmup and try lock database pages in memory before copying\n"
|
|
50
|
+
" src_path\tsource database\n"
|
|
51
|
+
" dest_path\tdestination (stdout if not specified)\n",
|
|
52
|
+
prog);
|
|
53
|
+
exit(EXIT_FAILURE);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static void logger(MDBX_log_level_t level, const char *function, int line, const char *fmt, va_list args) {
|
|
57
|
+
static const char *const prefixes[] = {
|
|
58
|
+
"!!!fatal: ", // 0 fatal
|
|
59
|
+
" ! ", // 1 error
|
|
60
|
+
" ~ ", // 2 warning
|
|
61
|
+
" ", // 3 notice
|
|
62
|
+
" //", // 4 verbose
|
|
63
|
+
};
|
|
64
|
+
if (level < MDBX_LOG_DEBUG) {
|
|
65
|
+
if (function && line)
|
|
66
|
+
fprintf(stderr, "%s", prefixes[level]);
|
|
67
|
+
vfprintf(stderr, fmt, args);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
int main(int argc, char *argv[]) {
|
|
72
|
+
int rc;
|
|
73
|
+
MDBX_env *env = nullptr;
|
|
74
|
+
const char *progname = argv[0], *act;
|
|
75
|
+
unsigned flags = MDBX_RDONLY;
|
|
76
|
+
unsigned cpflags = 0;
|
|
77
|
+
bool quiet = false;
|
|
78
|
+
bool warmup = false;
|
|
79
|
+
MDBX_warmup_flags_t warmup_flags = MDBX_warmup_default;
|
|
80
|
+
|
|
81
|
+
for (; argc > 1 && argv[1][0] == '-'; argc--, argv++) {
|
|
82
|
+
if (argv[1][1] == 'n' && argv[1][2] == '\0')
|
|
83
|
+
flags |= MDBX_NOSUBDIR;
|
|
84
|
+
else if (argv[1][1] == 'c' && argv[1][2] == '\0')
|
|
85
|
+
cpflags |= MDBX_CP_COMPACT;
|
|
86
|
+
else if (argv[1][1] == 'd' && argv[1][2] == '\0')
|
|
87
|
+
cpflags |= MDBX_CP_FORCE_DYNAMIC_SIZE;
|
|
88
|
+
else if (argv[1][1] == 'p' && argv[1][2] == '\0')
|
|
89
|
+
cpflags |= MDBX_CP_THROTTLE_MVCC;
|
|
90
|
+
else if (argv[1][1] == 'q' && argv[1][2] == '\0')
|
|
91
|
+
quiet = true;
|
|
92
|
+
else if (argv[1][1] == 'u' && argv[1][2] == '\0')
|
|
93
|
+
warmup = true;
|
|
94
|
+
else if (argv[1][1] == 'U' && argv[1][2] == '\0') {
|
|
95
|
+
warmup = true;
|
|
96
|
+
warmup_flags = MDBX_warmup_force | MDBX_warmup_touchlimit | MDBX_warmup_lock;
|
|
97
|
+
} else if ((argv[1][1] == 'h' && argv[1][2] == '\0') || strcmp(argv[1], "--help") == 0)
|
|
98
|
+
usage(progname);
|
|
99
|
+
else if (argv[1][1] == 'V' && argv[1][2] == '\0') {
|
|
100
|
+
printf("mdbx_copy version %d.%d.%d.%d\n"
|
|
101
|
+
" - source: %s %s, commit %s, tree %s\n"
|
|
102
|
+
" - anchor: %s\n"
|
|
103
|
+
" - build: %s for %s by %s\n"
|
|
104
|
+
" - flags: %s\n"
|
|
105
|
+
" - options: %s\n",
|
|
106
|
+
mdbx_version.major, mdbx_version.minor, mdbx_version.patch, mdbx_version.tweak, mdbx_version.git.describe,
|
|
107
|
+
mdbx_version.git.datetime, mdbx_version.git.commit, mdbx_version.git.tree, mdbx_sourcery_anchor,
|
|
108
|
+
mdbx_build.datetime, mdbx_build.target, mdbx_build.compiler, mdbx_build.flags, mdbx_build.options);
|
|
109
|
+
return EXIT_SUCCESS;
|
|
110
|
+
} else
|
|
111
|
+
argc = 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (argc < 2 || argc > 3)
|
|
115
|
+
usage(progname);
|
|
116
|
+
|
|
117
|
+
#if defined(_WIN32) || defined(_WIN64)
|
|
118
|
+
SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true);
|
|
119
|
+
#else
|
|
120
|
+
#ifdef SIGPIPE
|
|
121
|
+
signal(SIGPIPE, signal_handler);
|
|
122
|
+
#endif
|
|
123
|
+
#ifdef SIGHUP
|
|
124
|
+
signal(SIGHUP, signal_handler);
|
|
125
|
+
#endif
|
|
126
|
+
signal(SIGINT, signal_handler);
|
|
127
|
+
signal(SIGTERM, signal_handler);
|
|
128
|
+
#endif /* !WINDOWS */
|
|
129
|
+
|
|
130
|
+
if (!quiet) {
|
|
131
|
+
fprintf((argc == 2) ? stderr : stdout, "mdbx_copy %s (%s, T-%s)\nRunning for copy %s to %s...\n",
|
|
132
|
+
mdbx_version.git.describe, mdbx_version.git.datetime, mdbx_version.git.tree, argv[1],
|
|
133
|
+
(argc == 2) ? "stdout" : argv[2]);
|
|
134
|
+
fflush(nullptr);
|
|
135
|
+
mdbx_setup_debug(MDBX_LOG_NOTICE, MDBX_DBG_DONTCHANGE, logger);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
act = "opening environment";
|
|
139
|
+
rc = mdbx_env_create(&env);
|
|
140
|
+
if (rc == MDBX_SUCCESS)
|
|
141
|
+
rc = mdbx_env_open(env, argv[1], flags, 0);
|
|
142
|
+
|
|
143
|
+
if (rc == MDBX_SUCCESS && warmup) {
|
|
144
|
+
act = "warming up";
|
|
145
|
+
rc = mdbx_env_warmup(env, nullptr, warmup_flags, 3600 * 65536);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!MDBX_IS_ERROR(rc)) {
|
|
149
|
+
act = "copying";
|
|
150
|
+
if (argc == 2) {
|
|
151
|
+
mdbx_filehandle_t fd;
|
|
152
|
+
#if defined(_WIN32) || defined(_WIN64)
|
|
153
|
+
fd = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
154
|
+
#else
|
|
155
|
+
fd = fileno(stdout);
|
|
156
|
+
#endif
|
|
157
|
+
rc = mdbx_env_copy2fd(env, fd, cpflags);
|
|
158
|
+
} else
|
|
159
|
+
rc = mdbx_env_copy(env, argv[2], cpflags);
|
|
160
|
+
}
|
|
161
|
+
if (rc)
|
|
162
|
+
fprintf(stderr, "%s: %s failed, error %d (%s)\n", progname, act, rc, mdbx_strerror(rc));
|
|
163
|
+
mdbx_env_close(env);
|
|
164
|
+
|
|
165
|
+
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
166
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/// \copyright SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/// \note Please refer to the COPYRIGHT file for explanations license change,
|
|
3
|
+
/// credits and acknowledgments.
|
|
4
|
+
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2021-2025
|
|
5
|
+
///
|
|
6
|
+
/// mdbx_drop.c - memory-mapped database delete tool
|
|
7
|
+
///
|
|
8
|
+
|
|
9
|
+
#ifdef _MSC_VER
|
|
10
|
+
#if _MSC_VER > 1800
|
|
11
|
+
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
|
12
|
+
#endif
|
|
13
|
+
#pragma warning(disable : 4996) /* The POSIX name is deprecated... */
|
|
14
|
+
#endif /* _MSC_VER (warnings) */
|
|
15
|
+
|
|
16
|
+
#define xMDBX_TOOLS /* Avoid using internal eASSERT() */
|
|
17
|
+
#include "essentials.h"
|
|
18
|
+
|
|
19
|
+
#include <ctype.h>
|
|
20
|
+
|
|
21
|
+
#if defined(_WIN32) || defined(_WIN64)
|
|
22
|
+
#include "wingetopt.h"
|
|
23
|
+
|
|
24
|
+
static volatile BOOL user_break;
|
|
25
|
+
static BOOL WINAPI ConsoleBreakHandlerRoutine(DWORD dwCtrlType) {
|
|
26
|
+
(void)dwCtrlType;
|
|
27
|
+
user_break = true;
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
#else /* WINDOWS */
|
|
32
|
+
|
|
33
|
+
static volatile sig_atomic_t user_break;
|
|
34
|
+
static void signal_handler(int sig) {
|
|
35
|
+
(void)sig;
|
|
36
|
+
user_break = 1;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#endif /* !WINDOWS */
|
|
40
|
+
|
|
41
|
+
static char *prog;
|
|
42
|
+
bool quiet = false;
|
|
43
|
+
static void usage(void) {
|
|
44
|
+
fprintf(stderr,
|
|
45
|
+
"usage: %s [-V] [-q] [-d] [-s name] dbpath\n"
|
|
46
|
+
" -V\t\tprint version and exit\n"
|
|
47
|
+
" -q\t\tbe quiet\n"
|
|
48
|
+
" -d\t\tdelete the specified database, don't just empty it\n"
|
|
49
|
+
" -s name\tdrop the specified named table\n"
|
|
50
|
+
" \t\tby default empty the main DB\n",
|
|
51
|
+
prog);
|
|
52
|
+
exit(EXIT_FAILURE);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static void error(const char *func, int rc) {
|
|
56
|
+
if (!quiet)
|
|
57
|
+
fprintf(stderr, "%s: %s() error %d %s\n", prog, func, rc, mdbx_strerror(rc));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static void logger(MDBX_log_level_t level, const char *function, int line, const char *fmt, va_list args) {
|
|
61
|
+
static const char *const prefixes[] = {
|
|
62
|
+
"!!!fatal: ", // 0 fatal
|
|
63
|
+
" ! ", // 1 error
|
|
64
|
+
" ~ ", // 2 warning
|
|
65
|
+
" ", // 3 notice
|
|
66
|
+
" //", // 4 verbose
|
|
67
|
+
};
|
|
68
|
+
if (level < MDBX_LOG_DEBUG) {
|
|
69
|
+
if (function && line)
|
|
70
|
+
fprintf(stderr, "%s", prefixes[level]);
|
|
71
|
+
vfprintf(stderr, fmt, args);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
int main(int argc, char *argv[]) {
|
|
76
|
+
int i, rc;
|
|
77
|
+
MDBX_env *env;
|
|
78
|
+
MDBX_txn *txn;
|
|
79
|
+
MDBX_dbi dbi;
|
|
80
|
+
char *envname = nullptr;
|
|
81
|
+
char *subname = nullptr;
|
|
82
|
+
int envflags = MDBX_ACCEDE;
|
|
83
|
+
bool delete = false;
|
|
84
|
+
|
|
85
|
+
prog = argv[0];
|
|
86
|
+
if (argc < 2)
|
|
87
|
+
usage();
|
|
88
|
+
|
|
89
|
+
while ((i = getopt(argc, argv,
|
|
90
|
+
"d"
|
|
91
|
+
"s:"
|
|
92
|
+
"n"
|
|
93
|
+
"q"
|
|
94
|
+
"V")) != EOF) {
|
|
95
|
+
switch (i) {
|
|
96
|
+
case 'V':
|
|
97
|
+
printf("mdbx_drop version %d.%d.%d.%d\n"
|
|
98
|
+
" - source: %s %s, commit %s, tree %s\n"
|
|
99
|
+
" - anchor: %s\n"
|
|
100
|
+
" - build: %s for %s by %s\n"
|
|
101
|
+
" - flags: %s\n"
|
|
102
|
+
" - options: %s\n",
|
|
103
|
+
mdbx_version.major, mdbx_version.minor, mdbx_version.patch, mdbx_version.tweak, mdbx_version.git.describe,
|
|
104
|
+
mdbx_version.git.datetime, mdbx_version.git.commit, mdbx_version.git.tree, mdbx_sourcery_anchor,
|
|
105
|
+
mdbx_build.datetime, mdbx_build.target, mdbx_build.compiler, mdbx_build.flags, mdbx_build.options);
|
|
106
|
+
return EXIT_SUCCESS;
|
|
107
|
+
case 'q':
|
|
108
|
+
quiet = true;
|
|
109
|
+
break;
|
|
110
|
+
case 'd':
|
|
111
|
+
delete = true;
|
|
112
|
+
break;
|
|
113
|
+
case 'n':
|
|
114
|
+
break;
|
|
115
|
+
case 's':
|
|
116
|
+
subname = optarg;
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
usage();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (optind != argc - 1)
|
|
124
|
+
usage();
|
|
125
|
+
|
|
126
|
+
#if defined(_WIN32) || defined(_WIN64)
|
|
127
|
+
SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true);
|
|
128
|
+
#else
|
|
129
|
+
#ifdef SIGPIPE
|
|
130
|
+
signal(SIGPIPE, signal_handler);
|
|
131
|
+
#endif
|
|
132
|
+
#ifdef SIGHUP
|
|
133
|
+
signal(SIGHUP, signal_handler);
|
|
134
|
+
#endif
|
|
135
|
+
signal(SIGINT, signal_handler);
|
|
136
|
+
signal(SIGTERM, signal_handler);
|
|
137
|
+
#endif /* !WINDOWS */
|
|
138
|
+
|
|
139
|
+
envname = argv[optind];
|
|
140
|
+
if (!quiet) {
|
|
141
|
+
printf("mdbx_drop %s (%s, T-%s)\nRunning for %s/%s...\n", mdbx_version.git.describe, mdbx_version.git.datetime,
|
|
142
|
+
mdbx_version.git.tree, envname, subname ? subname : "@MAIN");
|
|
143
|
+
fflush(nullptr);
|
|
144
|
+
mdbx_setup_debug(MDBX_LOG_NOTICE, MDBX_DBG_DONTCHANGE, logger);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
rc = mdbx_env_create(&env);
|
|
148
|
+
if (unlikely(rc != MDBX_SUCCESS)) {
|
|
149
|
+
error("mdbx_env_create", rc);
|
|
150
|
+
return EXIT_FAILURE;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (subname) {
|
|
154
|
+
rc = mdbx_env_set_maxdbs(env, 2);
|
|
155
|
+
if (unlikely(rc != MDBX_SUCCESS)) {
|
|
156
|
+
error("mdbx_env_set_maxdbs", rc);
|
|
157
|
+
goto env_close;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
rc = mdbx_env_open(env, envname, envflags, 0);
|
|
162
|
+
if (unlikely(rc != MDBX_SUCCESS)) {
|
|
163
|
+
error("mdbx_env_open", rc);
|
|
164
|
+
goto env_close;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
rc = mdbx_txn_begin(env, nullptr, 0, &txn);
|
|
168
|
+
if (unlikely(rc != MDBX_SUCCESS)) {
|
|
169
|
+
error("mdbx_txn_begin", rc);
|
|
170
|
+
goto env_close;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
rc = mdbx_dbi_open(txn, subname, MDBX_DB_ACCEDE, &dbi);
|
|
174
|
+
if (unlikely(rc != MDBX_SUCCESS)) {
|
|
175
|
+
error("mdbx_dbi_open", rc);
|
|
176
|
+
goto txn_abort;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
rc = mdbx_drop(txn, dbi, delete);
|
|
180
|
+
if (unlikely(rc != MDBX_SUCCESS)) {
|
|
181
|
+
error("mdbx_drop", rc);
|
|
182
|
+
goto txn_abort;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
rc = mdbx_txn_commit(txn);
|
|
186
|
+
if (unlikely(rc != MDBX_SUCCESS)) {
|
|
187
|
+
error("mdbx_txn_commit", rc);
|
|
188
|
+
goto txn_abort;
|
|
189
|
+
}
|
|
190
|
+
txn = nullptr;
|
|
191
|
+
|
|
192
|
+
txn_abort:
|
|
193
|
+
if (txn)
|
|
194
|
+
mdbx_txn_abort(txn);
|
|
195
|
+
env_close:
|
|
196
|
+
mdbx_env_close(env);
|
|
197
|
+
|
|
198
|
+
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
199
|
+
}
|