harperdb 3.2.0 → 3.3.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.
- package/README.md +20 -11
- package/bin/BinObjects.jsc +0 -0
- package/bin/harperdb.jsc +0 -0
- package/bin/install.jsc +0 -0
- package/bin/register.jsc +0 -0
- package/bin/run.jsc +0 -0
- package/bin/stop.jsc +0 -0
- package/bin/upgrade.jsc +0 -0
- package/bin/utility.jsc +0 -0
- package/bin/version.jsc +0 -0
- package/coverage/lcov.info +6624 -6141
- package/data_layer/CreateAttributeObject.jsc +0 -0
- package/data_layer/CreateTableObject.jsc +0 -0
- package/data_layer/DataLayerObjects.jsc +0 -0
- package/data_layer/DeleteBeforeObject.jsc +0 -0
- package/data_layer/DeleteObject.jsc +0 -0
- package/data_layer/DropAttributeObject.jsc +0 -0
- package/data_layer/InsertObject.jsc +0 -0
- package/data_layer/ReadTransactionLogObject.jsc +0 -0
- package/data_layer/SQLSearch.jsc +0 -0
- package/data_layer/SearchByConditionsObject.jsc +0 -0
- package/data_layer/SearchByHashObject.jsc +0 -0
- package/data_layer/SearchObject.jsc +0 -0
- package/data_layer/SqlSearchObject.jsc +0 -0
- package/data_layer/UpdateObject.jsc +0 -0
- package/data_layer/UpsertObject.jsc +0 -0
- package/data_layer/bulkLoad.jsc +0 -0
- package/data_layer/data_objects/BulkLoadObjects.jsc +0 -0
- package/data_layer/data_objects/UpsertObject.jsc +0 -0
- package/data_layer/delete.jsc +0 -0
- package/data_layer/export.jsc +0 -0
- package/data_layer/harperBridge/BridgeMethods.jsc +0 -0
- package/data_layer/harperBridge/bridgeUtility/checkForNewAttr.jsc +0 -0
- package/data_layer/harperBridge/bridgeUtility/convertOperationToTransaction.jsc +0 -0
- package/data_layer/harperBridge/bridgeUtility/evaluateTableGetAttributes.jsc +0 -0
- package/data_layer/harperBridge/bridgeUtility/insertUpdateReturnObj.jsc +0 -0
- package/data_layer/harperBridge/bridgeUtility/insertUpdateValidate.jsc +0 -0
- package/data_layer/harperBridge/harperBridge.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/LMDBBridge.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/DeleteTransactionsBeforeResults.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecordsBefore.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteTransactionLogsBefore.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadTransactionLog.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/ThreadSearchObject.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsEnvironment.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbDropAllAttributes.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbThreadSearch.jsc +0 -0
- package/data_layer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.jsc +0 -0
- package/data_layer/hdbInfoController.jsc +0 -0
- package/data_layer/insert.jsc +0 -0
- package/data_layer/readTransactionLog.jsc +0 -0
- package/data_layer/schema.jsc +0 -0
- package/data_layer/schemaDescribe.jsc +0 -0
- package/data_layer/search.jsc +0 -0
- package/data_layer/update.jsc +0 -0
- package/events/ClusterStatusEmitter.jsc +0 -0
- package/events/SioServerStoppedEvent.jsc +0 -0
- package/events/SocketClusterStatusEmitter.jsc +0 -0
- package/license/LICENSE +91 -1
- package/node_modules/@msgpackr-extract/msgpackr-extract-linux-x64/README.md +1 -0
- package/node_modules/{node-addon-api/src/nothing.c → @msgpackr-extract/msgpackr-extract-linux-x64/index.js} +0 -0
- package/node_modules/@msgpackr-extract/msgpackr-extract-linux-x64/node.abi93.glibc.node +0 -0
- package/node_modules/@msgpackr-extract/msgpackr-extract-linux-x64/node.abi93.musl.node +0 -0
- package/node_modules/@msgpackr-extract/msgpackr-extract-linux-x64/node.napi.glibc.node +0 -0
- package/node_modules/@msgpackr-extract/msgpackr-extract-linux-x64/node.napi.musl.node +0 -0
- package/node_modules/@msgpackr-extract/msgpackr-extract-linux-x64/package.json +53 -0
- package/node_modules/{msgpackr-extract → lmdb-store}/.github/workflows/prebuild.yml +9 -10
- package/node_modules/lmdb-store/.idea/lmdb-store.iml +12 -0
- package/node_modules/lmdb-store/.idea/misc.xml +6 -0
- package/node_modules/lmdb-store/.idea/modules.xml +8 -0
- package/node_modules/lmdb-store/.idea/workspace.xml +4 -0
- package/node_modules/lmdb-store/README.md +393 -388
- package/node_modules/lmdb-store/benchmark/index.js +162 -162
- package/node_modules/lmdb-store/binding.gyp +79 -88
- package/node_modules/lmdb-store/caching.js +113 -113
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/COPYRIGHT +20 -20
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/Doxyfile +1631 -1631
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/LICENSE +47 -47
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/chacha8.c +183 -183
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/chacha8.h +14 -14
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/crypto.c +121 -121
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/intro.doc +192 -192
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb.c +12125 -12125
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_copy.1 +74 -74
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_copy.c +106 -106
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_drop.1 +53 -53
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_drop.c +154 -154
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_dump.1 +94 -94
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_dump.c +333 -333
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_load.1 +97 -97
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_load.c +530 -530
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_stat.1 +83 -83
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb_stat.c +276 -276
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/midl.c +452 -452
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/midl.h +208 -208
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/module.c +101 -101
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/module.h +16 -16
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest.c +178 -178
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest2.c +124 -124
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest3.c +133 -133
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest4.c +168 -168
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest5.c +135 -135
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest6.c +141 -141
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest_enc.c +190 -190
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest_enc2.c +189 -189
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/mtest_remap.c +177 -177
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/sample-bdb.txt +73 -73
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/sample-mdb.txt +62 -62
- package/node_modules/lmdb-store/dependencies/lmdb/libraries/liblmdb/tooltag +27 -27
- package/node_modules/lmdb-store/dependencies/lz4/LICENSE +11 -11
- package/node_modules/lmdb-store/dependencies/lz4/lib/README.md +137 -137
- package/node_modules/lmdb-store/dependencies/lz4/lib/dll/example/README.md +69 -69
- package/node_modules/lmdb-store/dependencies/lz4/lib/lz4frame.c +1899 -1899
- package/node_modules/lmdb-store/dependencies/lz4/lib/xxhash.c +1030 -1030
- package/node_modules/lmdb-store/dependencies/lz4/lib/xxhash.h +328 -328
- package/node_modules/lmdb-store/dist/index.cjs +2591 -0
- package/node_modules/lmdb-store/dist/index.cjs.map +1 -0
- package/node_modules/lmdb-store/index.d.ts +323 -323
- package/node_modules/lmdb-store/index.js +1274 -1274
- package/node_modules/lmdb-store/index.mjs +3 -3
- package/node_modules/lmdb-store/package.json +16 -11
- package/node_modules/lmdb-store/prebuilds/darwin-arm64/electron.abi98.node +0 -0
- package/node_modules/lmdb-store/prebuilds/darwin-arm64/node.abi83.node +0 -0
- package/node_modules/lmdb-store/prebuilds/darwin-arm64/node.abi93.node +0 -0
- package/node_modules/lmdb-store/prebuilds/darwin-x64/electron.abi98.node +0 -0
- package/node_modules/lmdb-store/prebuilds/darwin-x64/node.abi83.node +0 -0
- package/node_modules/lmdb-store/prebuilds/darwin-x64/node.abi93.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-arm64/electron.abi98.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-arm64/node.abi83.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-arm64/node.abi93.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-x64/electron.abi98.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-x64/node.abi83.musl.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-x64/node.abi83.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-x64/node.abi93.musl.node +0 -0
- package/node_modules/lmdb-store/prebuilds/linux-x64/node.abi93.node +0 -0
- package/node_modules/lmdb-store/prebuilds/win32-x64/electron.abi98.node +0 -0
- package/node_modules/lmdb-store/prebuilds/win32-x64/node.abi83.node +0 -0
- package/node_modules/lmdb-store/prebuilds/win32-x64/node.abi93.node +0 -0
- package/node_modules/lmdb-store/src/compression.cpp +181 -181
- package/node_modules/lmdb-store/src/cursor.cpp +407 -407
- package/node_modules/lmdb-store/src/dbi.cpp +354 -354
- package/node_modules/lmdb-store/src/env.cpp +1134 -1134
- package/node_modules/lmdb-store/src/misc.cpp +528 -528
- package/node_modules/lmdb-store/src/node-lmdb.cpp +44 -44
- package/node_modules/lmdb-store/src/node-lmdb.h +965 -965
- package/node_modules/lmdb-store/src/ordered-binary.cpp +337 -337
- package/node_modules/lmdb-store/src/txn.cpp +513 -513
- package/node_modules/lmdb-store/src/v8-fast-api-calls.h +419 -419
- package/node_modules/lmdb-store/src/windows.c +30 -30
- package/node_modules/lmdb-store/test/index.test.js +584 -584
- package/node_modules/lmdb-store/test/node-lmdb.test.js +1525 -1525
- package/node_modules/lmdb-store/test/threads.js +100 -100
- package/node_modules/lmdb-store/util/ArrayLikeIterable.js +136 -136
- package/node_modules/lmdb-store/util/WeakValueMap.js +40 -40
- package/node_modules/lmdb-store/util/upgrade-lmdb.js +46 -46
- package/node_modules/lmdb-store/util/when.js +8 -8
- package/node_modules/microtime/.github/workflows/release.yml +76 -0
- package/node_modules/microtime/.github/workflows/test.yml +46 -0
- package/node_modules/microtime/README.md +0 -2
- package/node_modules/microtime/binding.gyp +28 -10
- package/node_modules/microtime/package.json +25 -20
- package/node_modules/microtime/prebuilds/darwin-x64+arm64/electron.napi.node +0 -0
- package/node_modules/microtime/prebuilds/darwin-x64+arm64/node.napi.node +0 -0
- package/node_modules/microtime/prebuilds/linux-arm/node.napi.armv7.node +0 -0
- package/node_modules/microtime/prebuilds/linux-arm64/node.napi.armv8.node +0 -0
- package/node_modules/microtime/prebuilds/linux-x64/electron.napi.node +0 -0
- package/node_modules/microtime/prebuilds/linux-x64/node.napi.node +0 -0
- package/node_modules/microtime/prebuilds/win32-ia32/electron.napi.node +0 -0
- package/node_modules/microtime/prebuilds/win32-ia32/node.napi.node +0 -0
- package/node_modules/microtime/prebuilds/win32-x64/electron.napi.node +0 -0
- package/node_modules/microtime/prebuilds/win32-x64/node.napi.node +0 -0
- package/node_modules/msgpackr/dist/index.js +1929 -1917
- package/node_modules/msgpackr/dist/index.min.js +67 -68
- package/node_modules/msgpackr/dist/node.cjs +1994 -1980
- package/node_modules/msgpackr/dist/test.js +683 -1235
- package/node_modules/msgpackr/index.d.ts +23 -12
- package/node_modules/msgpackr/node-index.js +23 -21
- package/node_modules/msgpackr/pack.js +935 -931
- package/node_modules/msgpackr/package.json +24 -12
- package/node_modules/msgpackr/unpack.d.ts +52 -50
- package/node_modules/msgpackr/unpack.js +1061 -1053
- package/node_modules/msgpackr-extract/bin/download-prebuilds.js +11 -0
- package/node_modules/msgpackr-extract/binding.gyp +22 -5
- package/node_modules/msgpackr-extract/index.js +1 -1
- package/node_modules/msgpackr-extract/package.json +46 -21
- package/node_modules/msgpackr-extract/src/.vs/ProjectSettings.json +3 -0
- package/node_modules/msgpackr-extract/src/.vs/VSWorkspaceState.json +7 -0
- package/node_modules/msgpackr-extract/src/.vs/slnx.sqlite +0 -0
- package/node_modules/msgpackr-extract/src/.vs/src/v16/.suo +0 -0
- package/node_modules/msgpackr-extract/src/.vs/src/v16/Browse.VC.db +0 -0
- package/node_modules/msgpackr-extract/{prebuilds/darwin-x64/node.abi72.node → src/.vs/src/v16/Browse.VC.db-shm} +0 -0
- package/node_modules/msgpackr-extract/src/.vs/src/v16/Browse.VC.db-wal +0 -0
- package/node_modules/msgpackr-extract/src/extract.cpp +272 -269
- package/node_modules/nan/package.json +0 -1
- package/node_modules/node-addon-api/README.md +146 -53
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +7 -41
- package/node_modules/node-addon-api/napi-inl.deprecated.h +8 -8
- package/node_modules/node-addon-api/napi-inl.h +2795 -633
- package/node_modules/node-addon-api/napi.h +1547 -597
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +203 -13
- package/node_modules/node-addon-api/tools/README.md +12 -6
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +4 -8
- package/node_modules/node-addon-api/tools/eslint-format.js +71 -0
- package/node_modules/node-gyp-build/README.md +17 -14
- package/node_modules/node-gyp-build/bin.js +28 -15
- package/node_modules/node-gyp-build/index.js +145 -34
- package/node_modules/node-gyp-build/package.json +18 -15
- package/node_modules/{lmdb-store/node_modules/node-gyp-build → node-gyp-build-optional-packages}/LICENSE +0 -0
- package/node_modules/{lmdb-store/node_modules/node-gyp-build → node-gyp-build-optional-packages}/README.md +0 -0
- package/node_modules/{lmdb-store/node_modules/node-gyp-build → node-gyp-build-optional-packages}/bin.js +1 -1
- package/node_modules/{lmdb-store/node_modules/node-gyp-build → node-gyp-build-optional-packages}/build-test.js +0 -0
- package/node_modules/{lmdb-store/node_modules/node-gyp-build → node-gyp-build-optional-packages}/index.js +17 -11
- package/node_modules/{lmdb-store/node_modules/node-gyp-build → node-gyp-build-optional-packages}/optional.js +0 -0
- package/node_modules/{msgpackr-extract/node_modules/node-gyp-build → node-gyp-build-optional-packages}/package.json +17 -17
- package/package.json +12 -11
- package/security/JWTObjects.jsc +0 -0
- package/security/auth.jsc +0 -0
- package/security/cryptoHash.jsc +0 -0
- package/security/data_objects/PermissionAttributeResponseObject.jsc +0 -0
- package/security/data_objects/PermissionResponseObject.jsc +0 -0
- package/security/data_objects/PermissionTableResponseObject.jsc +0 -0
- package/security/permissionsTranslator.jsc +0 -0
- package/security/role.jsc +0 -0
- package/security/tokenAuthentication.jsc +0 -0
- package/security/user.jsc +0 -0
- package/server/ClusteringOriginObject.jsc +0 -0
- package/server/JobObject.jsc +0 -0
- package/server/clustering/ClusterStatusObject.jsc +0 -0
- package/server/clustering/NodeObject.jsc +0 -0
- package/server/clustering/clusterUtilities.jsc +0 -0
- package/server/configuration.jsc +0 -0
- package/server/customFunctions/customFunctionsServer.jsc +0 -0
- package/server/customFunctions/helpers/getCORSOptions.jsc +0 -0
- package/server/customFunctions/helpers/getHeaderTimeoutConfig.jsc +0 -0
- package/server/customFunctions/helpers/getServerOptions.jsc +0 -0
- package/server/customFunctions/operations.jsc +0 -0
- package/server/customFunctions/operationsValidation.jsc +0 -0
- package/server/harperdb/hdbServer.jsc +0 -0
- package/server/ipc/IPCClient.jsc +0 -0
- package/server/ipc/hdbIpcServer.jsc +0 -0
- package/server/ipc/serverHandlers.jsc +0 -0
- package/server/ipc/utility/IPCEventObject.jsc +0 -0
- package/server/ipc/utility/ipcUtils.jsc +0 -0
- package/server/jobRunner.jsc +0 -0
- package/server/jobThread.jsc +0 -0
- package/server/jobs.jsc +0 -0
- package/server/serverHelpers/OperationFunctionObject.jsc +0 -0
- package/server/serverHelpers/requestTimePlugin.jsc +0 -0
- package/server/serverHelpers/serverHandlers.jsc +0 -0
- package/server/serverHelpers/serverUtilities.jsc +0 -0
- package/server/socketcluster/Server.jsc +0 -0
- package/server/socketcluster/broker.jsc +0 -0
- package/server/socketcluster/connector/HDBSocketConnector.jsc +0 -0
- package/server/socketcluster/connector/InterNodeSocketConnector.jsc +0 -0
- package/server/socketcluster/connector/SocketConnector.jsc +0 -0
- package/server/socketcluster/connector/spawnSCConnection.jsc +0 -0
- package/server/socketcluster/decisionMatrix/CoreDecisionMatrix.jsc +0 -0
- package/server/socketcluster/decisionMatrix/DecisionMatrixIF.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/AssignToHdbChildWorkerRule.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/CallRoomMsgHandlerRule.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/CleanDataObjectRule.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/CommandCollection.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/DummyRule.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/RulesIF.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/StripHdbHeaderRule.jsc +0 -0
- package/server/socketcluster/decisionMatrix/rules/TestRule.jsc +0 -0
- package/server/socketcluster/handlers/NodeConnectionsHandler.jsc +0 -0
- package/server/socketcluster/handlers/SCServer.jsc +0 -0
- package/server/socketcluster/handlers/ServerSocket.jsc +0 -0
- package/server/socketcluster/interNodeConnectionLauncher.jsc +0 -0
- package/server/socketcluster/messageQueue/MessageQueueIF.jsc +0 -0
- package/server/socketcluster/middleware/AuthMiddleware.jsc +0 -0
- package/server/socketcluster/middleware/ConnectionNameCheckMiddleware.jsc +0 -0
- package/server/socketcluster/middleware/GenericMiddleware.jsc +0 -0
- package/server/socketcluster/middleware/MessagePrepMiddleware.jsc +0 -0
- package/server/socketcluster/middleware/MiddlewareFactory.jsc +0 -0
- package/server/socketcluster/middleware/MiddlewareIF.jsc +0 -0
- package/server/socketcluster/middleware/OriginatorCheckMiddleware.jsc +0 -0
- package/server/socketcluster/middleware/RequestDataValidMiddleware.jsc +0 -0
- package/server/socketcluster/middleware/StampOriginatorMiddleware.jsc +0 -0
- package/server/socketcluster/middleware/StampRequestMiddleware.jsc +0 -0
- package/server/socketcluster/observer/EventableIF.jsc +0 -0
- package/server/socketcluster/room/AddUserRoom.jsc +0 -0
- package/server/socketcluster/room/AlterUserRoom.jsc +0 -0
- package/server/socketcluster/room/CoreRoom.jsc +0 -0
- package/server/socketcluster/room/CreateAttributeRoom.jsc +0 -0
- package/server/socketcluster/room/CreateSchemaRoom.jsc +0 -0
- package/server/socketcluster/room/CreateTableRoom.jsc +0 -0
- package/server/socketcluster/room/DropUserRoom.jsc +0 -0
- package/server/socketcluster/room/HDBNodeRoom.jsc +0 -0
- package/server/socketcluster/room/RoomIF.jsc +0 -0
- package/server/socketcluster/room/RoomMessageObjects.jsc +0 -0
- package/server/socketcluster/room/UsersRoom.jsc +0 -0
- package/server/socketcluster/room/WatchHDBWorkersRoom.jsc +0 -0
- package/server/socketcluster/room/WorkerRoom.jsc +0 -0
- package/server/socketcluster/room/roomFactory.jsc +0 -0
- package/server/socketcluster/socketClusterObjects.jsc +0 -0
- package/server/socketcluster/types.jsc +0 -0
- package/server/socketcluster/util/clusterData.jsc +0 -0
- package/server/socketcluster/util/socketClusterUtils.jsc +0 -0
- package/server/socketcluster/worker/ClusterWorker.jsc +0 -0
- package/server/socketcluster/worker/WorkerIF.jsc +0 -0
- package/server/socketcluster/worker/WorkerObjects.jsc +0 -0
- package/server/transactToClusteringUtilities.jsc +0 -0
- package/sqlTranslator/SelectValidator.jsc +0 -0
- package/sqlTranslator/alasqlFunctionImporter.jsc +0 -0
- package/sqlTranslator/conditionPatterns.jsc +0 -0
- package/sqlTranslator/deleteTranslator.jsc +0 -0
- package/sqlTranslator/index.jsc +0 -0
- package/sqlTranslator/sql_statement_bucket.jsc +0 -0
- package/upgrade/EnvironmentVariable.jsc +0 -0
- package/upgrade/UpgradeDirective.jsc +0 -0
- package/upgrade/UpgradeObjects.jsc +0 -0
- package/upgrade/directives/3-0-0.jsc +0 -0
- package/upgrade/directives/3-1-0.jsc +0 -0
- package/upgrade/directives/directivesController.jsc +0 -0
- package/upgrade/directives/upgrade_scripts/3_0_0_reindex_script.jsc +0 -0
- package/upgrade/directivesManager.jsc +0 -0
- package/upgrade/lmdb/nodeLMDB/DBIDefinition.jsc +0 -0
- package/upgrade/lmdb/nodeLMDB/OpenDBIObject.jsc +0 -0
- package/upgrade/lmdb/nodeLMDB/OpenEnvironmentObject.jsc +0 -0
- package/upgrade/lmdb/nodeLMDB/commonErrors.jsc +0 -0
- package/upgrade/lmdb/nodeLMDB/commonUtility.jsc +0 -0
- package/upgrade/lmdb/nodeLMDB/environmentUtility.jsc +0 -0
- package/upgrade/lmdb/nodeLMDB/terms.jsc +0 -0
- package/upgrade/upgradePrompt.jsc +0 -0
- package/upgrade/upgradeUtilities.jsc +0 -0
- package/utility/AWS/AWSConnector.jsc +0 -0
- package/utility/OperationFunctionCaller.jsc +0 -0
- package/utility/common_utils.jsc +0 -0
- package/utility/environment/SystemInformationObject.jsc +0 -0
- package/utility/environment/SystemInformationOperation.jsc +0 -0
- package/utility/environment/environmentManager.jsc +0 -0
- package/utility/environment/systemInformation.jsc +0 -0
- package/utility/errors/commonErrors.jsc +0 -0
- package/utility/errors/hdbError.jsc +0 -0
- package/utility/functions/date/dateFunctions.jsc +0 -0
- package/utility/functions/geo.jsc +0 -0
- package/utility/functions/math/avg.jsc +0 -0
- package/utility/functions/math/count.jsc +0 -0
- package/utility/functions/sql/alaSQLExtension.jsc +0 -0
- package/utility/functions/string/compare.jsc +0 -0
- package/utility/globalSchema.jsc +0 -0
- package/utility/hdbTerms.jsc +0 -0
- package/utility/install/checkJWTTokensExist.jsc +0 -0
- package/utility/install/installer.jsc +0 -0
- package/utility/install_user_permission.jsc +0 -0
- package/utility/lmdb/DBIDefinition.jsc +0 -0
- package/utility/lmdb/DeleteRecordsResponseObject.jsc +0 -0
- package/utility/lmdb/InsertRecordsResponseObject.jsc +0 -0
- package/utility/lmdb/OpenDBIObject.jsc +0 -0
- package/utility/lmdb/OpenEnvironmentObject.jsc +0 -0
- package/utility/lmdb/UpdateRecordsResponseObject.jsc +0 -0
- package/utility/lmdb/UpsertRecordsResponseObject.jsc +0 -0
- package/utility/lmdb/cleanLMDBMap.jsc +0 -0
- package/utility/lmdb/commonUtility.jsc +0 -0
- package/utility/lmdb/deleteUtility.jsc +0 -0
- package/utility/lmdb/environmentUtility.jsc +0 -0
- package/utility/lmdb/searchCursorFunctions.jsc +0 -0
- package/utility/lmdb/searchUtility.jsc +0 -0
- package/utility/lmdb/terms.jsc +0 -0
- package/utility/lmdb/writeUtility.jsc +0 -0
- package/utility/logging/harper_logger.jsc +0 -0
- package/utility/mount_hdb.jsc +0 -0
- package/utility/npmUtilities.jsc +0 -0
- package/utility/operation_authorization.jsc +0 -0
- package/utility/password.jsc +0 -0
- package/utility/pm2/servicesConfig.jsc +0 -0
- package/utility/pm2/utilityFunctions.jsc +0 -0
- package/utility/psList.jsc +0 -0
- package/utility/registration/hdb_license.jsc +0 -0
- package/utility/registration/licenseObjects.jsc +0 -0
- package/utility/registration/registrationHandler.jsc +0 -0
- package/utility/scripts/restartHdb.jsc +0 -0
- package/utility/signalling.jsc +0 -0
- package/utility/system_info.jsc +0 -0
- package/validation/bulkDeleteValidator.jsc +0 -0
- package/validation/check_permissions.jsc +0 -0
- package/validation/clustering/configureValidator.jsc +0 -0
- package/validation/common_validators.jsc +0 -0
- package/validation/conditionalDeleteValidator.jsc +0 -0
- package/validation/deleteValidator.jsc +0 -0
- package/validation/fileLoadValidator.jsc +0 -0
- package/validation/insertValidator.jsc +0 -0
- package/validation/nodeSubscriptionValidator.jsc +0 -0
- package/validation/nodeValidator.jsc +0 -0
- package/validation/readLogValidator.jsc +0 -0
- package/validation/registration/license_key_object.jsc +0 -0
- package/validation/role_validation.jsc +0 -0
- package/validation/schemaMetadataValidator.jsc +0 -0
- package/validation/schema_validator.jsc +0 -0
- package/validation/searchValidator.jsc +0 -0
- package/validation/user_validation.jsc +0 -0
- package/validation/validationWrapper.jsc +0 -0
- package/node_modules/lmdb-store/build/Makefile +0 -324
- package/node_modules/lmdb-store/build/Release/.deps/Release/lmdb-store.node.d +0 -1
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/dependencies/lmdb/libraries/liblmdb/chacha8.o.d +0 -6
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb.o.d +0 -8
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/dependencies/lmdb/libraries/liblmdb/midl.o.d +0 -8
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/dependencies/lz4/lib/lz4.o.d +0 -5
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/compression.o.d +0 -72
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/cursor.o.d +0 -73
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/dbi.o.d +0 -73
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/env.o.d +0 -73
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/misc.o.d +0 -73
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/node-lmdb.o.d +0 -73
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/ordered-binary.o.d +0 -73
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/txn.o.d +0 -73
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store/src/windows.o.d +0 -3
- package/node_modules/lmdb-store/build/Release/.deps/Release/obj.target/lmdb-store.node.d +0 -1
- package/node_modules/lmdb-store/build/Release/lmdb-store.node +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/dependencies/lmdb/libraries/liblmdb/chacha8.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/dependencies/lmdb/libraries/liblmdb/mdb.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/dependencies/lmdb/libraries/liblmdb/midl.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/dependencies/lz4/lib/lz4.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/compression.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/cursor.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/dbi.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/env.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/misc.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/node-lmdb.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/ordered-binary.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/txn.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store/src/windows.o +0 -0
- package/node_modules/lmdb-store/build/Release/obj.target/lmdb-store.node +0 -0
- package/node_modules/lmdb-store/build/binding.Makefile +0 -6
- package/node_modules/lmdb-store/build/config.gypi +0 -426
- package/node_modules/lmdb-store/build/lmdb-store.target.mk +0 -206
- package/node_modules/lmdb-store/node_modules/node-gyp-build/package.json +0 -60
- package/node_modules/lmdb-store/prebuilds/darwin-x64/electron.abi87.node +0 -0
- package/node_modules/lmdb-store/prebuilds/darwin-x64/node.abi72.node +0 -0
- package/node_modules/lmdb-store/prebuilds/darwin-x64/node.abi88.node +0 -0
- package/node_modules/lmdb-store/prebuilds/win32-x64/electron.abi87.node +0 -0
- package/node_modules/lmdb-store/prebuilds/win32-x64/node.abi72.node +0 -0
- package/node_modules/lmdb-store/prebuilds/win32-x64/node.abi88.node +0 -0
- package/node_modules/microtime/prebuilds/darwin-x64/electron-napi.node +0 -0
- package/node_modules/microtime/prebuilds/darwin-x64/node-napi.node +0 -0
- package/node_modules/microtime/prebuilds/linux-arm/electron-napi.node +0 -0
- package/node_modules/microtime/prebuilds/linux-arm/node-napi.node +0 -0
- package/node_modules/microtime/prebuilds/linux-x64/electron-napi.node +0 -0
- package/node_modules/microtime/prebuilds/linux-x64/node-napi.node +0 -0
- package/node_modules/microtime/prebuilds/win32-x64/electron-napi.node +0 -0
- package/node_modules/microtime/prebuilds/win32-x64/node-napi.node +0 -0
- package/node_modules/msgpackr-extract/.circleci/config.yml +0 -19
- package/node_modules/msgpackr-extract/.travis.yml +0 -30
- package/node_modules/msgpackr-extract/node_modules/node-gyp-build/LICENSE +0 -21
- package/node_modules/msgpackr-extract/node_modules/node-gyp-build/README.md +0 -58
- package/node_modules/msgpackr-extract/node_modules/node-gyp-build/bin.js +0 -77
- package/node_modules/msgpackr-extract/node_modules/node-gyp-build/build-test.js +0 -19
- package/node_modules/msgpackr-extract/node_modules/node-gyp-build/index.js +0 -202
- package/node_modules/msgpackr-extract/node_modules/node-gyp-build/optional.js +0 -7
- package/node_modules/msgpackr-extract/prebuilds/darwin-arm64/electron.abi98.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-arm64/node.abi102.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-arm64/node.abi83.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-arm64/node.abi93.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-x64/electron.abi98.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-x64/node.abi102.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-x64/node.abi83.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-x64/node.abi88.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/darwin-x64/node.abi93.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-arm64/electron.abi98.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-arm64/node.abi102.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-arm64/node.abi83.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-arm64/node.abi93.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/electron.abi98.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi102.musl.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi102.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi72.musl.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi72.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi83.musl.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi83.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi88.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi93.musl.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/linux-x64/node.abi93.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/win32-x64/electron.abi98.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/win32-x64/node.abi102.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/win32-x64/node.abi72.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/win32-x64/node.abi83.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/win32-x64/node.abi88.node +0 -0
- package/node_modules/msgpackr-extract/prebuilds/win32-x64/node.abi93.node +0 -0
- package/node_modules/node-addon-api/.editorconfig +0 -8
- package/node_modules/node-addon-api/.travis.yml +0 -65
- package/node_modules/node-addon-api/CHANGELOG.md +0 -325
- package/node_modules/node-addon-api/CODE_OF_CONDUCT.md +0 -4
- package/node_modules/node-addon-api/CONTRIBUTING.md +0 -66
- package/node_modules/node-addon-api/appveyor.yml +0 -48
- package/node_modules/node-addon-api/doc/Doxyfile +0 -2450
- package/node_modules/node-addon-api/doc/array_buffer.md +0 -129
- package/node_modules/node-addon-api/doc/async_context.md +0 -76
- package/node_modules/node-addon-api/doc/async_operations.md +0 -31
- package/node_modules/node-addon-api/doc/async_worker.md +0 -397
- package/node_modules/node-addon-api/doc/basic_types.md +0 -415
- package/node_modules/node-addon-api/doc/bigint.md +0 -92
- package/node_modules/node-addon-api/doc/boolean.md +0 -64
- package/node_modules/node-addon-api/doc/buffer.md +0 -140
- package/node_modules/node-addon-api/doc/callback_scope.md +0 -54
- package/node_modules/node-addon-api/doc/callbackinfo.md +0 -97
- package/node_modules/node-addon-api/doc/checker-tool.md +0 -32
- package/node_modules/node-addon-api/doc/class_property_descriptor.md +0 -118
- package/node_modules/node-addon-api/doc/cmake-js.md +0 -19
- package/node_modules/node-addon-api/doc/conversion-tool.md +0 -28
- package/node_modules/node-addon-api/doc/creating_a_release.md +0 -62
- package/node_modules/node-addon-api/doc/dataview.md +0 -244
- package/node_modules/node-addon-api/doc/env.md +0 -63
- package/node_modules/node-addon-api/doc/error.md +0 -115
- package/node_modules/node-addon-api/doc/error_handling.md +0 -186
- package/node_modules/node-addon-api/doc/escapable_handle_scope.md +0 -82
- package/node_modules/node-addon-api/doc/external.md +0 -59
- package/node_modules/node-addon-api/doc/function.md +0 -294
- package/node_modules/node-addon-api/doc/function_reference.md +0 -238
- package/node_modules/node-addon-api/doc/generator.md +0 -13
- package/node_modules/node-addon-api/doc/handle_scope.md +0 -65
- package/node_modules/node-addon-api/doc/memory_management.md +0 -27
- package/node_modules/node-addon-api/doc/node-gyp.md +0 -82
- package/node_modules/node-addon-api/doc/number.md +0 -163
- package/node_modules/node-addon-api/doc/object.md +0 -202
- package/node_modules/node-addon-api/doc/object_lifetime_management.md +0 -83
- package/node_modules/node-addon-api/doc/object_reference.md +0 -117
- package/node_modules/node-addon-api/doc/object_wrap.md +0 -546
- package/node_modules/node-addon-api/doc/prebuild_tools.md +0 -16
- package/node_modules/node-addon-api/doc/promises.md +0 -74
- package/node_modules/node-addon-api/doc/property_descriptor.md +0 -231
- package/node_modules/node-addon-api/doc/range_error.md +0 -59
- package/node_modules/node-addon-api/doc/reference.md +0 -111
- package/node_modules/node-addon-api/doc/setup.md +0 -82
- package/node_modules/node-addon-api/doc/string.md +0 -89
- package/node_modules/node-addon-api/doc/symbol.md +0 -44
- package/node_modules/node-addon-api/doc/threadsafe_function.md +0 -303
- package/node_modules/node-addon-api/doc/type_error.md +0 -59
- package/node_modules/node-addon-api/doc/typed_array.md +0 -74
- package/node_modules/node-addon-api/doc/typed_array_of.md +0 -133
- package/node_modules/node-addon-api/doc/value.md +0 -269
- package/node_modules/node-addon-api/doc/version_management.md +0 -43
- package/node_modules/node-addon-api/doc/working_with_javascript_values.md +0 -14
- package/node_modules/node-addon-api/external-napi/node_api.h +0 -7
- package/node_modules/node-addon-api/src/node_api.cc +0 -3655
- package/node_modules/node-addon-api/src/node_api.gyp +0 -21
- package/node_modules/node-addon-api/src/node_api.h +0 -588
- package/node_modules/node-addon-api/src/node_api_types.h +0 -115
- package/node_modules/node-addon-api/src/node_internals.cc +0 -142
- package/node_modules/node-addon-api/src/node_internals.h +0 -157
- package/node_modules/node-addon-api/src/util-inl.h +0 -38
- package/node_modules/node-addon-api/src/util.h +0 -7
|
@@ -1,513 +1,513 @@
|
|
|
1
|
-
|
|
2
|
-
// This file is part of node-lmdb, the Node.js binding for lmdb
|
|
3
|
-
// Copyright (c) 2013-2017 Timur Kristóf
|
|
4
|
-
// Copyright (c) 2021 Kristopher Tate
|
|
5
|
-
// Licensed to you under the terms of the MIT license
|
|
6
|
-
//
|
|
7
|
-
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
-
// of this software and associated documentation files (the "Software"), to deal
|
|
9
|
-
// in the Software without restriction, including without limitation the rights
|
|
10
|
-
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
-
// copies of the Software, and to permit persons to whom the Software is
|
|
12
|
-
// furnished to do so, subject to the following conditions:
|
|
13
|
-
|
|
14
|
-
// The above copyright notice and this permission notice shall be included in
|
|
15
|
-
// all copies or substantial portions of the Software.
|
|
16
|
-
|
|
17
|
-
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
-
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
-
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
-
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
-
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
-
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
-
// THE SOFTWARE.
|
|
24
|
-
|
|
25
|
-
#include "node-lmdb.h"
|
|
26
|
-
|
|
27
|
-
using namespace v8;
|
|
28
|
-
using namespace node;
|
|
29
|
-
|
|
30
|
-
TxnWrap::TxnWrap(MDB_env *env, MDB_txn *txn) {
|
|
31
|
-
this->env = env;
|
|
32
|
-
this->txn = txn;
|
|
33
|
-
this->flags = 0;
|
|
34
|
-
this->ew = nullptr;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
TxnWrap::~TxnWrap() {
|
|
38
|
-
// Close if not closed already
|
|
39
|
-
if (this->txn) {
|
|
40
|
-
mdb_txn_abort(txn);
|
|
41
|
-
this->removeFromEnvWrap();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
void TxnWrap::removeFromEnvWrap() {
|
|
46
|
-
if (this->ew) {
|
|
47
|
-
if (this->ew->currentWriteTxn == this) {
|
|
48
|
-
this->ew->currentWriteTxn = this->parentTw;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
auto it = std::find(ew->readTxns.begin(), ew->readTxns.end(), this);
|
|
52
|
-
if (it != ew->readTxns.end()) {
|
|
53
|
-
ew->readTxns.erase(it);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
this->ew->Unref();
|
|
58
|
-
this->ew = nullptr;
|
|
59
|
-
}
|
|
60
|
-
this->txn = nullptr;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
NAN_METHOD(TxnWrap::ctor) {
|
|
64
|
-
Nan::HandleScope scope;
|
|
65
|
-
|
|
66
|
-
EnvWrap *ew = Nan::ObjectWrap::Unwrap<EnvWrap>(Local<Object>::Cast(info[0]));
|
|
67
|
-
int flags = 0;
|
|
68
|
-
MDB_txn *txn;
|
|
69
|
-
TxnWrap *parentTw;
|
|
70
|
-
if (info[1]->IsTrue()) {
|
|
71
|
-
txn = ew->currentBatchTxn;
|
|
72
|
-
parentTw = nullptr;
|
|
73
|
-
} else {
|
|
74
|
-
if (info[1]->IsObject()) {
|
|
75
|
-
Local<Object> options = Local<Object>::Cast(info[1]);
|
|
76
|
-
|
|
77
|
-
// Get flags from options
|
|
78
|
-
|
|
79
|
-
setFlagFromValue(&flags, MDB_RDONLY, "readOnly", false, options);
|
|
80
|
-
}
|
|
81
|
-
MDB_txn *parentTxn;
|
|
82
|
-
if (info[2]->IsObject()) {
|
|
83
|
-
parentTw = Nan::ObjectWrap::Unwrap<TxnWrap>(Local<Object>::Cast(info[2]));
|
|
84
|
-
parentTxn = parentTw->txn;
|
|
85
|
-
} else {
|
|
86
|
-
parentTxn = nullptr;
|
|
87
|
-
parentTw = nullptr;
|
|
88
|
-
// Check existence of current write transaction
|
|
89
|
-
if (0 == (flags & MDB_RDONLY)) {
|
|
90
|
-
if (ew->currentWriteTxn != nullptr)
|
|
91
|
-
return Nan::ThrowError("You have already opened a write transaction in the current process, can't open a second one.");
|
|
92
|
-
if (ew->currentBatchTxn != nullptr) {
|
|
93
|
-
//fprintf(stderr, "begin sync txn");
|
|
94
|
-
auto batchWorker = ew->batchWorker;
|
|
95
|
-
if (batchWorker) // notify the batch worker that we need to jump ahead of any queued transaction callbacks
|
|
96
|
-
batchWorker->ContinueBatch(INTERRUPT_BATCH, false);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
int rc = mdb_txn_begin(ew->env, parentTxn, flags, &txn);
|
|
101
|
-
if (rc != 0) {
|
|
102
|
-
if (rc == EINVAL) {
|
|
103
|
-
return Nan::ThrowError("Invalid parameter, which on MacOS is often due to more transactions than available robust locked semaphors (see docs for more info)");
|
|
104
|
-
}
|
|
105
|
-
return throwLmdbError(rc);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
TxnWrap* tw = new TxnWrap(ew->env, txn);
|
|
109
|
-
|
|
110
|
-
// Set the current write transaction
|
|
111
|
-
if (0 == (flags & MDB_RDONLY)) {
|
|
112
|
-
ew->currentWriteTxn = tw;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
ew->readTxns.push_back(tw);
|
|
116
|
-
}
|
|
117
|
-
tw->parentTw = parentTw;
|
|
118
|
-
tw->flags = flags;
|
|
119
|
-
tw->ew = ew;
|
|
120
|
-
tw->ew->Ref();
|
|
121
|
-
tw->Wrap(info.This());
|
|
122
|
-
|
|
123
|
-
return info.GetReturnValue().Set(info.This());
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
NAN_METHOD(TxnWrap::commit) {
|
|
127
|
-
Nan::HandleScope scope;
|
|
128
|
-
|
|
129
|
-
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
130
|
-
|
|
131
|
-
if (!tw->txn) {
|
|
132
|
-
return Nan::ThrowError("The transaction is already closed.");
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
int rc = mdb_txn_commit(tw->txn);
|
|
136
|
-
if (tw->parentTw == nullptr && tw->ew->currentBatchTxn != nullptr) {
|
|
137
|
-
//fprintf(stderr, "committed sync txn");
|
|
138
|
-
|
|
139
|
-
auto batchWorker = tw->ew->batchWorker;
|
|
140
|
-
if (batchWorker) // notify the batch worker that we are done, and it can proceed
|
|
141
|
-
batchWorker->ContinueBatch(RESUME_BATCH, false);
|
|
142
|
-
}
|
|
143
|
-
tw->removeFromEnvWrap();
|
|
144
|
-
|
|
145
|
-
if (rc != 0) {
|
|
146
|
-
return throwLmdbError(rc);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
NAN_METHOD(TxnWrap::abort) {
|
|
151
|
-
Nan::HandleScope scope;
|
|
152
|
-
|
|
153
|
-
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
154
|
-
|
|
155
|
-
if (!tw->txn) {
|
|
156
|
-
return Nan::ThrowError("The transaction is already closed.");
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
mdb_txn_abort(tw->txn);
|
|
160
|
-
tw->removeFromEnvWrap();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
NAN_METHOD(TxnWrap::reset) {
|
|
164
|
-
Nan::HandleScope scope;
|
|
165
|
-
|
|
166
|
-
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
167
|
-
|
|
168
|
-
if (!tw->txn) {
|
|
169
|
-
return Nan::ThrowError("The transaction is already closed.");
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
mdb_txn_reset(tw->txn);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
NAN_METHOD(TxnWrap::renew) {
|
|
176
|
-
Nan::HandleScope scope;
|
|
177
|
-
|
|
178
|
-
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
179
|
-
|
|
180
|
-
if (!tw->txn) {
|
|
181
|
-
return Nan::ThrowError("The transaction is already closed.");
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
int rc = mdb_txn_renew(tw->txn);
|
|
185
|
-
if (rc != 0) {
|
|
186
|
-
return throwLmdbError(rc);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
Nan::NAN_METHOD_RETURN_TYPE TxnWrap::getCommon(Nan::NAN_METHOD_ARGS_TYPE info, Local<Value> (*successFunc)(MDB_val&)) {
|
|
191
|
-
Nan::HandleScope scope;
|
|
192
|
-
|
|
193
|
-
if (info.Length() != 2 && info.Length() != 3) {
|
|
194
|
-
return Nan::ThrowError("Invalid number of arguments to cursor.get");
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
198
|
-
DbiWrap *dw = Nan::ObjectWrap::Unwrap<DbiWrap>(Local<Object>::Cast(info[0]));
|
|
199
|
-
|
|
200
|
-
if (!tw->txn) {
|
|
201
|
-
return Nan::ThrowError("The transaction is already closed.");
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
MDB_val key, oldkey, data;
|
|
205
|
-
auto keyType = keyTypeFromOptions(info[2], dw->keyType);
|
|
206
|
-
bool keyIsValid;
|
|
207
|
-
auto freeKey = argToKey(info[1], key, keyType, keyIsValid);
|
|
208
|
-
if (!keyIsValid) {
|
|
209
|
-
// argToKey already threw an error
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Bookkeeping for old key so that we can free it even if key will point inside LMDB
|
|
214
|
-
oldkey.mv_data = key.mv_data;
|
|
215
|
-
oldkey.mv_size = key.mv_size;
|
|
216
|
-
int rc = mdb_get(tw->txn, dw->dbi, &key, &data);
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
if (freeKey) {
|
|
220
|
-
freeKey(oldkey);
|
|
221
|
-
}
|
|
222
|
-
if (rc == MDB_NOTFOUND) {
|
|
223
|
-
setLastVersion(NO_EXIST_VERSION);
|
|
224
|
-
info.GetReturnValue().Set(Nan::Undefined());
|
|
225
|
-
}
|
|
226
|
-
else if (rc != 0) {
|
|
227
|
-
throwLmdbError(rc);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
info.GetReturnValue().Set(getVersionAndUncompress(data, dw, successFunc));
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
NAN_METHOD(TxnWrap::getString) {
|
|
235
|
-
return getCommon(info, valToString);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
NAN_METHOD(TxnWrap::getUtf8) {
|
|
239
|
-
return getCommon(info, valToUtf8);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
NAN_METHOD(TxnWrap::getStringUnsafe) {
|
|
243
|
-
return getCommon(info, valToStringUnsafe);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
NAN_METHOD(TxnWrap::getBinary) {
|
|
247
|
-
return getCommon(info, valToBinary);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
NAN_METHOD(TxnWrap::getBinaryUnsafe) {
|
|
251
|
-
return getCommon(info, valToBinaryUnsafe);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
NAN_METHOD(TxnWrap::getNumber) {
|
|
255
|
-
return getCommon(info, valToNumber);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
NAN_METHOD(TxnWrap::getBoolean) {
|
|
259
|
-
return getCommon(info, valToBoolean);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
Nan::NAN_METHOD_RETURN_TYPE TxnWrap::putCommon(Nan::NAN_METHOD_ARGS_TYPE info, void (*fillFunc)(Nan::NAN_METHOD_ARGS_TYPE info, MDB_val&), void (*freeData)(MDB_val&)) {
|
|
263
|
-
Nan::HandleScope scope;
|
|
264
|
-
|
|
265
|
-
if (info.Length() != 3 && info.Length() != 4) {
|
|
266
|
-
return Nan::ThrowError("Invalid number of arguments to txn.put");
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
270
|
-
DbiWrap *dw = Nan::ObjectWrap::Unwrap<DbiWrap>(Local<Object>::Cast(info[0]));
|
|
271
|
-
|
|
272
|
-
if (!tw->txn) {
|
|
273
|
-
return Nan::ThrowError("The transaction is already closed.");
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
int flags = 0;
|
|
277
|
-
MDB_val key, data;
|
|
278
|
-
auto keyType = keyTypeFromOptions(info[3], dw->keyType);
|
|
279
|
-
bool keyIsValid;
|
|
280
|
-
auto freeKey = argToKey(info[1], key, keyType, keyIsValid);
|
|
281
|
-
if (!keyIsValid) {
|
|
282
|
-
// argToKey already threw an error
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (info[3]->IsObject()) {
|
|
287
|
-
auto options = Local<Object>::Cast(info[3]);
|
|
288
|
-
setFlagFromValue(&flags, MDB_NODUPDATA, "noDupData", false, options);
|
|
289
|
-
setFlagFromValue(&flags, MDB_NOOVERWRITE, "noOverwrite", false, options);
|
|
290
|
-
setFlagFromValue(&flags, MDB_APPEND, "append", false, options);
|
|
291
|
-
setFlagFromValue(&flags, MDB_APPENDDUP, "appendDup", false, options);
|
|
292
|
-
|
|
293
|
-
// NOTE: does not make sense to support MDB_RESERVE, because it wouldn't save the memcpy from V8 to lmdb
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// Fill key and data
|
|
297
|
-
fillFunc(info, data);
|
|
298
|
-
|
|
299
|
-
if (dw->compression) {
|
|
300
|
-
freeData = dw->compression->compress(&data, freeData);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Keep a copy of the original key and data, so we can free them
|
|
304
|
-
MDB_val originalKey = key;
|
|
305
|
-
MDB_val originalData = data;
|
|
306
|
-
|
|
307
|
-
int rc;
|
|
308
|
-
if (dw->hasVersions) {
|
|
309
|
-
double version;
|
|
310
|
-
if (info[3]->IsNumber()) {
|
|
311
|
-
auto versionLocal = Nan::To<v8::Number>(info[3]).ToLocalChecked();
|
|
312
|
-
version = versionLocal->Value();
|
|
313
|
-
} else if (info[3]->IsObject()) {
|
|
314
|
-
auto options = Local<Object>::Cast(info[3]);
|
|
315
|
-
auto versionProp = options->Get(Nan::GetCurrentContext(), Nan::New<String>("version").ToLocalChecked()).ToLocalChecked();
|
|
316
|
-
if (versionProp->IsNumber()) {
|
|
317
|
-
auto versionLocal = Nan::To<v8::Number>(versionProp).ToLocalChecked();
|
|
318
|
-
version = versionLocal->Value();
|
|
319
|
-
} else
|
|
320
|
-
version = 0;
|
|
321
|
-
} else
|
|
322
|
-
version = 0;
|
|
323
|
-
rc = putWithVersion(tw->txn, dw->dbi, &key, &data, flags, version);
|
|
324
|
-
}
|
|
325
|
-
else
|
|
326
|
-
rc = mdb_put(tw->txn, dw->dbi, &key, &data, flags);
|
|
327
|
-
|
|
328
|
-
// Free original key and data (what was supplied by the user, not what points to lmdb)
|
|
329
|
-
if (freeKey) {
|
|
330
|
-
freeKey(originalKey);
|
|
331
|
-
}
|
|
332
|
-
if (freeData) {
|
|
333
|
-
freeData(originalData);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// Check result code
|
|
337
|
-
if (rc != 0) {
|
|
338
|
-
return throwLmdbError(rc);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
NAN_METHOD(TxnWrap::putString) {
|
|
343
|
-
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
344
|
-
CustomExternalStringResource::writeTo(Local<String>::Cast(info[2]), &data);
|
|
345
|
-
}, [](MDB_val &data) -> void {
|
|
346
|
-
delete[] (char*)data.mv_data;
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
NAN_METHOD(TxnWrap::putBinary) {
|
|
351
|
-
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
352
|
-
data.mv_size = node::Buffer::Length(info[2]);
|
|
353
|
-
data.mv_data = node::Buffer::Data(info[2]);
|
|
354
|
-
}, [](MDB_val &) -> void {
|
|
355
|
-
// The data is owned by the node::Buffer so we don't need to free it.
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
// This is used by putNumber for temporary storage
|
|
360
|
-
#ifdef thread_local
|
|
361
|
-
static thread_local double numberToPut = 0.0;
|
|
362
|
-
#else
|
|
363
|
-
static double numberToPut = 0.0;
|
|
364
|
-
#endif
|
|
365
|
-
|
|
366
|
-
NAN_METHOD(TxnWrap::putNumber) {
|
|
367
|
-
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
368
|
-
auto numberLocal = Nan::To<v8::Number>(info[2]).ToLocalChecked();
|
|
369
|
-
numberToPut = numberLocal->Value();
|
|
370
|
-
data.mv_size = sizeof(double);
|
|
371
|
-
data.mv_data = &numberToPut;
|
|
372
|
-
}, nullptr);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// This is used by putBoolean for temporary storage
|
|
376
|
-
#ifdef thread_local
|
|
377
|
-
static thread_local bool booleanToPut = false;
|
|
378
|
-
#else
|
|
379
|
-
static bool booleanToPut = false;
|
|
380
|
-
#endif
|
|
381
|
-
|
|
382
|
-
NAN_METHOD(TxnWrap::putBoolean) {
|
|
383
|
-
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
384
|
-
auto booleanLocal = Nan::To<v8::Boolean>(info[2]).ToLocalChecked();
|
|
385
|
-
booleanToPut = booleanLocal->Value();
|
|
386
|
-
|
|
387
|
-
data.mv_size = sizeof(bool);
|
|
388
|
-
data.mv_data = &booleanToPut;
|
|
389
|
-
}, nullptr);
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
NAN_METHOD(TxnWrap::putUtf8) {
|
|
393
|
-
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
394
|
-
writeValueToEntry(Local<String>::Cast(info[2]), &data);
|
|
395
|
-
}, [](MDB_val &data) -> void {
|
|
396
|
-
delete[] (char*)data.mv_data;
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
NAN_METHOD(TxnWrap::del) {
|
|
401
|
-
Nan::HandleScope scope;
|
|
402
|
-
|
|
403
|
-
// Check argument count
|
|
404
|
-
auto argCount = info.Length();
|
|
405
|
-
if (argCount < 2 || argCount > 4) {
|
|
406
|
-
return Nan::ThrowError("Invalid number of arguments to cursor.del, should be: (a) <dbi>, <key> (b) <dbi>, <key>, <options> (c) <dbi>, <key>, <data> (d) <dbi>, <key>, <data>, <options>");
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Unwrap native objects
|
|
410
|
-
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
411
|
-
DbiWrap *dw = Nan::ObjectWrap::Unwrap<DbiWrap>(Local<Object>::Cast(info[0]));
|
|
412
|
-
|
|
413
|
-
if (!tw->txn) {
|
|
414
|
-
return Nan::ThrowError("The transaction is already closed.");
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
// Take care of options object and data handle
|
|
418
|
-
Local<Value> options;
|
|
419
|
-
Local<Value> dataHandle;
|
|
420
|
-
|
|
421
|
-
if (argCount == 4) {
|
|
422
|
-
options = info[3];
|
|
423
|
-
dataHandle = info[2];
|
|
424
|
-
}
|
|
425
|
-
else if (argCount == 3) {
|
|
426
|
-
if (info[2]->IsObject() && !node::Buffer::HasInstance(info[2])) {
|
|
427
|
-
options = info[2];
|
|
428
|
-
dataHandle = Nan::Undefined();
|
|
429
|
-
}
|
|
430
|
-
else {
|
|
431
|
-
options = Nan::Undefined();
|
|
432
|
-
dataHandle = info[2];
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
else if (argCount == 2) {
|
|
436
|
-
options = Nan::Undefined();
|
|
437
|
-
dataHandle = Nan::Undefined();
|
|
438
|
-
}
|
|
439
|
-
else {
|
|
440
|
-
return Nan::ThrowError("Unknown arguments to cursor.del, this could be a node-lmdb bug!");
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
MDB_val key;
|
|
444
|
-
auto keyType = keyTypeFromOptions(options, dw->keyType);
|
|
445
|
-
bool keyIsValid;
|
|
446
|
-
auto freeKey = argToKey(info[1], key, keyType, keyIsValid);
|
|
447
|
-
if (!keyIsValid) {
|
|
448
|
-
// argToKey already threw an error
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// Set data if dupSort true and data given
|
|
453
|
-
MDB_val data;
|
|
454
|
-
bool freeData = false;
|
|
455
|
-
|
|
456
|
-
if ((dw->flags & MDB_DUPSORT) && !(dataHandle->IsUndefined())) {
|
|
457
|
-
if (dataHandle->IsString()) {
|
|
458
|
-
writeValueToEntry(dataHandle, &data);
|
|
459
|
-
freeData = true;
|
|
460
|
-
}
|
|
461
|
-
else if (node::Buffer::HasInstance(dataHandle)) {
|
|
462
|
-
data.mv_size = node::Buffer::Length(dataHandle);
|
|
463
|
-
data.mv_data = node::Buffer::Data(dataHandle);
|
|
464
|
-
freeData = true;
|
|
465
|
-
}
|
|
466
|
-
else if (dataHandle->IsNumber()) {
|
|
467
|
-
auto numberLocal = Nan::To<v8::Number>(dataHandle).ToLocalChecked();
|
|
468
|
-
data.mv_size = sizeof(double);
|
|
469
|
-
data.mv_data = new double;
|
|
470
|
-
*reinterpret_cast<double*>(data.mv_data) = numberLocal->Value();
|
|
471
|
-
freeData = true;
|
|
472
|
-
}
|
|
473
|
-
else if (dataHandle->IsBoolean()) {
|
|
474
|
-
auto booleanLocal = Nan::To<v8::Boolean>(dataHandle).ToLocalChecked();
|
|
475
|
-
data.mv_size = sizeof(double);
|
|
476
|
-
data.mv_data = new bool;
|
|
477
|
-
*reinterpret_cast<bool*>(data.mv_data) = booleanLocal->Value();
|
|
478
|
-
freeData = true;
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
Nan::ThrowError("Invalid data type.");
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
int rc = mdb_del(tw->txn, dw->dbi, &key, freeData ? &data : nullptr);
|
|
486
|
-
|
|
487
|
-
if (freeKey) {
|
|
488
|
-
freeKey(key);
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
if (freeData) {
|
|
492
|
-
if (dataHandle->IsString()) {
|
|
493
|
-
delete[] (uint16_t*)data.mv_data;
|
|
494
|
-
}
|
|
495
|
-
else if (node::Buffer::HasInstance(dataHandle)) {
|
|
496
|
-
// I think the data is owned by the node::Buffer so we don't need to free it - need to clarify
|
|
497
|
-
}
|
|
498
|
-
else if (dataHandle->IsNumber()) {
|
|
499
|
-
delete (double*)data.mv_data;
|
|
500
|
-
}
|
|
501
|
-
else if (dataHandle->IsBoolean()) {
|
|
502
|
-
delete (bool*)data.mv_data;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
if (rc != 0) {
|
|
507
|
-
if (rc == MDB_NOTFOUND) {
|
|
508
|
-
return info.GetReturnValue().Set(Nan::False());
|
|
509
|
-
}
|
|
510
|
-
return throwLmdbError(rc);
|
|
511
|
-
}
|
|
512
|
-
return info.GetReturnValue().Set(Nan::True());
|
|
513
|
-
}
|
|
1
|
+
|
|
2
|
+
// This file is part of node-lmdb, the Node.js binding for lmdb
|
|
3
|
+
// Copyright (c) 2013-2017 Timur Kristóf
|
|
4
|
+
// Copyright (c) 2021 Kristopher Tate
|
|
5
|
+
// Licensed to you under the terms of the MIT license
|
|
6
|
+
//
|
|
7
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
// in the Software without restriction, including without limitation the rights
|
|
10
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
// furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
// The above copyright notice and this permission notice shall be included in
|
|
15
|
+
// all copies or substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
+
// THE SOFTWARE.
|
|
24
|
+
|
|
25
|
+
#include "node-lmdb.h"
|
|
26
|
+
|
|
27
|
+
using namespace v8;
|
|
28
|
+
using namespace node;
|
|
29
|
+
|
|
30
|
+
TxnWrap::TxnWrap(MDB_env *env, MDB_txn *txn) {
|
|
31
|
+
this->env = env;
|
|
32
|
+
this->txn = txn;
|
|
33
|
+
this->flags = 0;
|
|
34
|
+
this->ew = nullptr;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
TxnWrap::~TxnWrap() {
|
|
38
|
+
// Close if not closed already
|
|
39
|
+
if (this->txn) {
|
|
40
|
+
mdb_txn_abort(txn);
|
|
41
|
+
this->removeFromEnvWrap();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
void TxnWrap::removeFromEnvWrap() {
|
|
46
|
+
if (this->ew) {
|
|
47
|
+
if (this->ew->currentWriteTxn == this) {
|
|
48
|
+
this->ew->currentWriteTxn = this->parentTw;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
auto it = std::find(ew->readTxns.begin(), ew->readTxns.end(), this);
|
|
52
|
+
if (it != ew->readTxns.end()) {
|
|
53
|
+
ew->readTxns.erase(it);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
this->ew->Unref();
|
|
58
|
+
this->ew = nullptr;
|
|
59
|
+
}
|
|
60
|
+
this->txn = nullptr;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
NAN_METHOD(TxnWrap::ctor) {
|
|
64
|
+
Nan::HandleScope scope;
|
|
65
|
+
|
|
66
|
+
EnvWrap *ew = Nan::ObjectWrap::Unwrap<EnvWrap>(Local<Object>::Cast(info[0]));
|
|
67
|
+
int flags = 0;
|
|
68
|
+
MDB_txn *txn;
|
|
69
|
+
TxnWrap *parentTw;
|
|
70
|
+
if (info[1]->IsTrue()) {
|
|
71
|
+
txn = ew->currentBatchTxn;
|
|
72
|
+
parentTw = nullptr;
|
|
73
|
+
} else {
|
|
74
|
+
if (info[1]->IsObject()) {
|
|
75
|
+
Local<Object> options = Local<Object>::Cast(info[1]);
|
|
76
|
+
|
|
77
|
+
// Get flags from options
|
|
78
|
+
|
|
79
|
+
setFlagFromValue(&flags, MDB_RDONLY, "readOnly", false, options);
|
|
80
|
+
}
|
|
81
|
+
MDB_txn *parentTxn;
|
|
82
|
+
if (info[2]->IsObject()) {
|
|
83
|
+
parentTw = Nan::ObjectWrap::Unwrap<TxnWrap>(Local<Object>::Cast(info[2]));
|
|
84
|
+
parentTxn = parentTw->txn;
|
|
85
|
+
} else {
|
|
86
|
+
parentTxn = nullptr;
|
|
87
|
+
parentTw = nullptr;
|
|
88
|
+
// Check existence of current write transaction
|
|
89
|
+
if (0 == (flags & MDB_RDONLY)) {
|
|
90
|
+
if (ew->currentWriteTxn != nullptr)
|
|
91
|
+
return Nan::ThrowError("You have already opened a write transaction in the current process, can't open a second one.");
|
|
92
|
+
if (ew->currentBatchTxn != nullptr) {
|
|
93
|
+
//fprintf(stderr, "begin sync txn");
|
|
94
|
+
auto batchWorker = ew->batchWorker;
|
|
95
|
+
if (batchWorker) // notify the batch worker that we need to jump ahead of any queued transaction callbacks
|
|
96
|
+
batchWorker->ContinueBatch(INTERRUPT_BATCH, false);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
int rc = mdb_txn_begin(ew->env, parentTxn, flags, &txn);
|
|
101
|
+
if (rc != 0) {
|
|
102
|
+
if (rc == EINVAL) {
|
|
103
|
+
return Nan::ThrowError("Invalid parameter, which on MacOS is often due to more transactions than available robust locked semaphors (see docs for more info)");
|
|
104
|
+
}
|
|
105
|
+
return throwLmdbError(rc);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
TxnWrap* tw = new TxnWrap(ew->env, txn);
|
|
109
|
+
|
|
110
|
+
// Set the current write transaction
|
|
111
|
+
if (0 == (flags & MDB_RDONLY)) {
|
|
112
|
+
ew->currentWriteTxn = tw;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
ew->readTxns.push_back(tw);
|
|
116
|
+
}
|
|
117
|
+
tw->parentTw = parentTw;
|
|
118
|
+
tw->flags = flags;
|
|
119
|
+
tw->ew = ew;
|
|
120
|
+
tw->ew->Ref();
|
|
121
|
+
tw->Wrap(info.This());
|
|
122
|
+
|
|
123
|
+
return info.GetReturnValue().Set(info.This());
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
NAN_METHOD(TxnWrap::commit) {
|
|
127
|
+
Nan::HandleScope scope;
|
|
128
|
+
|
|
129
|
+
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
130
|
+
|
|
131
|
+
if (!tw->txn) {
|
|
132
|
+
return Nan::ThrowError("The transaction is already closed.");
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
int rc = mdb_txn_commit(tw->txn);
|
|
136
|
+
if (tw->parentTw == nullptr && tw->ew->currentBatchTxn != nullptr) {
|
|
137
|
+
//fprintf(stderr, "committed sync txn");
|
|
138
|
+
|
|
139
|
+
auto batchWorker = tw->ew->batchWorker;
|
|
140
|
+
if (batchWorker) // notify the batch worker that we are done, and it can proceed
|
|
141
|
+
batchWorker->ContinueBatch(RESUME_BATCH, false);
|
|
142
|
+
}
|
|
143
|
+
tw->removeFromEnvWrap();
|
|
144
|
+
|
|
145
|
+
if (rc != 0) {
|
|
146
|
+
return throwLmdbError(rc);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
NAN_METHOD(TxnWrap::abort) {
|
|
151
|
+
Nan::HandleScope scope;
|
|
152
|
+
|
|
153
|
+
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
154
|
+
|
|
155
|
+
if (!tw->txn) {
|
|
156
|
+
return Nan::ThrowError("The transaction is already closed.");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
mdb_txn_abort(tw->txn);
|
|
160
|
+
tw->removeFromEnvWrap();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
NAN_METHOD(TxnWrap::reset) {
|
|
164
|
+
Nan::HandleScope scope;
|
|
165
|
+
|
|
166
|
+
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
167
|
+
|
|
168
|
+
if (!tw->txn) {
|
|
169
|
+
return Nan::ThrowError("The transaction is already closed.");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
mdb_txn_reset(tw->txn);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
NAN_METHOD(TxnWrap::renew) {
|
|
176
|
+
Nan::HandleScope scope;
|
|
177
|
+
|
|
178
|
+
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
179
|
+
|
|
180
|
+
if (!tw->txn) {
|
|
181
|
+
return Nan::ThrowError("The transaction is already closed.");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
int rc = mdb_txn_renew(tw->txn);
|
|
185
|
+
if (rc != 0) {
|
|
186
|
+
return throwLmdbError(rc);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
Nan::NAN_METHOD_RETURN_TYPE TxnWrap::getCommon(Nan::NAN_METHOD_ARGS_TYPE info, Local<Value> (*successFunc)(MDB_val&)) {
|
|
191
|
+
Nan::HandleScope scope;
|
|
192
|
+
|
|
193
|
+
if (info.Length() != 2 && info.Length() != 3) {
|
|
194
|
+
return Nan::ThrowError("Invalid number of arguments to cursor.get");
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
198
|
+
DbiWrap *dw = Nan::ObjectWrap::Unwrap<DbiWrap>(Local<Object>::Cast(info[0]));
|
|
199
|
+
|
|
200
|
+
if (!tw->txn) {
|
|
201
|
+
return Nan::ThrowError("The transaction is already closed.");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
MDB_val key, oldkey, data;
|
|
205
|
+
auto keyType = keyTypeFromOptions(info[2], dw->keyType);
|
|
206
|
+
bool keyIsValid;
|
|
207
|
+
auto freeKey = argToKey(info[1], key, keyType, keyIsValid);
|
|
208
|
+
if (!keyIsValid) {
|
|
209
|
+
// argToKey already threw an error
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Bookkeeping for old key so that we can free it even if key will point inside LMDB
|
|
214
|
+
oldkey.mv_data = key.mv_data;
|
|
215
|
+
oldkey.mv_size = key.mv_size;
|
|
216
|
+
int rc = mdb_get(tw->txn, dw->dbi, &key, &data);
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
if (freeKey) {
|
|
220
|
+
freeKey(oldkey);
|
|
221
|
+
}
|
|
222
|
+
if (rc == MDB_NOTFOUND) {
|
|
223
|
+
setLastVersion(NO_EXIST_VERSION);
|
|
224
|
+
info.GetReturnValue().Set(Nan::Undefined());
|
|
225
|
+
}
|
|
226
|
+
else if (rc != 0) {
|
|
227
|
+
throwLmdbError(rc);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
info.GetReturnValue().Set(getVersionAndUncompress(data, dw, successFunc));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
NAN_METHOD(TxnWrap::getString) {
|
|
235
|
+
return getCommon(info, valToString);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
NAN_METHOD(TxnWrap::getUtf8) {
|
|
239
|
+
return getCommon(info, valToUtf8);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
NAN_METHOD(TxnWrap::getStringUnsafe) {
|
|
243
|
+
return getCommon(info, valToStringUnsafe);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
NAN_METHOD(TxnWrap::getBinary) {
|
|
247
|
+
return getCommon(info, valToBinary);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
NAN_METHOD(TxnWrap::getBinaryUnsafe) {
|
|
251
|
+
return getCommon(info, valToBinaryUnsafe);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
NAN_METHOD(TxnWrap::getNumber) {
|
|
255
|
+
return getCommon(info, valToNumber);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
NAN_METHOD(TxnWrap::getBoolean) {
|
|
259
|
+
return getCommon(info, valToBoolean);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
Nan::NAN_METHOD_RETURN_TYPE TxnWrap::putCommon(Nan::NAN_METHOD_ARGS_TYPE info, void (*fillFunc)(Nan::NAN_METHOD_ARGS_TYPE info, MDB_val&), void (*freeData)(MDB_val&)) {
|
|
263
|
+
Nan::HandleScope scope;
|
|
264
|
+
|
|
265
|
+
if (info.Length() != 3 && info.Length() != 4) {
|
|
266
|
+
return Nan::ThrowError("Invalid number of arguments to txn.put");
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
270
|
+
DbiWrap *dw = Nan::ObjectWrap::Unwrap<DbiWrap>(Local<Object>::Cast(info[0]));
|
|
271
|
+
|
|
272
|
+
if (!tw->txn) {
|
|
273
|
+
return Nan::ThrowError("The transaction is already closed.");
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
int flags = 0;
|
|
277
|
+
MDB_val key, data;
|
|
278
|
+
auto keyType = keyTypeFromOptions(info[3], dw->keyType);
|
|
279
|
+
bool keyIsValid;
|
|
280
|
+
auto freeKey = argToKey(info[1], key, keyType, keyIsValid);
|
|
281
|
+
if (!keyIsValid) {
|
|
282
|
+
// argToKey already threw an error
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (info[3]->IsObject()) {
|
|
287
|
+
auto options = Local<Object>::Cast(info[3]);
|
|
288
|
+
setFlagFromValue(&flags, MDB_NODUPDATA, "noDupData", false, options);
|
|
289
|
+
setFlagFromValue(&flags, MDB_NOOVERWRITE, "noOverwrite", false, options);
|
|
290
|
+
setFlagFromValue(&flags, MDB_APPEND, "append", false, options);
|
|
291
|
+
setFlagFromValue(&flags, MDB_APPENDDUP, "appendDup", false, options);
|
|
292
|
+
|
|
293
|
+
// NOTE: does not make sense to support MDB_RESERVE, because it wouldn't save the memcpy from V8 to lmdb
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Fill key and data
|
|
297
|
+
fillFunc(info, data);
|
|
298
|
+
|
|
299
|
+
if (dw->compression) {
|
|
300
|
+
freeData = dw->compression->compress(&data, freeData);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Keep a copy of the original key and data, so we can free them
|
|
304
|
+
MDB_val originalKey = key;
|
|
305
|
+
MDB_val originalData = data;
|
|
306
|
+
|
|
307
|
+
int rc;
|
|
308
|
+
if (dw->hasVersions) {
|
|
309
|
+
double version;
|
|
310
|
+
if (info[3]->IsNumber()) {
|
|
311
|
+
auto versionLocal = Nan::To<v8::Number>(info[3]).ToLocalChecked();
|
|
312
|
+
version = versionLocal->Value();
|
|
313
|
+
} else if (info[3]->IsObject()) {
|
|
314
|
+
auto options = Local<Object>::Cast(info[3]);
|
|
315
|
+
auto versionProp = options->Get(Nan::GetCurrentContext(), Nan::New<String>("version").ToLocalChecked()).ToLocalChecked();
|
|
316
|
+
if (versionProp->IsNumber()) {
|
|
317
|
+
auto versionLocal = Nan::To<v8::Number>(versionProp).ToLocalChecked();
|
|
318
|
+
version = versionLocal->Value();
|
|
319
|
+
} else
|
|
320
|
+
version = 0;
|
|
321
|
+
} else
|
|
322
|
+
version = 0;
|
|
323
|
+
rc = putWithVersion(tw->txn, dw->dbi, &key, &data, flags, version);
|
|
324
|
+
}
|
|
325
|
+
else
|
|
326
|
+
rc = mdb_put(tw->txn, dw->dbi, &key, &data, flags);
|
|
327
|
+
|
|
328
|
+
// Free original key and data (what was supplied by the user, not what points to lmdb)
|
|
329
|
+
if (freeKey) {
|
|
330
|
+
freeKey(originalKey);
|
|
331
|
+
}
|
|
332
|
+
if (freeData) {
|
|
333
|
+
freeData(originalData);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Check result code
|
|
337
|
+
if (rc != 0) {
|
|
338
|
+
return throwLmdbError(rc);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
NAN_METHOD(TxnWrap::putString) {
|
|
343
|
+
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
344
|
+
CustomExternalStringResource::writeTo(Local<String>::Cast(info[2]), &data);
|
|
345
|
+
}, [](MDB_val &data) -> void {
|
|
346
|
+
delete[] (char*)data.mv_data;
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
NAN_METHOD(TxnWrap::putBinary) {
|
|
351
|
+
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
352
|
+
data.mv_size = node::Buffer::Length(info[2]);
|
|
353
|
+
data.mv_data = node::Buffer::Data(info[2]);
|
|
354
|
+
}, [](MDB_val &) -> void {
|
|
355
|
+
// The data is owned by the node::Buffer so we don't need to free it.
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// This is used by putNumber for temporary storage
|
|
360
|
+
#ifdef thread_local
|
|
361
|
+
static thread_local double numberToPut = 0.0;
|
|
362
|
+
#else
|
|
363
|
+
static double numberToPut = 0.0;
|
|
364
|
+
#endif
|
|
365
|
+
|
|
366
|
+
NAN_METHOD(TxnWrap::putNumber) {
|
|
367
|
+
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
368
|
+
auto numberLocal = Nan::To<v8::Number>(info[2]).ToLocalChecked();
|
|
369
|
+
numberToPut = numberLocal->Value();
|
|
370
|
+
data.mv_size = sizeof(double);
|
|
371
|
+
data.mv_data = &numberToPut;
|
|
372
|
+
}, nullptr);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// This is used by putBoolean for temporary storage
|
|
376
|
+
#ifdef thread_local
|
|
377
|
+
static thread_local bool booleanToPut = false;
|
|
378
|
+
#else
|
|
379
|
+
static bool booleanToPut = false;
|
|
380
|
+
#endif
|
|
381
|
+
|
|
382
|
+
NAN_METHOD(TxnWrap::putBoolean) {
|
|
383
|
+
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
384
|
+
auto booleanLocal = Nan::To<v8::Boolean>(info[2]).ToLocalChecked();
|
|
385
|
+
booleanToPut = booleanLocal->Value();
|
|
386
|
+
|
|
387
|
+
data.mv_size = sizeof(bool);
|
|
388
|
+
data.mv_data = &booleanToPut;
|
|
389
|
+
}, nullptr);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
NAN_METHOD(TxnWrap::putUtf8) {
|
|
393
|
+
return putCommon(info, [](Nan::NAN_METHOD_ARGS_TYPE info, MDB_val &data) -> void {
|
|
394
|
+
writeValueToEntry(Local<String>::Cast(info[2]), &data);
|
|
395
|
+
}, [](MDB_val &data) -> void {
|
|
396
|
+
delete[] (char*)data.mv_data;
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
NAN_METHOD(TxnWrap::del) {
|
|
401
|
+
Nan::HandleScope scope;
|
|
402
|
+
|
|
403
|
+
// Check argument count
|
|
404
|
+
auto argCount = info.Length();
|
|
405
|
+
if (argCount < 2 || argCount > 4) {
|
|
406
|
+
return Nan::ThrowError("Invalid number of arguments to cursor.del, should be: (a) <dbi>, <key> (b) <dbi>, <key>, <options> (c) <dbi>, <key>, <data> (d) <dbi>, <key>, <data>, <options>");
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Unwrap native objects
|
|
410
|
+
TxnWrap *tw = Nan::ObjectWrap::Unwrap<TxnWrap>(info.This());
|
|
411
|
+
DbiWrap *dw = Nan::ObjectWrap::Unwrap<DbiWrap>(Local<Object>::Cast(info[0]));
|
|
412
|
+
|
|
413
|
+
if (!tw->txn) {
|
|
414
|
+
return Nan::ThrowError("The transaction is already closed.");
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// Take care of options object and data handle
|
|
418
|
+
Local<Value> options;
|
|
419
|
+
Local<Value> dataHandle;
|
|
420
|
+
|
|
421
|
+
if (argCount == 4) {
|
|
422
|
+
options = info[3];
|
|
423
|
+
dataHandle = info[2];
|
|
424
|
+
}
|
|
425
|
+
else if (argCount == 3) {
|
|
426
|
+
if (info[2]->IsObject() && !node::Buffer::HasInstance(info[2])) {
|
|
427
|
+
options = info[2];
|
|
428
|
+
dataHandle = Nan::Undefined();
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
options = Nan::Undefined();
|
|
432
|
+
dataHandle = info[2];
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
else if (argCount == 2) {
|
|
436
|
+
options = Nan::Undefined();
|
|
437
|
+
dataHandle = Nan::Undefined();
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
return Nan::ThrowError("Unknown arguments to cursor.del, this could be a node-lmdb bug!");
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
MDB_val key;
|
|
444
|
+
auto keyType = keyTypeFromOptions(options, dw->keyType);
|
|
445
|
+
bool keyIsValid;
|
|
446
|
+
auto freeKey = argToKey(info[1], key, keyType, keyIsValid);
|
|
447
|
+
if (!keyIsValid) {
|
|
448
|
+
// argToKey already threw an error
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Set data if dupSort true and data given
|
|
453
|
+
MDB_val data;
|
|
454
|
+
bool freeData = false;
|
|
455
|
+
|
|
456
|
+
if ((dw->flags & MDB_DUPSORT) && !(dataHandle->IsUndefined())) {
|
|
457
|
+
if (dataHandle->IsString()) {
|
|
458
|
+
writeValueToEntry(dataHandle, &data);
|
|
459
|
+
freeData = true;
|
|
460
|
+
}
|
|
461
|
+
else if (node::Buffer::HasInstance(dataHandle)) {
|
|
462
|
+
data.mv_size = node::Buffer::Length(dataHandle);
|
|
463
|
+
data.mv_data = node::Buffer::Data(dataHandle);
|
|
464
|
+
freeData = true;
|
|
465
|
+
}
|
|
466
|
+
else if (dataHandle->IsNumber()) {
|
|
467
|
+
auto numberLocal = Nan::To<v8::Number>(dataHandle).ToLocalChecked();
|
|
468
|
+
data.mv_size = sizeof(double);
|
|
469
|
+
data.mv_data = new double;
|
|
470
|
+
*reinterpret_cast<double*>(data.mv_data) = numberLocal->Value();
|
|
471
|
+
freeData = true;
|
|
472
|
+
}
|
|
473
|
+
else if (dataHandle->IsBoolean()) {
|
|
474
|
+
auto booleanLocal = Nan::To<v8::Boolean>(dataHandle).ToLocalChecked();
|
|
475
|
+
data.mv_size = sizeof(double);
|
|
476
|
+
data.mv_data = new bool;
|
|
477
|
+
*reinterpret_cast<bool*>(data.mv_data) = booleanLocal->Value();
|
|
478
|
+
freeData = true;
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
Nan::ThrowError("Invalid data type.");
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
int rc = mdb_del(tw->txn, dw->dbi, &key, freeData ? &data : nullptr);
|
|
486
|
+
|
|
487
|
+
if (freeKey) {
|
|
488
|
+
freeKey(key);
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if (freeData) {
|
|
492
|
+
if (dataHandle->IsString()) {
|
|
493
|
+
delete[] (uint16_t*)data.mv_data;
|
|
494
|
+
}
|
|
495
|
+
else if (node::Buffer::HasInstance(dataHandle)) {
|
|
496
|
+
// I think the data is owned by the node::Buffer so we don't need to free it - need to clarify
|
|
497
|
+
}
|
|
498
|
+
else if (dataHandle->IsNumber()) {
|
|
499
|
+
delete (double*)data.mv_data;
|
|
500
|
+
}
|
|
501
|
+
else if (dataHandle->IsBoolean()) {
|
|
502
|
+
delete (bool*)data.mv_data;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
if (rc != 0) {
|
|
507
|
+
if (rc == MDB_NOTFOUND) {
|
|
508
|
+
return info.GetReturnValue().Set(Nan::False());
|
|
509
|
+
}
|
|
510
|
+
return throwLmdbError(rc);
|
|
511
|
+
}
|
|
512
|
+
return info.GetReturnValue().Set(Nan::True());
|
|
513
|
+
}
|