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,516 @@
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_stat.c - memory-mapped database status 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 print_stat(MDBX_stat *ms) {
40
+ printf(" Pagesize: %u\n", ms->ms_psize);
41
+ printf(" Tree depth: %u\n", ms->ms_depth);
42
+ printf(" Branch pages: %" PRIu64 "\n", ms->ms_branch_pages);
43
+ printf(" Leaf pages: %" PRIu64 "\n", ms->ms_leaf_pages);
44
+ printf(" Overflow pages: %" PRIu64 "\n", ms->ms_overflow_pages);
45
+ printf(" Entries: %" PRIu64 "\n", ms->ms_entries);
46
+ }
47
+
48
+ static void usage(const char *prog) {
49
+ fprintf(stderr,
50
+ "usage: %s [-V] [-q] [-e] [-f[f[f]]] [-r[r]] [-a|-s table] dbpath\n"
51
+ " -V\t\tprint version and exit\n"
52
+ " -q\t\tbe quiet\n"
53
+ " -p\t\tshow statistics of page operations for current session\n"
54
+ " -e\t\tshow whole DB info\n"
55
+ " -f\t\tshow GC info\n"
56
+ " -r\t\tshow readers\n"
57
+ " -a\t\tprint stat of main DB and all tables\n"
58
+ " -s table\tprint stat of only the specified named table\n"
59
+ " \t\tby default print stat of only the main DB\n",
60
+ prog);
61
+ exit(EXIT_FAILURE);
62
+ }
63
+
64
+ static int reader_list_func(void *ctx, int num, int slot, mdbx_pid_t pid, mdbx_tid_t thread, uint64_t txnid,
65
+ uint64_t lag, size_t bytes_used, size_t bytes_retained) {
66
+ (void)ctx;
67
+ if (num == 1)
68
+ printf("Reader Table\n"
69
+ " #\tslot\t%6s %*s %20s %10s %13s %13s\n",
70
+ "pid", (int)sizeof(size_t) * 2, "thread", "txnid", "lag", "used", "retained");
71
+
72
+ if (thread < (mdbx_tid_t)((intptr_t)MDBX_TID_TXN_OUSTED))
73
+ printf(" %3d)\t[%d]\t%6" PRIdSIZE " %*" PRIxPTR, num, slot, (size_t)pid, (int)sizeof(size_t) * 2,
74
+ (uintptr_t)thread);
75
+ else
76
+ printf(" %3d)\t[%d]\t%6" PRIdSIZE " %sed", num, slot, (size_t)pid,
77
+ (thread == (mdbx_tid_t)((uintptr_t)MDBX_TID_TXN_PARKED)) ? "park" : "oust");
78
+
79
+ if (txnid)
80
+ printf(" %20" PRIu64 " %10" PRIu64 " %12.1fM %12.1fM\n", txnid, lag, bytes_used / 1048576.0,
81
+ bytes_retained / 1048576.0);
82
+ else
83
+ printf(" %20s %10s %13s %13s\n", "-", "0", "0", "0");
84
+
85
+ return user_break ? MDBX_RESULT_TRUE : MDBX_RESULT_FALSE;
86
+ }
87
+
88
+ const char *prog;
89
+ bool quiet = false;
90
+ static void error(const char *func, int rc) {
91
+ if (!quiet)
92
+ fprintf(stderr, "%s: %s() error %d %s\n", prog, func, rc, mdbx_strerror(rc));
93
+ }
94
+
95
+ static void logger(MDBX_log_level_t level, const char *function, int line, const char *fmt, va_list args) {
96
+ static const char *const prefixes[] = {
97
+ "!!!fatal: ", // 0 fatal
98
+ " ! ", // 1 error
99
+ " ~ ", // 2 warning
100
+ " ", // 3 notice
101
+ " //", // 4 verbose
102
+ };
103
+ if (level < MDBX_LOG_DEBUG) {
104
+ if (function && line)
105
+ fprintf(stderr, "%s", prefixes[level]);
106
+ vfprintf(stderr, fmt, args);
107
+ }
108
+ }
109
+
110
+ int main(int argc, char *argv[]) {
111
+ int opt, rc;
112
+ MDBX_env *env;
113
+ MDBX_txn *txn;
114
+ MDBX_dbi dbi;
115
+ MDBX_envinfo mei;
116
+ prog = argv[0];
117
+ char *envname;
118
+ char *table = nullptr;
119
+ bool alldbs = false, envinfo = false, pgop = false;
120
+ int freinfo = 0, rdrinfo = 0;
121
+
122
+ if (argc < 2)
123
+ usage(prog);
124
+
125
+ while ((opt = getopt(argc, argv,
126
+ "V"
127
+ "q"
128
+ "p"
129
+ "a"
130
+ "e"
131
+ "f"
132
+ "n"
133
+ "r"
134
+ "s:")) != EOF) {
135
+ switch (opt) {
136
+ case 'V':
137
+ printf("mdbx_stat version %d.%d.%d.%d\n"
138
+ " - source: %s %s, commit %s, tree %s\n"
139
+ " - anchor: %s\n"
140
+ " - build: %s for %s by %s\n"
141
+ " - flags: %s\n"
142
+ " - options: %s\n",
143
+ mdbx_version.major, mdbx_version.minor, mdbx_version.patch, mdbx_version.tweak, mdbx_version.git.describe,
144
+ mdbx_version.git.datetime, mdbx_version.git.commit, mdbx_version.git.tree, mdbx_sourcery_anchor,
145
+ mdbx_build.datetime, mdbx_build.target, mdbx_build.compiler, mdbx_build.flags, mdbx_build.options);
146
+ return EXIT_SUCCESS;
147
+ case 'q':
148
+ quiet = true;
149
+ break;
150
+ case 'p':
151
+ pgop = true;
152
+ break;
153
+ case 'a':
154
+ if (table)
155
+ usage(prog);
156
+ alldbs = true;
157
+ break;
158
+ case 'e':
159
+ envinfo = true;
160
+ break;
161
+ case 'f':
162
+ freinfo += 1;
163
+ break;
164
+ case 'n':
165
+ break;
166
+ case 'r':
167
+ rdrinfo += 1;
168
+ break;
169
+ case 's':
170
+ if (alldbs)
171
+ usage(prog);
172
+ table = optarg;
173
+ break;
174
+ default:
175
+ usage(prog);
176
+ }
177
+ }
178
+
179
+ if (optind != argc - 1)
180
+ usage(prog);
181
+
182
+ #if defined(_WIN32) || defined(_WIN64)
183
+ SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true);
184
+ #else
185
+ #ifdef SIGPIPE
186
+ signal(SIGPIPE, signal_handler);
187
+ #endif
188
+ #ifdef SIGHUP
189
+ signal(SIGHUP, signal_handler);
190
+ #endif
191
+ signal(SIGINT, signal_handler);
192
+ signal(SIGTERM, signal_handler);
193
+ #endif /* !WINDOWS */
194
+
195
+ envname = argv[optind];
196
+ envname = argv[optind];
197
+ if (!quiet) {
198
+ printf("mdbx_stat %s (%s, T-%s)\nRunning for %s...\n", mdbx_version.git.describe, mdbx_version.git.datetime,
199
+ mdbx_version.git.tree, envname);
200
+ fflush(nullptr);
201
+ mdbx_setup_debug(MDBX_LOG_NOTICE, MDBX_DBG_DONTCHANGE, logger);
202
+ }
203
+
204
+ rc = mdbx_env_create(&env);
205
+ if (unlikely(rc != MDBX_SUCCESS)) {
206
+ error("mdbx_env_create", rc);
207
+ return EXIT_FAILURE;
208
+ }
209
+
210
+ if (alldbs || table) {
211
+ rc = mdbx_env_set_maxdbs(env, 2);
212
+ if (unlikely(rc != MDBX_SUCCESS)) {
213
+ error("mdbx_env_set_maxdbs", rc);
214
+ goto env_close;
215
+ }
216
+ }
217
+
218
+ rc = mdbx_env_open(env, envname, MDBX_RDONLY, 0);
219
+ if (unlikely(rc != MDBX_SUCCESS)) {
220
+ error("mdbx_env_open", rc);
221
+ goto env_close;
222
+ }
223
+
224
+ rc = mdbx_txn_begin(env, nullptr, MDBX_TXN_RDONLY, &txn);
225
+ if (unlikely(rc != MDBX_SUCCESS)) {
226
+ error("mdbx_txn_begin", rc);
227
+ goto txn_abort;
228
+ }
229
+
230
+ if (envinfo || freinfo || pgop) {
231
+ rc = mdbx_env_info_ex(env, txn, &mei, sizeof(mei));
232
+ if (unlikely(rc != MDBX_SUCCESS)) {
233
+ error("mdbx_env_info_ex", rc);
234
+ goto txn_abort;
235
+ }
236
+ } else {
237
+ /* LY: zap warnings from gcc */
238
+ memset(&mei, 0, sizeof(mei));
239
+ }
240
+
241
+ if (pgop) {
242
+ printf("Page Operations (for current session):\n");
243
+ printf(" New: %8" PRIu64 "\t// quantity of a new pages added\n", mei.mi_pgop_stat.newly);
244
+ printf(" CoW: %8" PRIu64 "\t// quantity of pages copied for altering\n", mei.mi_pgop_stat.cow);
245
+ printf(" Clone: %8" PRIu64 "\t// quantity of parent's dirty pages "
246
+ "clones for nested transactions\n",
247
+ mei.mi_pgop_stat.clone);
248
+ printf(" Split: %8" PRIu64 "\t// page splits during insertions or updates\n", mei.mi_pgop_stat.split);
249
+ printf(" Merge: %8" PRIu64 "\t// page merges during deletions or updates\n", mei.mi_pgop_stat.merge);
250
+ printf(" Spill: %8" PRIu64 "\t// quantity of spilled/ousted `dirty` "
251
+ "pages during large transactions\n",
252
+ mei.mi_pgop_stat.spill);
253
+ printf(" Unspill: %8" PRIu64 "\t// quantity of unspilled/redone `dirty` "
254
+ "pages during large transactions\n",
255
+ mei.mi_pgop_stat.unspill);
256
+ printf(" WOP: %8" PRIu64 "\t// number of explicit write operations (not a pages) to a disk\n",
257
+ mei.mi_pgop_stat.wops);
258
+ printf(" PreFault: %8" PRIu64 "\t// number of prefault write operations (not a pages)\n",
259
+ mei.mi_pgop_stat.prefault);
260
+ printf(" mInCore: %8" PRIu64 "\t// number of mincore() calls\n", mei.mi_pgop_stat.mincore);
261
+ printf(" mSync: %8" PRIu64 "\t// number of explicit msync-to-disk operations (not a pages)\n",
262
+ mei.mi_pgop_stat.msync);
263
+ printf(" fSync: %8" PRIu64 "\t// number of explicit fsync-to-disk operations (not a pages)\n",
264
+ mei.mi_pgop_stat.fsync);
265
+ }
266
+
267
+ if (envinfo) {
268
+ printf("Environment Info\n");
269
+ printf(" Pagesize: %u\n", mei.mi_dxb_pagesize);
270
+ if (mei.mi_geo.lower != mei.mi_geo.upper) {
271
+ printf(" Dynamic datafile: %" PRIu64 "..%" PRIu64 " bytes (+%" PRIu64 "/-%" PRIu64 "), %" PRIu64 "..%" PRIu64
272
+ " pages (+%" PRIu64 "/-%" PRIu64 ")\n",
273
+ mei.mi_geo.lower, mei.mi_geo.upper, mei.mi_geo.grow, mei.mi_geo.shrink,
274
+ mei.mi_geo.lower / mei.mi_dxb_pagesize, mei.mi_geo.upper / mei.mi_dxb_pagesize,
275
+ mei.mi_geo.grow / mei.mi_dxb_pagesize, mei.mi_geo.shrink / mei.mi_dxb_pagesize);
276
+ printf(" Current mapsize: %" PRIu64 " bytes, %" PRIu64 " pages \n", mei.mi_mapsize,
277
+ mei.mi_mapsize / mei.mi_dxb_pagesize);
278
+ printf(" Current datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n", mei.mi_geo.current,
279
+ mei.mi_geo.current / mei.mi_dxb_pagesize);
280
+ #if defined(_WIN32) || defined(_WIN64)
281
+ if (mei.mi_geo.shrink && mei.mi_geo.current != mei.mi_geo.upper)
282
+ printf(" WARNING: Due Windows system limitations a "
283
+ "file couldn't\n be truncated while database "
284
+ "is opened. So, the size of\n database file "
285
+ "may by large than the database itself,\n "
286
+ "until it will be closed or reopened in read-write mode.\n");
287
+ #endif
288
+ } else {
289
+ printf(" Fixed datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n", mei.mi_geo.current,
290
+ mei.mi_geo.current / mei.mi_dxb_pagesize);
291
+ }
292
+ printf(" Last transaction ID: %" PRIu64 "\n", mei.mi_recent_txnid);
293
+ printf(" Latter reader transaction ID: %" PRIu64 " (%" PRIi64 ")\n", mei.mi_latter_reader_txnid,
294
+ mei.mi_latter_reader_txnid - mei.mi_recent_txnid);
295
+ printf(" Max readers: %u\n", mei.mi_maxreaders);
296
+ printf(" Number of reader slots uses: %u\n", mei.mi_numreaders);
297
+ }
298
+
299
+ if (rdrinfo) {
300
+ rc = mdbx_reader_list(env, reader_list_func, nullptr);
301
+ if (MDBX_IS_ERROR(rc)) {
302
+ error("mdbx_reader_list", rc);
303
+ goto txn_abort;
304
+ }
305
+ if (rc == MDBX_RESULT_TRUE)
306
+ printf("Reader Table is absent\n");
307
+ else if (rc == MDBX_SUCCESS && rdrinfo > 1) {
308
+ int dead;
309
+ rc = mdbx_reader_check(env, &dead);
310
+ if (MDBX_IS_ERROR(rc)) {
311
+ error("mdbx_reader_check", rc);
312
+ goto txn_abort;
313
+ }
314
+ if (rc == MDBX_RESULT_TRUE) {
315
+ printf(" %d stale readers cleared.\n", dead);
316
+ rc = mdbx_reader_list(env, reader_list_func, nullptr);
317
+ if (rc == MDBX_RESULT_TRUE)
318
+ printf(" Now Reader Table is empty\n");
319
+ } else
320
+ printf(" No stale readers.\n");
321
+ }
322
+ if (!(table || alldbs || freinfo))
323
+ goto txn_abort;
324
+ }
325
+
326
+ if (freinfo) {
327
+ printf("Garbage Collection\n");
328
+ dbi = 0;
329
+ MDBX_cursor *cursor;
330
+ rc = mdbx_cursor_open(txn, dbi, &cursor);
331
+ if (unlikely(rc != MDBX_SUCCESS)) {
332
+ error("mdbx_cursor_open", rc);
333
+ goto txn_abort;
334
+ }
335
+
336
+ MDBX_stat mst;
337
+ rc = mdbx_dbi_stat(txn, dbi, &mst, sizeof(mst));
338
+ if (unlikely(rc != MDBX_SUCCESS)) {
339
+ error("mdbx_dbi_stat", rc);
340
+ goto txn_abort;
341
+ }
342
+ print_stat(&mst);
343
+
344
+ pgno_t pages = 0, *iptr;
345
+ pgno_t reclaimable = 0;
346
+ MDBX_val key, data;
347
+ while (MDBX_SUCCESS == (rc = mdbx_cursor_get(cursor, &key, &data, MDBX_NEXT))) {
348
+ if (user_break) {
349
+ rc = MDBX_EINTR;
350
+ break;
351
+ }
352
+ iptr = data.iov_base;
353
+ const pgno_t number = *iptr++;
354
+
355
+ pages += number;
356
+ if (envinfo && mei.mi_latter_reader_txnid > *(txnid_t *)key.iov_base)
357
+ reclaimable += number;
358
+
359
+ if (freinfo > 1) {
360
+ char *bad = "";
361
+ pgno_t prev = MDBX_PNL_ASCENDING ? NUM_METAS - 1 : (pgno_t)mei.mi_last_pgno + 1;
362
+ pgno_t span = 1;
363
+ for (unsigned i = 0; i < number; ++i) {
364
+ pgno_t pg = iptr[i];
365
+ if (MDBX_PNL_DISORDERED(prev, pg))
366
+ bad = " [bad sequence]";
367
+ prev = pg;
368
+ while (i + span < number && iptr[i + span] == (MDBX_PNL_ASCENDING ? pgno_add(pg, span) : pgno_sub(pg, span)))
369
+ ++span;
370
+ }
371
+ printf(" Transaction %" PRIaTXN ", %" PRIaPGNO " pages, maxspan %" PRIaPGNO "%s\n", *(txnid_t *)key.iov_base,
372
+ number, span, bad);
373
+ if (freinfo > 2) {
374
+ for (unsigned i = 0; i < number; i += span) {
375
+ const pgno_t pg = iptr[i];
376
+ for (span = 1;
377
+ i + span < number && iptr[i + span] == (MDBX_PNL_ASCENDING ? pgno_add(pg, span) : pgno_sub(pg, span));
378
+ ++span)
379
+ ;
380
+ if (span > 1)
381
+ printf(" %9" PRIaPGNO "[%" PRIaPGNO "]\n", pg, span);
382
+ else
383
+ printf(" %9" PRIaPGNO "\n", pg);
384
+ }
385
+ }
386
+ }
387
+ }
388
+ mdbx_cursor_close(cursor);
389
+ cursor = nullptr;
390
+
391
+ switch (rc) {
392
+ case MDBX_SUCCESS:
393
+ case MDBX_NOTFOUND:
394
+ break;
395
+ case MDBX_EINTR:
396
+ if (!quiet)
397
+ fprintf(stderr, "Interrupted by signal/user\n");
398
+ goto txn_abort;
399
+ default:
400
+ error("mdbx_cursor_get", rc);
401
+ goto txn_abort;
402
+ }
403
+
404
+ if (envinfo) {
405
+ uint64_t value = mei.mi_mapsize / mei.mi_dxb_pagesize;
406
+ double percent = value / 100.0;
407
+ printf("Page Usage\n");
408
+ printf(" Total: %" PRIu64 " 100%%\n", value);
409
+
410
+ value = mei.mi_geo.current / mei.mi_dxb_pagesize;
411
+ printf(" Backed: %" PRIu64 " %.1f%%\n", value, value / percent);
412
+
413
+ value = mei.mi_last_pgno + 1;
414
+ printf(" Allocated: %" PRIu64 " %.1f%%\n", value, value / percent);
415
+
416
+ value = mei.mi_mapsize / mei.mi_dxb_pagesize - (mei.mi_last_pgno + 1);
417
+ printf(" Remained: %" PRIu64 " %.1f%%\n", value, value / percent);
418
+
419
+ value = mei.mi_last_pgno + 1 - pages;
420
+ printf(" Used: %" PRIu64 " %.1f%%\n", value, value / percent);
421
+
422
+ value = pages;
423
+ printf(" GC: %" PRIu64 " %.1f%%\n", value, value / percent);
424
+
425
+ value = pages - reclaimable;
426
+ printf(" Retained: %" PRIu64 " %.1f%%\n", value, value / percent);
427
+
428
+ value = reclaimable;
429
+ printf(" Reclaimable: %" PRIu64 " %.1f%%\n", value, value / percent);
430
+
431
+ value = mei.mi_mapsize / mei.mi_dxb_pagesize - (mei.mi_last_pgno + 1) + reclaimable;
432
+ printf(" Available: %" PRIu64 " %.1f%%\n", value, value / percent);
433
+ } else
434
+ printf(" GC: %" PRIaPGNO " pages\n", pages);
435
+ }
436
+
437
+ rc = mdbx_dbi_open(txn, table, MDBX_DB_ACCEDE, &dbi);
438
+ if (unlikely(rc != MDBX_SUCCESS)) {
439
+ error("mdbx_dbi_open", rc);
440
+ goto txn_abort;
441
+ }
442
+
443
+ MDBX_stat mst;
444
+ rc = mdbx_dbi_stat(txn, dbi, &mst, sizeof(mst));
445
+ if (unlikely(rc != MDBX_SUCCESS)) {
446
+ error("mdbx_dbi_stat", rc);
447
+ goto txn_abort;
448
+ }
449
+ printf("Status of %s\n", table ? table : "Main DB");
450
+ print_stat(&mst);
451
+
452
+ if (alldbs) {
453
+ MDBX_cursor *cursor;
454
+ rc = mdbx_cursor_open(txn, dbi, &cursor);
455
+ if (unlikely(rc != MDBX_SUCCESS)) {
456
+ error("mdbx_cursor_open", rc);
457
+ goto txn_abort;
458
+ }
459
+
460
+ MDBX_val key;
461
+ while (MDBX_SUCCESS == (rc = mdbx_cursor_get(cursor, &key, nullptr, MDBX_NEXT_NODUP))) {
462
+ MDBX_dbi xdbi;
463
+ if (memchr(key.iov_base, '\0', key.iov_len))
464
+ continue;
465
+ table = osal_malloc(key.iov_len + 1);
466
+ memcpy(table, key.iov_base, key.iov_len);
467
+ table[key.iov_len] = '\0';
468
+ rc = mdbx_dbi_open(txn, table, MDBX_DB_ACCEDE, &xdbi);
469
+ if (rc == MDBX_SUCCESS)
470
+ printf("Status of %s\n", table);
471
+ osal_free(table);
472
+ if (unlikely(rc != MDBX_SUCCESS)) {
473
+ if (rc == MDBX_INCOMPATIBLE)
474
+ continue;
475
+ error("mdbx_dbi_open", rc);
476
+ goto txn_abort;
477
+ }
478
+
479
+ rc = mdbx_dbi_stat(txn, xdbi, &mst, sizeof(mst));
480
+ if (unlikely(rc != MDBX_SUCCESS)) {
481
+ error("mdbx_dbi_stat", rc);
482
+ goto txn_abort;
483
+ }
484
+ print_stat(&mst);
485
+
486
+ rc = mdbx_dbi_close(env, xdbi);
487
+ if (unlikely(rc != MDBX_SUCCESS)) {
488
+ error("mdbx_dbi_close", rc);
489
+ goto txn_abort;
490
+ }
491
+ }
492
+ mdbx_cursor_close(cursor);
493
+ cursor = nullptr;
494
+ }
495
+
496
+ switch (rc) {
497
+ case MDBX_SUCCESS:
498
+ case MDBX_NOTFOUND:
499
+ break;
500
+ case MDBX_EINTR:
501
+ if (!quiet)
502
+ fprintf(stderr, "Interrupted by signal/user\n");
503
+ break;
504
+ default:
505
+ if (unlikely(rc != MDBX_SUCCESS))
506
+ error("mdbx_cursor_get", rc);
507
+ }
508
+
509
+ mdbx_dbi_close(env, dbi);
510
+ txn_abort:
511
+ mdbx_txn_abort(txn);
512
+ env_close:
513
+ mdbx_env_close(env);
514
+
515
+ return rc ? EXIT_FAILURE : EXIT_SUCCESS;
516
+ }
@@ -0,0 +1,87 @@
1
+ /*
2
+ * POSIX getopt for Windows
3
+ *
4
+ * AT&T Public License
5
+ *
6
+ * Code given out at the 1985 UNIFORUM conference in Dallas.
7
+ */
8
+
9
+ /*----------------------------------------------------------------------------*/
10
+ /* Microsoft compiler generates a lot of warning for self includes... */
11
+
12
+ #ifdef _MSC_VER
13
+ #pragma warning(push, 1)
14
+ #pragma warning(disable : 4548) /* expression before comma has no effect; \
15
+ expected expression with side - effect */
16
+ #pragma warning(disable : 4530) /* C++ exception handler used, but unwind \
17
+ * semantics are not enabled. Specify /EHsc */
18
+ #pragma warning(disable : 4577) /* 'noexcept' used with no exception handling \
19
+ * mode specified; termination on exception is \
20
+ * not guaranteed. Specify /EHsc */
21
+ #if !defined(_CRT_SECURE_NO_WARNINGS)
22
+ #define _CRT_SECURE_NO_WARNINGS
23
+ #endif
24
+ #endif /* _MSC_VER (warnings) */
25
+
26
+ #include "wingetopt.h"
27
+ #include <stdio.h>
28
+ #include <string.h>
29
+
30
+ #ifdef _MSC_VER
31
+ #pragma warning(pop)
32
+ #endif
33
+ /*----------------------------------------------------------------------------*/
34
+
35
+ #ifndef NULL
36
+ #define NULL 0
37
+ #endif
38
+
39
+ #ifndef EOF
40
+ #define EOF (-1)
41
+ #endif
42
+
43
+ int optind = 1;
44
+ int optopt;
45
+ char *optarg;
46
+
47
+ int getopt(int argc, char *const argv[], const char *opts) {
48
+ static int sp = 1;
49
+ int c;
50
+ const char *cp;
51
+
52
+ if (sp == 1) {
53
+ if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
54
+ return EOF;
55
+ else if (strcmp(argv[optind], "--") == 0) {
56
+ optind++;
57
+ return EOF;
58
+ }
59
+ }
60
+ optopt = c = argv[optind][sp];
61
+ if (c == ':' || (cp = strchr(opts, c)) == NULL) {
62
+ fprintf(stderr, "%s: %s -- %c\n", argv[0], "illegal option", c);
63
+ if (argv[optind][++sp] == '\0') {
64
+ optind++;
65
+ sp = 1;
66
+ }
67
+ return '?';
68
+ }
69
+ if (*++cp == ':') {
70
+ if (argv[optind][sp + 1] != '\0')
71
+ optarg = &argv[optind++][sp + 1];
72
+ else if (++optind >= argc) {
73
+ fprintf(stderr, "%s: %s -- %c\n", argv[0], "option requires an argument", c);
74
+ sp = 1;
75
+ return '?';
76
+ } else
77
+ optarg = argv[optind++];
78
+ sp = 1;
79
+ } else {
80
+ if (argv[optind][++sp] == '\0') {
81
+ sp = 1;
82
+ optind++;
83
+ }
84
+ optarg = NULL;
85
+ }
86
+ return c;
87
+ }
@@ -0,0 +1,30 @@
1
+ /*
2
+ * POSIX getopt for Windows
3
+ *
4
+ * AT&T Public License
5
+ *
6
+ * Code given out at the 1985 UNIFORUM conference in Dallas.
7
+ */
8
+
9
+ #ifndef _WINGETOPT_H_
10
+ #define _WINGETOPT_H_
11
+
12
+ /* Bit of madness for Windows console */
13
+ #define mdbx_strerror mdbx_strerror_ANSI2OEM
14
+ #define mdbx_strerror_r mdbx_strerror_r_ANSI2OEM
15
+
16
+ #ifdef __cplusplus
17
+ extern "C" {
18
+ #endif
19
+
20
+ extern int opterr;
21
+ extern int optind;
22
+ extern int optopt;
23
+ extern char *optarg;
24
+ int getopt(int argc, char *const argv[], const char *optstring);
25
+
26
+ #ifdef __cplusplus
27
+ }
28
+ #endif
29
+
30
+ #endif /* _GETOPT_H_ */