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.
Files changed (220) hide show
  1. package/.github/workflows/ci.yml +32 -0
  2. package/.github/workflows/publish.yml +27 -0
  3. package/.gitmodules +3 -0
  4. package/CMakeLists.txt +53 -0
  5. package/LICENSE +201 -0
  6. package/README.md +639 -0
  7. package/build.js +11 -0
  8. package/deps/libmdbx/.clang-format +3 -0
  9. package/deps/libmdbx/.cmake-format.yaml +3 -0
  10. package/deps/libmdbx/.le.ini +40 -0
  11. package/deps/libmdbx/CMakeLists.txt +1269 -0
  12. package/deps/libmdbx/COPYRIGHT +159 -0
  13. package/deps/libmdbx/ChangeLog.md +2786 -0
  14. package/deps/libmdbx/GNUmakefile +950 -0
  15. package/deps/libmdbx/LICENSE +177 -0
  16. package/deps/libmdbx/Makefile +16 -0
  17. package/deps/libmdbx/NOTICE +39 -0
  18. package/deps/libmdbx/README.md +863 -0
  19. package/deps/libmdbx/TODO.md +43 -0
  20. package/deps/libmdbx/cmake/compiler.cmake +1221 -0
  21. package/deps/libmdbx/cmake/profile.cmake +58 -0
  22. package/deps/libmdbx/cmake/utils.cmake +524 -0
  23. package/deps/libmdbx/conanfile.py +323 -0
  24. package/deps/libmdbx/docs/Doxyfile.in +2734 -0
  25. package/deps/libmdbx/docs/_preface.md +47 -0
  26. package/deps/libmdbx/docs/_restrictions.md +248 -0
  27. package/deps/libmdbx/docs/_starting.md +245 -0
  28. package/deps/libmdbx/docs/_toc.md +34 -0
  29. package/deps/libmdbx/docs/header.html +96 -0
  30. package/deps/libmdbx/example/CMakeLists.txt +6 -0
  31. package/deps/libmdbx/example/README.md +1 -0
  32. package/deps/libmdbx/example/example-mdbx.c +154 -0
  33. package/deps/libmdbx/example/sample-bdb.txt +77 -0
  34. package/deps/libmdbx/mdbx.h +6655 -0
  35. package/deps/libmdbx/mdbx.h++ +6428 -0
  36. package/deps/libmdbx/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch +173 -0
  37. package/deps/libmdbx/src/alloy.c +54 -0
  38. package/deps/libmdbx/src/api-cold.c +543 -0
  39. package/deps/libmdbx/src/api-copy.c +912 -0
  40. package/deps/libmdbx/src/api-cursor.c +754 -0
  41. package/deps/libmdbx/src/api-dbi.c +315 -0
  42. package/deps/libmdbx/src/api-env.c +1434 -0
  43. package/deps/libmdbx/src/api-extra.c +165 -0
  44. package/deps/libmdbx/src/api-key-transform.c +197 -0
  45. package/deps/libmdbx/src/api-misc.c +286 -0
  46. package/deps/libmdbx/src/api-opts.c +575 -0
  47. package/deps/libmdbx/src/api-range-estimate.c +365 -0
  48. package/deps/libmdbx/src/api-txn-data.c +454 -0
  49. package/deps/libmdbx/src/api-txn.c +921 -0
  50. package/deps/libmdbx/src/atomics-ops.h +364 -0
  51. package/deps/libmdbx/src/atomics-types.h +97 -0
  52. package/deps/libmdbx/src/audit.c +109 -0
  53. package/deps/libmdbx/src/bits.md +34 -0
  54. package/deps/libmdbx/src/chk.c +1796 -0
  55. package/deps/libmdbx/src/cogs.c +309 -0
  56. package/deps/libmdbx/src/cogs.h +506 -0
  57. package/deps/libmdbx/src/coherency.c +170 -0
  58. package/deps/libmdbx/src/config.h.in +88 -0
  59. package/deps/libmdbx/src/cursor.c +2396 -0
  60. package/deps/libmdbx/src/cursor.h +391 -0
  61. package/deps/libmdbx/src/dbi.c +717 -0
  62. package/deps/libmdbx/src/dbi.h +142 -0
  63. package/deps/libmdbx/src/debug_begin.h +36 -0
  64. package/deps/libmdbx/src/debug_end.h +15 -0
  65. package/deps/libmdbx/src/dpl.c +486 -0
  66. package/deps/libmdbx/src/dpl.h +134 -0
  67. package/deps/libmdbx/src/dxb.c +1335 -0
  68. package/deps/libmdbx/src/env.c +607 -0
  69. package/deps/libmdbx/src/essentials.h +125 -0
  70. package/deps/libmdbx/src/gc-get.c +1345 -0
  71. package/deps/libmdbx/src/gc-put.c +970 -0
  72. package/deps/libmdbx/src/gc.h +40 -0
  73. package/deps/libmdbx/src/global.c +474 -0
  74. package/deps/libmdbx/src/internals.h +585 -0
  75. package/deps/libmdbx/src/layout-dxb.h +288 -0
  76. package/deps/libmdbx/src/layout-lck.h +289 -0
  77. package/deps/libmdbx/src/lck-posix.c +859 -0
  78. package/deps/libmdbx/src/lck-windows.c +607 -0
  79. package/deps/libmdbx/src/lck.c +174 -0
  80. package/deps/libmdbx/src/lck.h +110 -0
  81. package/deps/libmdbx/src/logging_and_debug.c +250 -0
  82. package/deps/libmdbx/src/logging_and_debug.h +159 -0
  83. package/deps/libmdbx/src/man1/mdbx_chk.1 +106 -0
  84. package/deps/libmdbx/src/man1/mdbx_copy.1 +95 -0
  85. package/deps/libmdbx/src/man1/mdbx_drop.1 +48 -0
  86. package/deps/libmdbx/src/man1/mdbx_dump.1 +101 -0
  87. package/deps/libmdbx/src/man1/mdbx_load.1 +105 -0
  88. package/deps/libmdbx/src/man1/mdbx_stat.1 +86 -0
  89. package/deps/libmdbx/src/mdbx.c++ +1837 -0
  90. package/deps/libmdbx/src/meta.c +656 -0
  91. package/deps/libmdbx/src/meta.h +168 -0
  92. package/deps/libmdbx/src/mvcc-readers.c +414 -0
  93. package/deps/libmdbx/src/node.c +365 -0
  94. package/deps/libmdbx/src/node.h +102 -0
  95. package/deps/libmdbx/src/ntdll.def +1246 -0
  96. package/deps/libmdbx/src/options.h +534 -0
  97. package/deps/libmdbx/src/osal.c +3485 -0
  98. package/deps/libmdbx/src/osal.h +587 -0
  99. package/deps/libmdbx/src/page-get.c +483 -0
  100. package/deps/libmdbx/src/page-iov.c +185 -0
  101. package/deps/libmdbx/src/page-iov.h +34 -0
  102. package/deps/libmdbx/src/page-ops.c +744 -0
  103. package/deps/libmdbx/src/page-ops.h +142 -0
  104. package/deps/libmdbx/src/pnl.c +236 -0
  105. package/deps/libmdbx/src/pnl.h +146 -0
  106. package/deps/libmdbx/src/preface.h +990 -0
  107. package/deps/libmdbx/src/proto.h +105 -0
  108. package/deps/libmdbx/src/refund.c +212 -0
  109. package/deps/libmdbx/src/sort.h +484 -0
  110. package/deps/libmdbx/src/spill.c +431 -0
  111. package/deps/libmdbx/src/spill.h +74 -0
  112. package/deps/libmdbx/src/table.c +107 -0
  113. package/deps/libmdbx/src/tls.c +551 -0
  114. package/deps/libmdbx/src/tls.h +43 -0
  115. package/deps/libmdbx/src/tools/chk.c +673 -0
  116. package/deps/libmdbx/src/tools/copy.c +166 -0
  117. package/deps/libmdbx/src/tools/drop.c +199 -0
  118. package/deps/libmdbx/src/tools/dump.c +515 -0
  119. package/deps/libmdbx/src/tools/load.c +831 -0
  120. package/deps/libmdbx/src/tools/stat.c +516 -0
  121. package/deps/libmdbx/src/tools/wingetopt.c +87 -0
  122. package/deps/libmdbx/src/tools/wingetopt.h +30 -0
  123. package/deps/libmdbx/src/tree-ops.c +1554 -0
  124. package/deps/libmdbx/src/tree-search.c +140 -0
  125. package/deps/libmdbx/src/txl.c +99 -0
  126. package/deps/libmdbx/src/txl.h +26 -0
  127. package/deps/libmdbx/src/txn.c +1083 -0
  128. package/deps/libmdbx/src/unaligned.h +205 -0
  129. package/deps/libmdbx/src/utils.c +32 -0
  130. package/deps/libmdbx/src/utils.h +76 -0
  131. package/deps/libmdbx/src/version.c.in +44 -0
  132. package/deps/libmdbx/src/walk.c +290 -0
  133. package/deps/libmdbx/src/walk.h +20 -0
  134. package/deps/libmdbx/src/windows-import.c +152 -0
  135. package/deps/libmdbx/src/windows-import.h +128 -0
  136. package/deps/libmdbx/test/CMakeLists.txt +317 -0
  137. package/deps/libmdbx/test/append.c++ +237 -0
  138. package/deps/libmdbx/test/base.h++ +92 -0
  139. package/deps/libmdbx/test/battery-tmux.sh +64 -0
  140. package/deps/libmdbx/test/cases.c++ +118 -0
  141. package/deps/libmdbx/test/chrono.c++ +134 -0
  142. package/deps/libmdbx/test/chrono.h++ +85 -0
  143. package/deps/libmdbx/test/config.c++ +643 -0
  144. package/deps/libmdbx/test/config.h++ +334 -0
  145. package/deps/libmdbx/test/copy.c++ +62 -0
  146. package/deps/libmdbx/test/dead.c++ +39 -0
  147. package/deps/libmdbx/test/dump-load.sh +40 -0
  148. package/deps/libmdbx/test/extra/crunched_delete.c++ +409 -0
  149. package/deps/libmdbx/test/extra/cursor_closing.c++ +410 -0
  150. package/deps/libmdbx/test/extra/dbi.c++ +229 -0
  151. package/deps/libmdbx/test/extra/doubtless_positioning.c++ +253 -0
  152. package/deps/libmdbx/test/extra/dupfix_addodd.c +94 -0
  153. package/deps/libmdbx/test/extra/dupfix_multiple.c++ +311 -0
  154. package/deps/libmdbx/test/extra/early_close_dbi.c++ +137 -0
  155. package/deps/libmdbx/test/extra/hex_base64_base58.c++ +118 -0
  156. package/deps/libmdbx/test/extra/maindb_ordinal.c++ +61 -0
  157. package/deps/libmdbx/test/extra/open.c++ +96 -0
  158. package/deps/libmdbx/test/extra/pcrf/README.md +2 -0
  159. package/deps/libmdbx/test/extra/pcrf/pcrf_test.c +380 -0
  160. package/deps/libmdbx/test/extra/probe.c++ +10 -0
  161. package/deps/libmdbx/test/extra/txn.c++ +407 -0
  162. package/deps/libmdbx/test/extra/upsert_alldups.c +193 -0
  163. package/deps/libmdbx/test/fork.c++ +263 -0
  164. package/deps/libmdbx/test/hill.c++ +447 -0
  165. package/deps/libmdbx/test/jitter.c++ +197 -0
  166. package/deps/libmdbx/test/keygen.c++ +393 -0
  167. package/deps/libmdbx/test/keygen.h++ +130 -0
  168. package/deps/libmdbx/test/log.c++ +358 -0
  169. package/deps/libmdbx/test/log.h++ +91 -0
  170. package/deps/libmdbx/test/main.c++ +706 -0
  171. package/deps/libmdbx/test/nested.c++ +318 -0
  172. package/deps/libmdbx/test/osal-unix.c++ +647 -0
  173. package/deps/libmdbx/test/osal-windows.c++ +440 -0
  174. package/deps/libmdbx/test/osal.h++ +41 -0
  175. package/deps/libmdbx/test/stochastic.sh +690 -0
  176. package/deps/libmdbx/test/stub/LICENSE +24 -0
  177. package/deps/libmdbx/test/stub/README.md +8 -0
  178. package/deps/libmdbx/test/stub/pthread_barrier.c +104 -0
  179. package/deps/libmdbx/test/stub/pthread_barrier.h +77 -0
  180. package/deps/libmdbx/test/test.c++ +1551 -0
  181. package/deps/libmdbx/test/test.h++ +298 -0
  182. package/deps/libmdbx/test/tmux.conf +3 -0
  183. package/deps/libmdbx/test/try.c++ +30 -0
  184. package/deps/libmdbx/test/ttl.c++ +240 -0
  185. package/deps/libmdbx/test/utils.c++ +203 -0
  186. package/deps/libmdbx/test/utils.h++ +326 -0
  187. package/deps/libmdbx/test/valgrind_suppress.txt +536 -0
  188. package/lib/mdbx_evn_async.js +211 -0
  189. package/lib/mdbx_worker.js +195 -0
  190. package/lib/nativemou.js +6 -0
  191. package/package.json +38 -0
  192. package/src/async/envmou_close.cpp +34 -0
  193. package/src/async/envmou_close.hpp +32 -0
  194. package/src/async/envmou_copy_to.cpp +29 -0
  195. package/src/async/envmou_copy_to.hpp +38 -0
  196. package/src/async/envmou_keys.cpp +201 -0
  197. package/src/async/envmou_keys.hpp +50 -0
  198. package/src/async/envmou_open.cpp +38 -0
  199. package/src/async/envmou_open.hpp +33 -0
  200. package/src/async/envmou_query.cpp +167 -0
  201. package/src/async/envmou_query.hpp +53 -0
  202. package/src/dbimou.cpp +522 -0
  203. package/src/dbimou.hpp +82 -0
  204. package/src/env_arg0.hpp +24 -0
  205. package/src/envmou.cpp +445 -0
  206. package/src/envmou.hpp +116 -0
  207. package/src/modulemou.cpp +113 -0
  208. package/src/querymou.cpp +177 -0
  209. package/src/querymou.hpp +93 -0
  210. package/src/txnmou.cpp +254 -0
  211. package/src/txnmou.hpp +122 -0
  212. package/src/typemou.hpp +239 -0
  213. package/src/valuemou.hpp +194 -0
  214. package/test/async.js +67 -0
  215. package/test/e3.js +38 -0
  216. package/test/e4.js +89 -0
  217. package/test/e5.js +162 -0
  218. package/test/test-batch-ops.js +243 -0
  219. package/test/test-cursor-mode.js +84 -0
  220. 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
+ }