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,152 @@
1
+ /// \copyright SPDX-License-Identifier: Apache-2.0
2
+ /// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2025
3
+
4
+ #if defined(_WIN32) || defined(_WIN64)
5
+
6
+ #include "internals.h"
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Stub for slim read-write lock
10
+ // Portion Copyright (C) 1995-2002 Brad Wilson
11
+
12
+ static void WINAPI stub_srwlock_Init(osal_srwlock_t *srwl) { srwl->readerCount = srwl->writerCount = 0; }
13
+
14
+ static void WINAPI stub_srwlock_AcquireShared(osal_srwlock_t *srwl) {
15
+ while (true) {
16
+ assert(srwl->writerCount >= 0 && srwl->readerCount >= 0);
17
+
18
+ // If there's a writer already, spin without unnecessarily
19
+ // interlocking the CPUs
20
+ if (srwl->writerCount != 0) {
21
+ SwitchToThread();
22
+ continue;
23
+ }
24
+
25
+ // Add to the readers list
26
+ _InterlockedIncrement(&srwl->readerCount);
27
+
28
+ // Check for writers again (we may have been preempted). If
29
+ // there are no writers writing or waiting, then we're done.
30
+ if (srwl->writerCount == 0)
31
+ break;
32
+
33
+ // Remove from the readers list, spin, try again
34
+ _InterlockedDecrement(&srwl->readerCount);
35
+ SwitchToThread();
36
+ }
37
+ }
38
+
39
+ static void WINAPI stub_srwlock_ReleaseShared(osal_srwlock_t *srwl) {
40
+ assert(srwl->readerCount > 0);
41
+ _InterlockedDecrement(&srwl->readerCount);
42
+ }
43
+
44
+ static void WINAPI stub_srwlock_AcquireExclusive(osal_srwlock_t *srwl) {
45
+ while (true) {
46
+ assert(srwl->writerCount >= 0 && srwl->readerCount >= 0);
47
+
48
+ // If there's a writer already, spin without unnecessarily
49
+ // interlocking the CPUs
50
+ if (srwl->writerCount != 0) {
51
+ SwitchToThread();
52
+ continue;
53
+ }
54
+
55
+ // See if we can become the writer (expensive, because it inter-
56
+ // locks the CPUs, so writing should be an infrequent process)
57
+ if (_InterlockedExchange(&srwl->writerCount, 1) == 0)
58
+ break;
59
+ }
60
+
61
+ // Now we're the writer, but there may be outstanding readers.
62
+ // Spin until there aren't any more; new readers will wait now
63
+ // that we're the writer.
64
+ while (srwl->readerCount != 0) {
65
+ assert(srwl->writerCount >= 0 && srwl->readerCount >= 0);
66
+ SwitchToThread();
67
+ }
68
+ }
69
+
70
+ static void WINAPI stub_srwlock_ReleaseExclusive(osal_srwlock_t *srwl) {
71
+ assert(srwl->writerCount == 1 && srwl->readerCount >= 0);
72
+ srwl->writerCount = 0;
73
+ }
74
+
75
+ static uint64_t WINAPI stub_GetTickCount64(void) {
76
+ LARGE_INTEGER Counter, Frequency;
77
+ return (QueryPerformanceFrequency(&Frequency) && QueryPerformanceCounter(&Counter))
78
+ ? Counter.QuadPart * 1000ul / Frequency.QuadPart
79
+ : 0;
80
+ }
81
+
82
+ //------------------------------------------------------------------------------
83
+
84
+ struct libmdbx_imports imports;
85
+
86
+ #if __GNUC_PREREQ(8, 0)
87
+ #pragma GCC diagnostic push
88
+ #pragma GCC diagnostic ignored "-Wcast-function-type"
89
+ #endif /* GCC/MINGW */
90
+
91
+ #define MDBX_IMPORT(HANDLE, ENTRY) imports.ENTRY = (MDBX_##ENTRY)GetProcAddress(HANDLE, #ENTRY)
92
+
93
+ void windows_import(void) {
94
+ const HINSTANCE hNtdll = GetModuleHandleA("ntdll.dll");
95
+ if (hNtdll) {
96
+ globals.running_under_Wine = !!GetProcAddress(hNtdll, "wine_get_version");
97
+ if (!globals.running_under_Wine) {
98
+ MDBX_IMPORT(hNtdll, NtFsControlFile);
99
+ MDBX_IMPORT(hNtdll, NtExtendSection);
100
+ ENSURE(nullptr, imports.NtExtendSection);
101
+ }
102
+ }
103
+
104
+ const HINSTANCE hKernel32dll = GetModuleHandleA("kernel32.dll");
105
+ if (hKernel32dll) {
106
+ MDBX_IMPORT(hKernel32dll, GetFileInformationByHandleEx);
107
+ MDBX_IMPORT(hKernel32dll, GetTickCount64);
108
+ if (!imports.GetTickCount64)
109
+ imports.GetTickCount64 = stub_GetTickCount64;
110
+ if (!globals.running_under_Wine) {
111
+ MDBX_IMPORT(hKernel32dll, SetFileInformationByHandle);
112
+ MDBX_IMPORT(hKernel32dll, GetVolumeInformationByHandleW);
113
+ MDBX_IMPORT(hKernel32dll, GetFinalPathNameByHandleW);
114
+ MDBX_IMPORT(hKernel32dll, PrefetchVirtualMemory);
115
+ MDBX_IMPORT(hKernel32dll, SetFileIoOverlappedRange);
116
+ }
117
+ }
118
+
119
+ const osal_srwlock_t_function srwlock_init =
120
+ (osal_srwlock_t_function)(hKernel32dll ? GetProcAddress(hKernel32dll, "InitializeSRWLock") : nullptr);
121
+ if (srwlock_init) {
122
+ imports.srwl_Init = srwlock_init;
123
+ imports.srwl_AcquireShared = (osal_srwlock_t_function)GetProcAddress(hKernel32dll, "AcquireSRWLockShared");
124
+ imports.srwl_ReleaseShared = (osal_srwlock_t_function)GetProcAddress(hKernel32dll, "ReleaseSRWLockShared");
125
+ imports.srwl_AcquireExclusive = (osal_srwlock_t_function)GetProcAddress(hKernel32dll, "AcquireSRWLockExclusive");
126
+ imports.srwl_ReleaseExclusive = (osal_srwlock_t_function)GetProcAddress(hKernel32dll, "ReleaseSRWLockExclusive");
127
+ } else {
128
+ imports.srwl_Init = stub_srwlock_Init;
129
+ imports.srwl_AcquireShared = stub_srwlock_AcquireShared;
130
+ imports.srwl_ReleaseShared = stub_srwlock_ReleaseShared;
131
+ imports.srwl_AcquireExclusive = stub_srwlock_AcquireExclusive;
132
+ imports.srwl_ReleaseExclusive = stub_srwlock_ReleaseExclusive;
133
+ }
134
+
135
+ const HINSTANCE hAdvapi32dll = GetModuleHandleA("advapi32.dll");
136
+ if (hAdvapi32dll) {
137
+ MDBX_IMPORT(hAdvapi32dll, RegGetValueA);
138
+ }
139
+
140
+ const HINSTANCE hOle32dll = GetModuleHandleA("ole32.dll");
141
+ if (hOle32dll) {
142
+ MDBX_IMPORT(hOle32dll, CoCreateGuid);
143
+ }
144
+ }
145
+
146
+ #undef MDBX_IMPORT
147
+
148
+ #if __GNUC_PREREQ(8, 0)
149
+ #pragma GCC diagnostic pop
150
+ #endif /* GCC/MINGW */
151
+
152
+ #endif /* Windows */
@@ -0,0 +1,128 @@
1
+ /// \copyright SPDX-License-Identifier: Apache-2.0
2
+ /// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2025
3
+
4
+ #pragma once
5
+
6
+ typedef union osal_srwlock {
7
+ __anonymous_struct_extension__ struct {
8
+ long volatile readerCount;
9
+ long volatile writerCount;
10
+ };
11
+ RTL_SRWLOCK native;
12
+ } osal_srwlock_t;
13
+
14
+ typedef void(WINAPI *osal_srwlock_t_function)(osal_srwlock_t *);
15
+
16
+ #if _WIN32_WINNT < 0x0600 /* prior to Windows Vista */
17
+ typedef enum _FILE_INFO_BY_HANDLE_CLASS {
18
+ FileBasicInfo,
19
+ FileStandardInfo,
20
+ FileNameInfo,
21
+ FileRenameInfo,
22
+ FileDispositionInfo,
23
+ FileAllocationInfo,
24
+ FileEndOfFileInfo,
25
+ FileStreamInfo,
26
+ FileCompressionInfo,
27
+ FileAttributeTagInfo,
28
+ FileIdBothDirectoryInfo,
29
+ FileIdBothDirectoryRestartInfo,
30
+ FileIoPriorityHintInfo,
31
+ FileRemoteProtocolInfo,
32
+ MaximumFileInfoByHandleClass
33
+ } FILE_INFO_BY_HANDLE_CLASS,
34
+ *PFILE_INFO_BY_HANDLE_CLASS;
35
+
36
+ typedef struct _FILE_END_OF_FILE_INFO {
37
+ LARGE_INTEGER EndOfFile;
38
+ } FILE_END_OF_FILE_INFO, *PFILE_END_OF_FILE_INFO;
39
+
40
+ #define REMOTE_PROTOCOL_INFO_FLAG_LOOPBACK 0x00000001
41
+ #define REMOTE_PROTOCOL_INFO_FLAG_OFFLINE 0x00000002
42
+
43
+ typedef struct _FILE_REMOTE_PROTOCOL_INFO {
44
+ USHORT StructureVersion;
45
+ USHORT StructureSize;
46
+ DWORD Protocol;
47
+ USHORT ProtocolMajorVersion;
48
+ USHORT ProtocolMinorVersion;
49
+ USHORT ProtocolRevision;
50
+ USHORT Reserved;
51
+ DWORD Flags;
52
+ struct {
53
+ DWORD Reserved[8];
54
+ } GenericReserved;
55
+ struct {
56
+ DWORD Reserved[16];
57
+ } ProtocolSpecificReserved;
58
+ } FILE_REMOTE_PROTOCOL_INFO, *PFILE_REMOTE_PROTOCOL_INFO;
59
+
60
+ #endif /* _WIN32_WINNT < 0x0600 (prior to Windows Vista) */
61
+
62
+ typedef BOOL(WINAPI *MDBX_GetFileInformationByHandleEx)(_In_ HANDLE hFile,
63
+ _In_ FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
64
+ _Out_ LPVOID lpFileInformation, _In_ DWORD dwBufferSize);
65
+
66
+ typedef BOOL(WINAPI *MDBX_GetVolumeInformationByHandleW)(
67
+ _In_ HANDLE hFile, _Out_opt_ LPWSTR lpVolumeNameBuffer, _In_ DWORD nVolumeNameSize,
68
+ _Out_opt_ LPDWORD lpVolumeSerialNumber, _Out_opt_ LPDWORD lpMaximumComponentLength,
69
+ _Out_opt_ LPDWORD lpFileSystemFlags, _Out_opt_ LPWSTR lpFileSystemNameBuffer, _In_ DWORD nFileSystemNameSize);
70
+
71
+ typedef DWORD(WINAPI *MDBX_GetFinalPathNameByHandleW)(_In_ HANDLE hFile, _Out_ LPWSTR lpszFilePath,
72
+ _In_ DWORD cchFilePath, _In_ DWORD dwFlags);
73
+
74
+ typedef BOOL(WINAPI *MDBX_SetFileInformationByHandle)(_In_ HANDLE hFile,
75
+ _In_ FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
76
+ _Out_ LPVOID lpFileInformation, _In_ DWORD dwBufferSize);
77
+
78
+ typedef NTSTATUS(NTAPI *MDBX_NtFsControlFile)(IN HANDLE FileHandle, IN OUT HANDLE Event,
79
+ IN OUT PVOID /* PIO_APC_ROUTINE */ ApcRoutine, IN OUT PVOID ApcContext,
80
+ OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG FsControlCode,
81
+ IN OUT PVOID InputBuffer, IN ULONG InputBufferLength,
82
+ OUT OPTIONAL PVOID OutputBuffer, IN ULONG OutputBufferLength);
83
+
84
+ typedef uint64_t(WINAPI *MDBX_GetTickCount64)(void);
85
+
86
+ #if !defined(_WIN32_WINNT_WIN8) || _WIN32_WINNT < _WIN32_WINNT_WIN8
87
+ typedef struct _WIN32_MEMORY_RANGE_ENTRY {
88
+ PVOID VirtualAddress;
89
+ SIZE_T NumberOfBytes;
90
+ } WIN32_MEMORY_RANGE_ENTRY, *PWIN32_MEMORY_RANGE_ENTRY;
91
+ #endif /* Windows 8.x */
92
+
93
+ typedef BOOL(WINAPI *MDBX_PrefetchVirtualMemory)(HANDLE hProcess, ULONG_PTR NumberOfEntries,
94
+ PWIN32_MEMORY_RANGE_ENTRY VirtualAddresses, ULONG Flags);
95
+
96
+ typedef enum _SECTION_INHERIT { ViewShare = 1, ViewUnmap = 2 } SECTION_INHERIT;
97
+
98
+ typedef NTSTATUS(NTAPI *MDBX_NtExtendSection)(IN HANDLE SectionHandle, IN PLARGE_INTEGER NewSectionSize);
99
+
100
+ typedef LSTATUS(WINAPI *MDBX_RegGetValueA)(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType,
101
+ PVOID pvData, LPDWORD pcbData);
102
+
103
+ typedef long(WINAPI *MDBX_CoCreateGuid)(bin128_t *guid);
104
+
105
+ NTSYSAPI ULONG RtlRandomEx(PULONG Seed);
106
+
107
+ typedef BOOL(WINAPI *MDBX_SetFileIoOverlappedRange)(HANDLE FileHandle, PUCHAR OverlappedRangeStart, ULONG Length);
108
+
109
+ struct libmdbx_imports {
110
+ osal_srwlock_t_function srwl_Init;
111
+ osal_srwlock_t_function srwl_AcquireShared;
112
+ osal_srwlock_t_function srwl_ReleaseShared;
113
+ osal_srwlock_t_function srwl_AcquireExclusive;
114
+ osal_srwlock_t_function srwl_ReleaseExclusive;
115
+ MDBX_NtExtendSection NtExtendSection;
116
+ MDBX_GetFileInformationByHandleEx GetFileInformationByHandleEx;
117
+ MDBX_GetVolumeInformationByHandleW GetVolumeInformationByHandleW;
118
+ MDBX_GetFinalPathNameByHandleW GetFinalPathNameByHandleW;
119
+ MDBX_SetFileInformationByHandle SetFileInformationByHandle;
120
+ MDBX_NtFsControlFile NtFsControlFile;
121
+ MDBX_PrefetchVirtualMemory PrefetchVirtualMemory;
122
+ MDBX_GetTickCount64 GetTickCount64;
123
+ MDBX_RegGetValueA RegGetValueA;
124
+ MDBX_SetFileIoOverlappedRange SetFileIoOverlappedRange;
125
+ MDBX_CoCreateGuid CoCreateGuid;
126
+ };
127
+
128
+ MDBX_INTERNAL void windows_import(void);
@@ -0,0 +1,317 @@
1
+ # Copyright (c) 2020-2025 Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> ###############################################
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ if(NOT CMAKE_CXX_COMPILER_LOADED)
5
+ enable_language(CXX)
6
+ include(../cmake/compiler.cmake)
7
+ endif()
8
+
9
+ function(add_extra_test name)
10
+ set(options DISABLED)
11
+ set(oneValueArgs TIMEOUT)
12
+ set(multiValueArgs SOURCE LIBRARY DEPEND DLLPATH)
13
+ cmake_parse_arguments(params "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
14
+
15
+ if(params_UNPARSED_ARGUMENTS)
16
+ message(FATAL_ERROR "Unknown keywords given to add_extra_test(): \"${params_UNPARSED_ARGUMENTS}\".")
17
+ endif()
18
+
19
+ macro(oops)
20
+ message(FATAL_ERROR "add_extra_test(): Opps, " ${ARGV})
21
+ endmacro()
22
+
23
+ if(NOT params_SOURCE)
24
+ set(params_SOURCE extra/${name}.c++)
25
+ endif()
26
+
27
+ set(target "test_extra_${name}")
28
+ add_executable(${target} ${params_SOURCE})
29
+ target_include_directories(${target} PRIVATE "${PROJECT_SOURCE_DIR}")
30
+ target_link_libraries(${target} ${TOOL_MDBX_LIB})
31
+ set_target_properties(${target} PROPERTIES SKIP_BUILD_RPATH FALSE BUILD_WITH_INSTALL_RPATH FALSE)
32
+
33
+ if(MDBX_BUILD_CXX AND MDBX_CXX_STANDARD)
34
+ set_target_properties(${target} PROPERTIES CXX_STANDARD ${MDBX_CXX_STANDARD} CXX_STANDARD_REQUIRED ON)
35
+ endif()
36
+
37
+ if(params_DEPEND)
38
+ add_dependencies(${target} ${params_DEPEND})
39
+ endif()
40
+
41
+ if(TOOL_MDBX_DLLCRUTCH)
42
+ string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPERCASE)
43
+ foreach(dep IN LISTS params_LIBRARY)
44
+ get_target_property(type ${dep} TYPE)
45
+ if(type STREQUAL SHARED_LIBRARY)
46
+ # Windows don't have RPATH feature, therefore we should prepare PATH or copy DLL(s)...
47
+ if(CMAKE_CONFIGURATION_TYPES)
48
+ # Could not provide static ENVIRONMENT property with configuration-depended path
49
+ set(dir FALSE)
50
+ else(CMAKE_CONFIGURATION_TYPES)
51
+ get_target_property(filename ${dep} IMPORTED_LOCATION_${CMAKE_BUILD_TYPE_UPPERCASE})
52
+ if(NOT filename)
53
+ get_target_property(filename ${dep} IMPORTED_LOCATION)
54
+ endif()
55
+ get_target_property(filename ${dep} LOCATION_${CMAKE_BUILD_TYPE_UPPERCASE})
56
+ if(NOT filename)
57
+ get_target_property(filename ${dep} LOCATION)
58
+ endif()
59
+ if(filename)
60
+ get_filename_component(dir ${filename} DIRECTORY)
61
+ else(filename)
62
+ get_target_property(dir ${dep} LIBRARY_OUTPUT_DIRECTORY_${CMAKE_BUILD_TYPE_UPPERCASE})
63
+ if(NOT dir)
64
+ get_target_property(dir ${dep} RUNTIME_OUTPUT_DIRECTORY_${CMAKE_BUILD_TYPE_UPPERCASE})
65
+ endif()
66
+ if(NOT dir)
67
+ get_target_property(dir ${dep} LIBRARY_OUTPUT_DIRECTORY)
68
+ endif()
69
+ if(NOT dir)
70
+ get_target_property(dir ${dep} RUNTIME_OUTPUT_DIRECTORY)
71
+ endif()
72
+ endif(filename)
73
+ endif(CMAKE_CONFIGURATION_TYPES)
74
+ if(dir)
75
+ list(APPEND params_DLLPATH ${dir})
76
+ else(dir)
77
+ # Path is configuration-depended or not available, should copy dll
78
+ add_custom_command(
79
+ TARGET ${target}
80
+ POST_BUILD
81
+ COMMAND if exist "$<TARGET_PDB_FILE:${dep}>" ${CMAKE_COMMAND} -E copy_if_different
82
+ "$<TARGET_PDB_FILE:${dep}>" "$<TARGET_FILE_DIR:${target}>")
83
+ add_custom_command(
84
+ TARGET ${target}
85
+ POST_BUILD
86
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:${dep}>" "$<TARGET_FILE_DIR:${target}>"
87
+ COMMENT "${TOOL_MDBX_DLLCRUTCH}: Copy shared library ${dep} for test ${target}")
88
+ endif(dir)
89
+ endif()
90
+ endforeach(dep)
91
+ endif(TOOL_MDBX_DLLCRUTCH)
92
+
93
+ if(NOT params_DISABLED AND NOT (CMAKE_CROSSCOMPILING AND NOT CMAKE_CROSSCOMPILING_EMULATOR))
94
+ add_test(extra_${name} ${MDBX_OUTPUT_DIR}/${target})
95
+ if(params_TIMEOUT)
96
+ if(MEMORYCHECK_COMMAND
97
+ OR CMAKE_MEMORYCHECK_COMMAND
98
+ OR ENABLE_MEMCHECK)
99
+ # FIXME: unless there are any other ideas how to fix the timeouts problem when testing under Valgrind.
100
+ math(EXPR params_TIMEOUT "${params_TIMEOUT} * 42")
101
+ endif()
102
+ set_tests_properties(extra_${name} PROPERTIES TIMEOUT ${params_TIMEOUT})
103
+ endif()
104
+ if(params_DLLPATH)
105
+ # Compose DLL's path in the ENVIRONMENT property
106
+ if(WIN32)
107
+ set(params_DLLPATH_ENV "${params_DLLPATH};$ENV{PATH}")
108
+ else()
109
+ set(params_DLLPATH_ENV "${params_DLLPATH}:$ENV{PATH}")
110
+ string(REPLACE ":" ";" params_DLLPATH_ENV "${params_DLLPATH_ENV}")
111
+ endif()
112
+ list(REMOVE_DUPLICATES params_DLLPATH_ENV)
113
+ if(WIN32)
114
+ string(REPLACE ";" "\\;" params_DLLPATH_ENV "${params_DLLPATH_ENV}")
115
+ else()
116
+ string(REPLACE ";" ":" params_DLLPATH_ENV "${params_DLLPATH_ENV}")
117
+ endif()
118
+ set_tests_properties(extra_${name} PROPERTIES ENVIRONMENT "PATH=${params_DLLPATH_ENV}")
119
+ endif()
120
+ endif()
121
+ endfunction(add_extra_test)
122
+
123
+ set(LIBMDBX_TEST_SOURCES
124
+ base.h++
125
+ cases.c++
126
+ chrono.c++
127
+ chrono.h++
128
+ config.c++
129
+ config.h++
130
+ copy.c++
131
+ dead.c++
132
+ hill.c++
133
+ jitter.c++
134
+ keygen.c++
135
+ keygen.h++
136
+ log.c++
137
+ log.h++
138
+ main.c++
139
+ osal.h++
140
+ osal-unix.c++
141
+ osal-windows.c++
142
+ test.c++
143
+ test.h++
144
+ try.c++
145
+ utils.c++
146
+ utils.h++
147
+ append.c++
148
+ ttl.c++
149
+ nested.c++
150
+ fork.c++)
151
+
152
+ if(MDBX_BUILD_CXX)
153
+ add_extra_test(probe DISABLED)
154
+ else()
155
+ probe_libcxx_filesystem()
156
+ list(APPEND LIBMDBX_TEST_SOURCES "${MDBX_SOURCE_DIR}/mdbx.c++" ../mdbx.h++)
157
+ endif()
158
+
159
+ add_executable(mdbx_test ${LIBMDBX_TEST_SOURCES})
160
+ target_compile_definitions(mdbx_test PRIVATE MDBX_BUILD_TEST=1 MDBX_BUILD_CXX=1)
161
+
162
+ if(MDBX_CXX_STANDARD)
163
+ set_target_properties(mdbx_test PROPERTIES CXX_STANDARD ${MDBX_CXX_STANDARD} CXX_STANDARD_REQUIRED ON)
164
+ endif()
165
+
166
+ set_target_properties(mdbx_test PROPERTIES INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>)
167
+ target_setup_options(mdbx_test)
168
+
169
+ if(NOT MDBX_BUILD_CXX)
170
+ target_compile_definitions(mdbx_test PRIVATE MDBX_BUILD_CXX=1)
171
+ if(WIN32)
172
+ target_compile_definitions(mdbx_test PRIVATE MDBX_WITHOUT_MSVC_CRT=0)
173
+ endif()
174
+ endif()
175
+
176
+ if(NOT MDBX_BUILD_CXX AND LIBCXX_FILESYSTEM)
177
+ if(CMAKE_COMPILER_IS_ELBRUSCXX
178
+ AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 1.25.23
179
+ AND NOT CMAKE_VERSION VERSION_LESS 3.13)
180
+ target_link_options(mdbx_test PRIVATE "-Wl,--allow-multiple-definition")
181
+ endif()
182
+ target_link_libraries(mdbx_test ${LIBCXX_FILESYSTEM})
183
+ endif()
184
+
185
+ if(CMAKE_VERSION VERSION_LESS 3.1)
186
+ target_link_libraries(mdbx_test ${TOOL_MDBX_LIB} ${LIB_MATH} ${CMAKE_THREAD_LIBS_INIT})
187
+ else()
188
+ target_link_libraries(mdbx_test ${TOOL_MDBX_LIB} ${LIB_MATH} Threads::Threads)
189
+ endif()
190
+ if(WIN32)
191
+ target_link_libraries(mdbx_test winmm.lib)
192
+ endif()
193
+
194
+ if(NOT SUBPROJECT)
195
+ if(UNIX)
196
+ add_executable(test_extra_pcrf extra/pcrf/pcrf_test.c)
197
+ target_include_directories(test_extra_pcrf PRIVATE "${PROJECT_SOURCE_DIR}")
198
+ target_link_libraries(test_extra_pcrf ${TOOL_MDBX_LIB})
199
+ endif()
200
+ endif()
201
+
202
+ # ######################################################################################################################
203
+
204
+ if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CROSSCOMPILING_EMULATOR)
205
+ message(WARNING "No emulator to run cross-compiled tests")
206
+ add_test(NAME fake_since_no_crosscompiling_emulator COMMAND ${CMAKE_COMMAND} -E echo
207
+ "No emulator to run cross-compiled tests")
208
+ else()
209
+
210
+ string(
211
+ RANDOM
212
+ LENGTH 9
213
+ ALPHABET "1234567890" test_seed)
214
+ message(STATUS "The ${test_seed} will be used for seeding tests. Re-run cmake to re-seed it.")
215
+
216
+ add_test(NAME smoke COMMAND ${MDBX_OUTPUT_DIR}/mdbx_test --loglevel=verbose --prng-seed=${test_seed} --progress
217
+ --console=no --pathname=smoke.db --dont-cleanup-after basic)
218
+ set_tests_properties(smoke PROPERTIES TIMEOUT 600 RUN_SERIAL OFF)
219
+ if(MDBX_BUILD_TOOLS)
220
+ add_test(NAME smoke_chk COMMAND ${MDBX_OUTPUT_DIR}/mdbx_chk -nvv smoke.db)
221
+ set_tests_properties(
222
+ smoke_chk
223
+ PROPERTIES DEPENDS
224
+ smoke
225
+ TIMEOUT
226
+ 60
227
+ FAIL_REGULAR_EXPRESSION
228
+ "cooperative mode"
229
+ REQUIRED_FILES
230
+ smoke.db)
231
+ add_test(NAME smoke_chk_copy COMMAND ${MDBX_OUTPUT_DIR}/mdbx_chk -nvv smoke.db-copy)
232
+ set_tests_properties(
233
+ smoke_chk_copy
234
+ PROPERTIES DEPENDS
235
+ smoke
236
+ TIMEOUT
237
+ 60
238
+ FAIL_REGULAR_EXPRESSION
239
+ "cooperative mode"
240
+ REQUIRED_FILES
241
+ smoke.db-copy)
242
+ endif()
243
+
244
+ add_test(
245
+ NAME dupsort_writemap
246
+ COMMAND
247
+ ${MDBX_OUTPUT_DIR}/mdbx_test --loglevel=notice --prng-seed=${test_seed} --table=+data.fixed --keygen.split=29
248
+ --datalen=rnd --progress --console=no --repeat=2 --pathname=dupsort_writemap.db --dont-cleanup-after basic)
249
+ set_tests_properties(dupsort_writemap PROPERTIES TIMEOUT 3600 RUN_SERIAL OFF)
250
+ if(MDBX_BUILD_TOOLS)
251
+ add_test(NAME dupsort_writemap_chk COMMAND ${MDBX_OUTPUT_DIR}/mdbx_chk -nvvwc dupsort_writemap.db)
252
+ set_tests_properties(dupsort_writemap_chk PROPERTIES DEPENDS dupsort_writemap TIMEOUT 60 REQUIRED_FILES
253
+ dupsort_writemap.db)
254
+ add_test(NAME dupsort_writemap_chk_copy COMMAND ${MDBX_OUTPUT_DIR}/mdbx_chk -nvvc dupsort_writemap.db-copy)
255
+ set_tests_properties(
256
+ dupsort_writemap_chk_copy
257
+ PROPERTIES DEPENDS
258
+ dupsort_writemap
259
+ TIMEOUT
260
+ 60
261
+ FAIL_REGULAR_EXPRESSION
262
+ "monopolistic mode"
263
+ REQUIRED_FILES
264
+ dupsort_writemap.db-copy)
265
+ endif()
266
+
267
+ add_test(NAME uniq_nested
268
+ COMMAND ${MDBX_OUTPUT_DIR}/mdbx_test --loglevel=notice --mode=-writemap,-nosync-safe,-lifo --progress
269
+ --console=no --repeat=2 --pathname=uniq_nested.db --dont-cleanup-after basic)
270
+ set_tests_properties(uniq_nested PROPERTIES TIMEOUT 1800 RUN_SERIAL OFF)
271
+ if(MDBX_BUILD_TOOLS)
272
+ add_test(NAME uniq_nested_chk COMMAND ${MDBX_OUTPUT_DIR}/mdbx_chk -nvvw uniq_nested.db)
273
+ set_tests_properties(
274
+ uniq_nested_chk
275
+ PROPERTIES DEPENDS
276
+ uniq_nested
277
+ TIMEOUT
278
+ 60
279
+ FAIL_REGULAR_EXPRESSION
280
+ "cooperative mode"
281
+ REQUIRED_FILES
282
+ uniq_nested.db)
283
+ add_test(NAME uniq_nested_chk_copy COMMAND ${MDBX_OUTPUT_DIR}/mdbx_chk -nvv uniq_nested.db-copy)
284
+ set_tests_properties(
285
+ uniq_nested_chk_copy
286
+ PROPERTIES DEPENDS
287
+ uniq_nested
288
+ TIMEOUT
289
+ 60
290
+ FAIL_REGULAR_EXPRESSION
291
+ "cooperative mode"
292
+ REQUIRED_FILES
293
+ uniq_nested.db-copy)
294
+ endif()
295
+
296
+ if(NOT SUBPROJECT)
297
+ if(UNIX)
298
+ add_extra_test(upsert_alldups SOURCE extra/upsert_alldups.c)
299
+ add_extra_test(dupfix_addodd SOURCE extra/dupfix_addodd.c)
300
+ endif()
301
+ if(MDBX_BUILD_CXX)
302
+ if(NOT WIN32 OR NOT MDBX_CXX_STANDARD LESS 17)
303
+ add_extra_test(cursor_closing TIMEOUT 10800)
304
+ add_extra_test(early_close_dbi)
305
+ add_extra_test(maindb_ordinal)
306
+ add_extra_test(dupfix_multiple TIMEOUT 10800)
307
+ add_extra_test(doubtless_positioning TIMEOUT 10800)
308
+ add_extra_test(crunched_delete TIMEOUT 10800)
309
+ add_extra_test(dbi)
310
+ add_extra_test(open)
311
+ add_extra_test(txn)
312
+ endif()
313
+ add_extra_test(hex_base64_base58)
314
+ endif()
315
+ endif()
316
+
317
+ endif()