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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +72 -28
  3. package/SECURITY.md +12 -12
  4. package/bin/download-prebuilds.js +15 -0
  5. package/binding.gyp +115 -111
  6. package/build/Release/lmdb.node +0 -0
  7. package/caching.js +212 -156
  8. package/dependencies/lmdb/libraries/liblmdb/COPYRIGHT +20 -20
  9. package/dependencies/lmdb/libraries/liblmdb/Doxyfile +1631 -1631
  10. package/dependencies/lmdb/libraries/liblmdb/LICENSE +47 -47
  11. package/dependencies/lmdb/libraries/liblmdb/Makefile +136 -136
  12. package/dependencies/lmdb/libraries/liblmdb/chacha8.c +183 -183
  13. package/dependencies/lmdb/libraries/liblmdb/chacha8.h +14 -14
  14. package/dependencies/lmdb/libraries/liblmdb/crypto.c +121 -121
  15. package/dependencies/lmdb/libraries/liblmdb/intro.doc +192 -192
  16. package/dependencies/lmdb/libraries/liblmdb/lmdb.h +28 -3
  17. package/dependencies/lmdb/libraries/liblmdb/mdb.c +157 -31
  18. package/dependencies/lmdb/libraries/liblmdb/mdb_copy.1 +74 -74
  19. package/dependencies/lmdb/libraries/liblmdb/mdb_copy.c +106 -106
  20. package/dependencies/lmdb/libraries/liblmdb/mdb_drop.1 +53 -53
  21. package/dependencies/lmdb/libraries/liblmdb/mdb_drop.c +154 -154
  22. package/dependencies/lmdb/libraries/liblmdb/mdb_dump.1 +94 -94
  23. package/dependencies/lmdb/libraries/liblmdb/mdb_dump.c +333 -333
  24. package/dependencies/lmdb/libraries/liblmdb/mdb_load.1 +97 -97
  25. package/dependencies/lmdb/libraries/liblmdb/mdb_load.c +530 -530
  26. package/dependencies/lmdb/libraries/liblmdb/mdb_stat.1 +83 -83
  27. package/dependencies/lmdb/libraries/liblmdb/mdb_stat.c +276 -276
  28. package/dependencies/lmdb/libraries/liblmdb/midl-sparse.c +452 -0
  29. package/dependencies/lmdb/libraries/liblmdb/midl.c +452 -452
  30. package/dependencies/lmdb/libraries/liblmdb/midl.h +208 -208
  31. package/dependencies/lmdb/libraries/liblmdb/module.c +101 -101
  32. package/dependencies/lmdb/libraries/liblmdb/module.h +16 -16
  33. package/dependencies/lmdb/libraries/liblmdb/mtest.c +178 -178
  34. package/dependencies/lmdb/libraries/liblmdb/mtest2.c +124 -124
  35. package/dependencies/lmdb/libraries/liblmdb/mtest3.c +133 -133
  36. package/dependencies/lmdb/libraries/liblmdb/mtest4.c +168 -168
  37. package/dependencies/lmdb/libraries/liblmdb/mtest5.c +135 -135
  38. package/dependencies/lmdb/libraries/liblmdb/mtest6.c +141 -141
  39. package/dependencies/lmdb/libraries/liblmdb/mtest_enc.c +190 -190
  40. package/dependencies/lmdb/libraries/liblmdb/mtest_enc2.c +189 -189
  41. package/dependencies/lmdb/libraries/liblmdb/mtest_remap.c +177 -177
  42. package/dependencies/lmdb/libraries/liblmdb/sample-bdb.txt +73 -73
  43. package/dependencies/lmdb/libraries/liblmdb/sample-mdb.txt +62 -62
  44. package/dependencies/lmdb/libraries/liblmdb/tooltag +27 -27
  45. package/dependencies/lmdb-data-v1/libraries/liblmdb/CHANGES +266 -0
  46. package/dependencies/lmdb-data-v1/libraries/liblmdb/COPYRIGHT +20 -20
  47. package/dependencies/lmdb-data-v1/libraries/liblmdb/Doxyfile +1631 -1631
  48. package/dependencies/lmdb-data-v1/libraries/liblmdb/LICENSE +47 -47
  49. package/dependencies/lmdb-data-v1/libraries/liblmdb/intro.doc +192 -192
  50. package/dependencies/lmdb-data-v1/libraries/liblmdb/lmdb.h +1608 -1653
  51. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb.c +10320 -11359
  52. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_copy.1 +55 -61
  53. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_copy.c +82 -84
  54. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_dump.1 +75 -81
  55. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_dump.c +319 -319
  56. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_load.1 +84 -84
  57. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_load.c +496 -492
  58. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_stat.1 +64 -70
  59. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_stat.c +263 -264
  60. package/dependencies/lmdb-data-v1/libraries/liblmdb/midl.c +359 -421
  61. package/dependencies/lmdb-data-v1/libraries/liblmdb/midl.h +186 -200
  62. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest.c +177 -177
  63. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest2.c +124 -124
  64. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest3.c +133 -133
  65. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest4.c +168 -168
  66. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest5.c +135 -135
  67. package/dependencies/lmdb-data-v1/libraries/liblmdb/mtest6.c +141 -141
  68. package/dependencies/lmdb-data-v1/libraries/liblmdb/sample-bdb.txt +73 -73
  69. package/dependencies/lmdb-data-v1/libraries/liblmdb/sample-mdb.txt +62 -62
  70. package/dependencies/lmdb-data-v1/libraries/liblmdb/tooltag +22 -27
  71. package/dependencies/lz4/LICENSE +11 -11
  72. package/dependencies/lz4/lib/LICENSE +24 -24
  73. package/dependencies/lz4/lib/Makefile +225 -0
  74. package/dependencies/lz4/lib/README.md +169 -137
  75. package/dependencies/lz4/lib/dll/example/Makefile +63 -0
  76. package/dependencies/lz4/lib/dll/example/README.md +69 -69
  77. package/dependencies/lz4/lib/dll/liblz4.def +62 -62
  78. package/dependencies/lz4/lib/liblz4-dll.rc.in +35 -35
  79. package/dependencies/lz4/lib/liblz4.pc.in +14 -14
  80. package/dependencies/lz4/lib/lz4.c +2722 -2495
  81. package/dependencies/lz4/lib/lz4.h +842 -774
  82. package/dependencies/lz4/lib/lz4file.c +311 -0
  83. package/dependencies/lz4/lib/lz4file.h +93 -0
  84. package/dependencies/lz4/lib/lz4frame.c +2078 -1899
  85. package/dependencies/lz4/lib/lz4frame.h +692 -623
  86. package/dependencies/lz4/lib/lz4frame_static.h +47 -47
  87. package/dependencies/lz4/lib/lz4hc.c +1631 -1615
  88. package/dependencies/lz4/lib/lz4hc.h +413 -413
  89. package/dependencies/lz4/lib/xxhash.c +1030 -1030
  90. package/dependencies/lz4/lib/xxhash.h +328 -328
  91. package/dependencies/v8/v8-fast-api-calls-v16.h +790 -790
  92. package/dependencies/v8/v8-fast-api-calls.h +784 -888
  93. package/dist/index.cjs +1050 -584
  94. package/dist/index.cjs.map +1 -1
  95. package/index.d.cts +420 -0
  96. package/index.d.ts +450 -385
  97. package/index.js +38 -37
  98. package/keys.js +116 -102
  99. package/level.js +26 -26
  100. package/native.js +8 -5
  101. package/node-index.js +21 -17
  102. package/open.js +51 -17
  103. package/package.json +63 -21
  104. package/read.js +338 -95
  105. package/src/compression.cpp +12 -9
  106. package/src/cursor.cpp +82 -31
  107. package/src/dbi.cpp +78 -40
  108. package/src/env.cpp +336 -68
  109. package/src/lmdb-js.cpp +64 -64
  110. package/src/lmdb-js.h +83 -49
  111. package/src/misc.cpp +297 -28
  112. package/src/ordered-binary.cpp +46 -46
  113. package/src/txn.cpp +210 -257
  114. package/src/v8-functions.cpp +170 -166
  115. package/src/windows.c +34 -34
  116. package/src/writer.cpp +169 -84
  117. package/util/RangeIterable.js +112 -17
  118. package/util/set-optional-deps.cjs +14 -10
  119. package/util/when.js +8 -8
  120. package/write.js +145 -121
  121. package/dependencies/lmdb-data-v1/libraries/liblmdb/Makefile +0 -118
  122. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_drop.1 +0 -40
  123. package/dependencies/lmdb-data-v1/libraries/liblmdb/mdb_drop.c +0 -135
  124. package/rollup.config.js +0 -12
package/src/txn.cpp CHANGED
@@ -1,257 +1,210 @@
1
- #include "lmdb-js.h"
2
-
3
- using namespace Napi;
4
-
5
- TxnTracked::TxnTracked(MDB_txn *txn, unsigned int flags) {
6
- this->txn = txn;
7
- this->flags = flags;
8
- parent = nullptr;
9
- }
10
-
11
- TxnTracked::~TxnTracked() {
12
- this->txn = nullptr;
13
- }
14
-
15
- TxnWrap::TxnWrap(const Napi::CallbackInfo& info) : ObjectWrap<TxnWrap>(info) {
16
- EnvWrap *ew;
17
- napi_unwrap(info.Env(), info[0], (void**)&ew);
18
- int flags = 0;
19
- TxnWrap *parentTw;
20
- if (info[1].IsBoolean() && ew->writeWorker) { // this is from a transaction callback
21
- txn = ew->writeWorker->AcquireTxn(&flags);
22
- parentTw = nullptr;
23
- } else {
24
- if (info[1].IsObject()) {
25
- Object options = info[1].As<Object>();
26
-
27
- // Get flags from options
28
-
29
- setFlagFromValue(&flags, MDB_RDONLY, "readOnly", false, options);
30
- } else if (info[1].IsNumber()) {
31
- flags = info[1].As<Number>();
32
- }
33
- MDB_txn *parentTxn;
34
- if (info[2].IsObject()) {
35
- napi_unwrap(info.Env(), info[2], (void**) &parentTw);
36
- parentTxn = parentTw->txn;
37
- } else {
38
- parentTxn = nullptr;
39
- parentTw = nullptr;
40
- // Check existence of current write transaction
41
- if (0 == (flags & MDB_RDONLY)) {
42
- if (ew->currentWriteTxn != nullptr) {
43
- throwError(info.Env(), "You have already opened a write transaction in the current process, can't open a second one.");
44
- return;
45
- }
46
- //fprintf(stderr, "begin sync txn");
47
- auto writeWorker = ew->writeWorker;
48
- if (writeWorker) {
49
- parentTxn = writeWorker->AcquireTxn(&flags); // see if we have a paused transaction
50
- // else we create a child transaction from the current batch transaction. TODO: Except in WRITEMAP mode, where we need to indicate that the transaction should not be committed
51
- }
52
- }
53
- }
54
- //fprintf(stderr, "txn_begin from txn.cpp %u %p\n", flags, parentTxn);
55
- int rc = mdb_txn_begin(ew->env, parentTxn, flags, &txn);
56
- if (rc != 0) {
57
- txn = nullptr;
58
- if (rc == EINVAL) {
59
- throwError(info.Env(), "Invalid parameter, which on MacOS is often due to more transactions than available robust locked semaphors (see docs for more info)");
60
- return;
61
- }
62
- throwLmdbError(info.Env(), rc);
63
- return;
64
- }
65
- }
66
-
67
- // Set the current write transaction
68
- if (0 == (flags & MDB_RDONLY)) {
69
- ew->currentWriteTxn = this;
70
- }
71
- else {
72
- ew->readTxns.push_back(this);
73
- ew->currentReadTxn = txn;
74
- }
75
- this->parentTw = parentTw;
76
- this->flags = flags;
77
- this->ew = ew;
78
- this->env = ew->env;
79
- info.This().As<Object>().Set("address", Number::New(info.Env(), (size_t) this));
80
- }
81
-
82
- TxnWrap::~TxnWrap() {
83
- // Close if not closed already
84
- if (this->txn) {
85
- mdb_txn_abort(txn);
86
- this->removeFromEnvWrap();
87
- }
88
- }
89
-
90
- void TxnWrap::removeFromEnvWrap() {
91
- if (this->ew) {
92
- if (this->ew->currentWriteTxn == this) {
93
- this->ew->currentWriteTxn = this->parentTw;
94
- }
95
- else {
96
- auto it = std::find(ew->readTxns.begin(), ew->readTxns.end(), this);
97
- if (it != ew->readTxns.end()) {
98
- ew->readTxns.erase(it);
99
- }
100
- }
101
- this->ew = nullptr;
102
- }
103
- this->txn = nullptr;
104
- }
105
-
106
- int TxnWrap::begin(EnvWrap *ew, unsigned int flags) {
107
- this->ew = ew;
108
- this->flags = flags;
109
- MDB_env *env = ew->env;
110
- unsigned int envFlags;
111
- mdb_env_get_flags(env, &envFlags);
112
- if (flags & MDB_RDONLY) {
113
- mdb_txn_begin(env, nullptr, flags & 0xf0000, &this->txn);
114
- } else {
115
- //fprintf(stderr, "begin sync txn %i\n", flags);
116
-
117
- if (ew->writeTxn)
118
- txn = ew->writeTxn->txn;
119
- else if (ew->writeWorker) {
120
- // try to acquire the txn from the current batch
121
- txn = ew->writeWorker->AcquireTxn((int*) &flags);
122
- //fprintf(stderr, "acquired %p %p %p\n", ew->writeWorker, txn, flags);
123
- } else {
124
- pthread_mutex_lock(ew->writingLock);
125
- txn = nullptr;
126
- }
127
-
128
- if (txn) {
129
- if (flags & TXN_ABORTABLE) {
130
- if (envFlags & MDB_WRITEMAP)
131
- flags &= ~TXN_ABORTABLE;
132
- else {
133
- // child txn
134
- mdb_txn_begin(env, this->txn, flags & 0xf0000, &this->txn);
135
- TxnTracked* childTxn = new TxnTracked(txn, flags);
136
- childTxn->parent = ew->writeTxn;
137
- ew->writeTxn = childTxn;
138
- return 0;
139
- }
140
- }
141
- } else {
142
- mdb_txn_begin(env, nullptr, flags & 0xf0000, &this->txn);
143
- flags |= TXN_ABORTABLE;
144
- }
145
- ew->writeTxn = new TxnTracked(txn, flags);
146
- return 0;
147
- }
148
- // Set the current write transaction
149
- if (0 == (flags & MDB_RDONLY)) {
150
- ew->currentWriteTxn = this;
151
- }
152
- else {
153
- ew->readTxns.push_back(this);
154
- ew->currentReadTxn = txn;
155
- ew->readTxnRenewed = true;
156
- }
157
- return 0;
158
- }
159
- Value TxnWrap::commit(const Napi::CallbackInfo& info) {
160
- if (!this->txn) {
161
- return throwError(info.Env(), "The transaction is already closed.");
162
- }
163
- int rc;
164
- WriteWorker* writeWorker = this->ew->writeWorker;
165
- if (writeWorker) {
166
- // if (writeWorker->txn && env->writeMap)
167
- // rc = 0
168
- // else
169
- rc = mdb_txn_commit(this->txn);
170
-
171
- pthread_mutex_unlock(this->ew->writingLock);
172
- }
173
- else
174
- rc = mdb_txn_commit(this->txn);
175
- //fprintf(stdout, "commit done\n");
176
- this->removeFromEnvWrap();
177
-
178
- if (rc != 0) {
179
- return throwLmdbError(info.Env(), rc);
180
- }
181
- return info.Env().Undefined();
182
- }
183
-
184
- Value TxnWrap::abort(const Napi::CallbackInfo& info) {
185
- if (!this->txn) {
186
- return throwError(info.Env(), "The transaction is already closed.");
187
- }
188
-
189
- mdb_txn_abort(this->txn);
190
- this->removeFromEnvWrap();
191
- return info.Env().Undefined();
192
- }
193
- NAPI_FUNCTION(resetTxn) {
194
- ARGS(1)
195
- GET_INT64_ARG(0);
196
- TxnWrap* tw = (TxnWrap*) i64;
197
- if (!tw->txn) {
198
- THROW_ERROR("The transaction is already closed.");
199
- }
200
- tw->reset();
201
- RETURN_UNDEFINED;
202
- }
203
- void resetTxnFFI(double twPointer) {
204
- TxnWrap* tw = (TxnWrap*) (size_t) twPointer;
205
- tw->reset();
206
- }
207
-
208
- void TxnWrap::reset() {
209
- ew->readTxnRenewed = false;
210
- mdb_txn_reset(txn);
211
- }
212
- Value TxnWrap::renew(const Napi::CallbackInfo& info) {
213
- if (!this->txn) {
214
- return throwError(info.Env(), "The transaction is already closed.");
215
- }
216
-
217
- int rc = mdb_txn_renew(this->txn);
218
- if (rc != 0) {
219
- return throwLmdbError(info.Env(), rc);
220
- }
221
- return info.Env().Undefined();
222
- }
223
- void TxnWrap::setupExports(Napi::Env env, Object exports) {
224
- // TxnWrap: Prepare constructor template
225
- Function TxnClass = DefineClass(env, "Txn", {
226
- // TxnWrap: Add functions to the prototype
227
- TxnWrap::InstanceMethod("commit", &TxnWrap::commit),
228
- TxnWrap::InstanceMethod("abort", &TxnWrap::abort),
229
- TxnWrap::InstanceMethod("renew", &TxnWrap::renew),
230
- });
231
- exports.Set("Txn", TxnClass);
232
- EXPORT_NAPI_FUNCTION("resetTxn", resetTxn);
233
- EXPORT_FUNCTION_ADDRESS("resetTxnPtr", resetTxnFFI);
234
- //txnTpl->InstanceTemplate()->SetInternalFieldCount(1);
235
- }
236
- // This file contains code from the node-lmdb project
237
- // Copyright (c) 2013-2017 Timur Kristóf
238
- // Copyright (c) 2021 Kristopher Tate
239
- // Licensed to you under the terms of the MIT license
240
- //
241
- // Permission is hereby granted, free of charge, to any person obtaining a copy
242
- // of this software and associated documentation files (the "Software"), to deal
243
- // in the Software without restriction, including without limitation the rights
244
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
245
- // copies of the Software, and to permit persons to whom the Software is
246
- // furnished to do so, subject to the following conditions:
247
-
248
- // The above copyright notice and this permission notice shall be included in
249
- // all copies or substantial portions of the Software.
250
-
251
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
252
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
253
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
254
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
255
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
256
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
257
- // THE SOFTWARE.
1
+ #include "lmdb-js.h"
2
+
3
+ using namespace Napi;
4
+
5
+ TxnTracked::TxnTracked(MDB_txn *txn, unsigned int flags) {
6
+ this->txn = txn;
7
+ this->flags = flags;
8
+ parent = nullptr;
9
+ }
10
+
11
+ TxnTracked::~TxnTracked() {
12
+ this->txn = nullptr;
13
+ }
14
+
15
+ TxnWrap::TxnWrap(const Napi::CallbackInfo& info) : ObjectWrap<TxnWrap>(info) {
16
+ EnvWrap *ew;
17
+ napi_unwrap(info.Env(), info[0], (void**)&ew);
18
+ if (ew->env == nullptr) throwError(info.Env(), "Attempt to start a transaction on a database environment that is closed");
19
+ int flags = 0;
20
+ TxnWrap *parentTw;
21
+ if (info[1].IsBoolean() && ew->writeWorker) { // this is from a transaction callback
22
+ txn = ew->writeWorker->AcquireTxn(&flags);
23
+ parentTw = nullptr;
24
+ } else {
25
+ if (info[1].IsObject()) {
26
+ Object options = info[1].As<Object>();
27
+
28
+ // Get flags from options
29
+
30
+ setFlagFromValue(&flags, MDB_RDONLY, "readOnly", false, options);
31
+ } else if (info[1].IsNumber()) {
32
+ flags = info[1].As<Number>();
33
+ }
34
+ MDB_txn *parentTxn;
35
+ if (info[2].IsObject()) {
36
+ napi_unwrap(info.Env(), info[2], (void**) &parentTw);
37
+ parentTxn = parentTw->txn;
38
+ } else {
39
+ parentTxn = nullptr;
40
+ parentTw = nullptr;
41
+ // Check existence of current write transaction
42
+ if (0 == (flags & MDB_RDONLY)) {
43
+ if (ew->currentWriteTxn != nullptr) {
44
+ throwError(info.Env(), "You have already opened a write transaction in the current process, can't open a second one.");
45
+ return;
46
+ }
47
+ //fprintf(stderr, "begin sync txn");
48
+ auto writeWorker = ew->writeWorker;
49
+ if (writeWorker) {
50
+ parentTxn = writeWorker->AcquireTxn(&flags); // see if we have a paused transaction
51
+ // else we create a child transaction from the current batch transaction. TODO: Except in WRITEMAP mode, where we need to indicate that the transaction should not be committed
52
+ }
53
+ }
54
+ }
55
+ //fprintf(stderr, "txn_begin from txn.cpp %u %p\n", flags, parentTxn);
56
+ if ((flags & MDB_RDONLY) && parentTxn) {
57
+ // if a txn is passed in, we check to see if it is up-to-date and can be reused
58
+ MDB_envinfo stat;
59
+ mdb_env_info(ew->env, &stat);
60
+ if (mdb_txn_id(parentTxn) == stat.me_last_txnid) {
61
+ txn = nullptr;
62
+ info.This().As<Object>().Set("address", Number::New(info.Env(), 0));
63
+ return;
64
+ }
65
+ parentTxn = nullptr;
66
+ }
67
+ int rc = mdb_txn_begin(ew->env, parentTxn, flags, &txn);
68
+ if (rc == MDB_READERS_FULL) { // try again after reader check, in case a dead process frees a slot
69
+ int dead;
70
+ mdb_reader_check(ew->env, &dead);
71
+ ew->consolidateTxns();
72
+ rc = mdb_txn_begin(ew->env, parentTxn, flags, &txn);
73
+ }
74
+ if (rc != 0) {
75
+ txn = nullptr;
76
+ throwLmdbError(info.Env(), rc);
77
+ return;
78
+ }
79
+ }
80
+
81
+ // Set the current write transaction
82
+ if (0 == (flags & MDB_RDONLY)) {
83
+ ew->currentWriteTxn = this;
84
+ }
85
+ else {
86
+ ew->readTxns.push_back(this);
87
+ ew->currentReadTxn = txn;
88
+ }
89
+ this->parentTw = parentTw;
90
+ this->flags = flags;
91
+ this->ew = ew;
92
+ this->env = ew->env;
93
+ info.This().As<Object>().Set("address", Number::New(info.Env(), (size_t) this));
94
+ }
95
+
96
+ TxnWrap::~TxnWrap() {
97
+ // Close if not closed already
98
+ if (this->txn) {
99
+ mdb_txn_abort(txn);
100
+ this->removeFromEnvWrap();
101
+ }
102
+ }
103
+
104
+ void TxnWrap::removeFromEnvWrap() {
105
+ if (this->ew) {
106
+ if (this->ew->currentWriteTxn == this) {
107
+ this->ew->currentWriteTxn = this->parentTw;
108
+ }
109
+ else {
110
+ auto it = std::find(ew->readTxns.begin(), ew->readTxns.end(), this);
111
+ if (it != ew->readTxns.end()) {
112
+ ew->readTxns.erase(it);
113
+ }
114
+ }
115
+ this->ew = nullptr;
116
+ }
117
+ this->txn = nullptr;
118
+ }
119
+
120
+ Value TxnWrap::commit(const Napi::CallbackInfo& info) {
121
+ // this should only be used for committing read-only txns
122
+ if (!this->txn) {
123
+ return throwError(info.Env(), "The transaction is already closed.");
124
+ }
125
+ int rc = mdb_txn_commit(this->txn);
126
+ this->removeFromEnvWrap();
127
+ if (rc != 0) {
128
+ return throwLmdbError(info.Env(), rc);
129
+ }
130
+ return info.Env().Undefined();
131
+ }
132
+
133
+ Value TxnWrap::abort(const Napi::CallbackInfo& info) {
134
+ if (!this->txn) {
135
+ return throwError(info.Env(), "The transaction is already closed.");
136
+ }
137
+
138
+ mdb_txn_abort(this->txn);
139
+ this->removeFromEnvWrap();
140
+ return info.Env().Undefined();
141
+ }
142
+ NAPI_FUNCTION(resetTxn) {
143
+ ARGS(1)
144
+ GET_INT64_ARG(0);
145
+ TxnWrap* tw = (TxnWrap*) i64;
146
+ if (!tw->txn || !tw->getEnv()) {
147
+ THROW_ERROR("The transaction is already closed.");
148
+ } else {
149
+ tw->reset();
150
+ RETURN_UNDEFINED;
151
+ }
152
+ }
153
+ void resetTxnFFI(double twPointer) {
154
+ TxnWrap* tw = (TxnWrap*) (size_t) twPointer;
155
+ if (tw->txn && tw->getEnv()) tw->reset();
156
+ }
157
+
158
+ void TxnWrap::reset() {
159
+ ew->readTxnRenewed = false;
160
+ mdb_txn_reset(txn);
161
+ }
162
+ Value TxnWrap::renew(const Napi::CallbackInfo& info) {
163
+ if (!this->txn || !this->ew->env) {
164
+ return throwError(info.Env(), "The transaction is already closed.");
165
+ }
166
+
167
+ int rc = mdb_txn_renew(this->txn);
168
+ if (rc != 0) {
169
+ return throwLmdbError(info.Env(), rc);
170
+ }
171
+ return info.Env().Undefined();
172
+ }
173
+ MDB_env* TxnWrap::getEnv() {
174
+ return this->ew->env;
175
+ }
176
+ void TxnWrap::setupExports(Napi::Env env, Object exports) {
177
+ // TxnWrap: Prepare constructor template
178
+ Function TxnClass = DefineClass(env, "Txn", {
179
+ // TxnWrap: Add functions to the prototype
180
+ TxnWrap::InstanceMethod("commit", &TxnWrap::commit),
181
+ TxnWrap::InstanceMethod("abort", &TxnWrap::abort),
182
+ TxnWrap::InstanceMethod("renew", &TxnWrap::renew),
183
+ });
184
+ exports.Set("Txn", TxnClass);
185
+ EXPORT_NAPI_FUNCTION("resetTxn", resetTxn);
186
+ EXPORT_FUNCTION_ADDRESS("resetTxnPtr", resetTxnFFI);
187
+ //txnTpl->InstanceTemplate()->SetInternalFieldCount(1);
188
+ }
189
+ // This file contains code from the node-lmdb project
190
+ // Copyright (c) 2013-2017 Timur Kristóf
191
+ // Copyright (c) 2021 Kristopher Tate
192
+ // Licensed to you under the terms of the MIT license
193
+ //
194
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
195
+ // of this software and associated documentation files (the "Software"), to deal
196
+ // in the Software without restriction, including without limitation the rights
197
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
198
+ // copies of the Software, and to permit persons to whom the Software is
199
+ // furnished to do so, subject to the following conditions:
200
+
201
+ // The above copyright notice and this permission notice shall be included in
202
+ // all copies or substantial portions of the Software.
203
+
204
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
205
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
206
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
207
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
208
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
209
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
210
+ // THE SOFTWARE.