@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.3
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/bin/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +17 -10
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/ResourceInterface.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +12 -4
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +265 -73
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +11 -12
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +52 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +2 -1
- package/dist/utility/lmdb/commonUtility.js +20 -13
- package/dist/utility/lmdb/commonUtility.js.map +1 -1
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +35 -16
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4531 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +733 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +596 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-C1G-Jo6n.js +37 -0
- package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
- package/studio/web/assets/index-D-CahN0-.js +2 -0
- package/studio/web/assets/index-D-CahN0-.js.map +1 -0
- package/studio/web/assets/index-DxlZI0PX.js +235 -0
- package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
- package/studio/web/assets/profiler-CU93QiSW.js +2 -0
- package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +130 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
- package/dist/resources/ResourceInterfaceV2.js.map +0 -1
- package/dist/resources/ResourceV2.d.ts +0 -30
- package/dist/resources/ResourceV2.js +0 -27
- package/dist/resources/ResourceV2.js.map +0 -1
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const INTERNAL_DBIS_NAME = '__dbis__';
|
|
4
|
+
const AUDIT_STORE_NAME = '__txns__';
|
|
5
|
+
const ENVIRONMENT_NAME_KEY = '__environment_name__';
|
|
6
|
+
const DBI_DEFINITION_NAME = '__dbi_defintion__';
|
|
7
|
+
//LMDB has a 1978 byte limit for keys, but we try to retain plenty of padding so we don't have to calculate encoded byte length
|
|
8
|
+
const MAX_SEARCH_KEY_LENGTH = 256;
|
|
9
|
+
|
|
10
|
+
const SEARCH_TYPES = {
|
|
11
|
+
EQUALS: 'equals',
|
|
12
|
+
STARTS_WITH: 'startsWith',
|
|
13
|
+
_STARTS_WITH: 'starts_with',
|
|
14
|
+
ENDS_WITH: 'endsWith',
|
|
15
|
+
_ENDS_WITH: 'ends_with',
|
|
16
|
+
CONTAINS: 'contains',
|
|
17
|
+
SEARCH_ALL: 'searchAll',
|
|
18
|
+
SEARCH_ALL_TO_MAP: 'searchAllToMap',
|
|
19
|
+
BATCH_SEARCH_BY_HASH: 'batchSearchByHash',
|
|
20
|
+
BATCH_SEARCH_BY_HASH_TO_MAP: 'batchSearchByHashToMap',
|
|
21
|
+
GREATER_THAN: 'greaterThan',
|
|
22
|
+
_GREATER_THAN: 'greater_than',
|
|
23
|
+
GREATER_THAN_EQUAL: 'greaterThanEqual',
|
|
24
|
+
_GREATER_THAN_EQUAL: 'greater_than_equal',
|
|
25
|
+
LESS_THAN: 'lessThan',
|
|
26
|
+
_LESS_THAN: 'less_than',
|
|
27
|
+
LESS_THAN_EQUAL: 'lessThanEqual',
|
|
28
|
+
_LESS_THAN_EQUAL: 'less_than_equal',
|
|
29
|
+
BETWEEN: 'between',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const TIMESTAMP_NAMES = ['__createdtime__', '__updatedtime__'];
|
|
33
|
+
// This is appended to the end of keys that are larger than the max key size, as a marker to indicate
|
|
34
|
+
// the full value must be retrieved from the full record (from the hash/primary dbi) for operations
|
|
35
|
+
// that require the full value (contains and ends-with operators).
|
|
36
|
+
const OVERFLOW_MARKER = '\uffff';
|
|
37
|
+
|
|
38
|
+
const TRANSACTIONS_DBI_NAMES_ENUM = {
|
|
39
|
+
TIMESTAMP: 'timestamp',
|
|
40
|
+
HASH_VALUE: 'hash_value',
|
|
41
|
+
USER_NAME: 'user_name',
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const TRANSACTIONS_DBIS = Object.values(TRANSACTIONS_DBI_NAMES_ENUM);
|
|
45
|
+
|
|
46
|
+
module.exports = {
|
|
47
|
+
AUDIT_STORE_NAME,
|
|
48
|
+
INTERNAL_DBIS_NAME,
|
|
49
|
+
DBI_DEFINITION_NAME,
|
|
50
|
+
SEARCH_TYPES,
|
|
51
|
+
TIMESTAMP_NAMES,
|
|
52
|
+
MAX_SEARCH_KEY_LENGTH,
|
|
53
|
+
ENVIRONMENT_NAME_KEY,
|
|
54
|
+
TRANSACTIONS_DBI_NAMES_ENUM,
|
|
55
|
+
TRANSACTIONS_DBIS,
|
|
56
|
+
OVERFLOW_MARKER,
|
|
57
|
+
};
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const environmentUtil = require('./environmentUtility.js');
|
|
4
|
+
const InsertRecordsResponseObject = require('./InsertRecordsResponseObject.js');
|
|
5
|
+
const UpdateRecordsResponseObject = require('./UpdateRecordsResponseObject.js');
|
|
6
|
+
const UpsertRecordsResponseObject = require('./UpsertRecordsResponseObject.js');
|
|
7
|
+
const common = require('./commonUtility.js');
|
|
8
|
+
const LMDB_ERRORS = require('../errors/commonErrors.js').LMDB_ERRORS_ENUM;
|
|
9
|
+
const hdbTerms = require('../hdbTerms.ts');
|
|
10
|
+
const hdbUtils = require('../common_utils.js');
|
|
11
|
+
const uuid = require('uuid');
|
|
12
|
+
// eslint-disable-next-line no-unused-vars
|
|
13
|
+
const lmdb = require('lmdb');
|
|
14
|
+
const { handleHDBError, hdbErrors } = require('../errors/hdbError.js');
|
|
15
|
+
const envMngr = require('../environment/environmentManager.js');
|
|
16
|
+
envMngr.initSync();
|
|
17
|
+
|
|
18
|
+
const LMDB_PREFETCH_WRITES = envMngr.get(hdbTerms.CONFIG_PARAMS.STORAGE_PREFETCHWRITES);
|
|
19
|
+
|
|
20
|
+
const CREATED_TIME_ATTRIBUTE_NAME = hdbTerms.TIME_STAMP_NAMES_ENUM.CREATED_TIME;
|
|
21
|
+
const UPDATED_TIME_ATTRIBUTE_NAME = hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* inserts records into LMDB
|
|
25
|
+
* @param {lmdb.RootDatabase} env - lmdb environment object
|
|
26
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
27
|
+
* @param {Array.<String>} writeAttributes - list of all attributes to write to the database
|
|
28
|
+
* @param {Array.<Object>} records - object array records to insert
|
|
29
|
+
* @param {boolean|number} timestamp
|
|
30
|
+
* @returns {Promise<InsertRecordsResponseObject>}
|
|
31
|
+
*/
|
|
32
|
+
async function insertRecords(env, hash_attribute, writeAttributes, records, timestamp = common.getNextMonotonicTime()) {
|
|
33
|
+
validateWrite(env, hash_attribute, writeAttributes, records);
|
|
34
|
+
|
|
35
|
+
initializeTransaction(env, hash_attribute, writeAttributes);
|
|
36
|
+
|
|
37
|
+
let result = new InsertRecordsResponseObject();
|
|
38
|
+
|
|
39
|
+
let puts = [];
|
|
40
|
+
let keys = [];
|
|
41
|
+
for (let index = 0; index < records.length; index++) {
|
|
42
|
+
let record = records[index];
|
|
43
|
+
setTimestamps(record, true, timestamp);
|
|
44
|
+
|
|
45
|
+
let promise = insertRecord(env, hash_attribute, writeAttributes, record);
|
|
46
|
+
let hashValue = record[hash_attribute];
|
|
47
|
+
puts.push(promise);
|
|
48
|
+
keys.push(hashValue);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return finalizeWrite(puts, keys, records, result, timestamp);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
* @param {lmdb.RootDatabase} env - lmdb environment object
|
|
57
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
58
|
+
* @param {Array.<String>} writeAttributes - list of all attributes to write to the database
|
|
59
|
+
* @param {Object} record - the record to insert
|
|
60
|
+
* @returns {Promise<boolean>}
|
|
61
|
+
*/
|
|
62
|
+
function insertRecord(env, hash_attribute, writeAttributes, record) {
|
|
63
|
+
let hashValue = record[hash_attribute];
|
|
64
|
+
return env.dbis[hash_attribute].ifNoExists(hashValue, () => {
|
|
65
|
+
for (let x = 0; x < writeAttributes.length; x++) {
|
|
66
|
+
let attribute = writeAttributes[x];
|
|
67
|
+
|
|
68
|
+
//we do not process the write to the hash attribute as they are handled differently. Also skip if the attribute does not exist on the object
|
|
69
|
+
if (attribute === hash_attribute || record.hasOwnProperty(attribute) === false) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let value = record[attribute];
|
|
74
|
+
if (typeof value === 'function') {
|
|
75
|
+
let valueResults = value([[{}]]);
|
|
76
|
+
if (Array.isArray(valueResults)) {
|
|
77
|
+
value = valueResults[0][hdbTerms.FUNC_VAL];
|
|
78
|
+
record[attribute] = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let values = common.getIndexedValues(value);
|
|
83
|
+
let dbi = env.dbis[attribute];
|
|
84
|
+
if (values) {
|
|
85
|
+
if (LMDB_PREFETCH_WRITES)
|
|
86
|
+
dbi.prefetch(
|
|
87
|
+
values.map((v) => ({ key: v, value: hashValue })),
|
|
88
|
+
noop
|
|
89
|
+
);
|
|
90
|
+
for (let i = 0, l = values.length; i < l; i++) {
|
|
91
|
+
dbi.put(values[i], hashValue);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (LMDB_PREFETCH_WRITES) env.dbis[hash_attribute].prefetch([hashValue], noop);
|
|
96
|
+
env.dbis[hash_attribute].put(hashValue, record, record[UPDATED_TIME_ATTRIBUTE_NAME]);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* removes skipped records
|
|
102
|
+
* @param {[{}]}records
|
|
103
|
+
* @param {[number]}removeIndices
|
|
104
|
+
*/
|
|
105
|
+
function removeSkippedRecords(records, removeIndices = []) {
|
|
106
|
+
//remove the skipped entries from the records array
|
|
107
|
+
let offset = 0;
|
|
108
|
+
for (let x = 0; x < removeIndices.length; x++) {
|
|
109
|
+
let index = removeIndices[x];
|
|
110
|
+
records.splice(index - offset, 1);
|
|
111
|
+
//the offset needs to increase for every index we remove
|
|
112
|
+
offset++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* auto sets the createdtime & updatedtime stamps on a record
|
|
118
|
+
* @param {Object} record
|
|
119
|
+
* @param {Boolean} isInsert
|
|
120
|
+
* @param {number} timestamp - timestamp for this record (if omitted, don't set)
|
|
121
|
+
*/
|
|
122
|
+
function setTimestamps(record, isInsert, timestamp) {
|
|
123
|
+
let generateTimestamp = timestamp > 0;
|
|
124
|
+
if (generateTimestamp || !Number.isInteger(record[UPDATED_TIME_ATTRIBUTE_NAME])) {
|
|
125
|
+
record[UPDATED_TIME_ATTRIBUTE_NAME] = timestamp || (timestamp = common.getNextMonotonicTime());
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (isInsert === true) {
|
|
129
|
+
if (generateTimestamp || !Number.isInteger(record[CREATED_TIME_ATTRIBUTE_NAME])) {
|
|
130
|
+
record[CREATED_TIME_ATTRIBUTE_NAME] = timestamp || common.getNextMonotonicTime();
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
delete record[CREATED_TIME_ATTRIBUTE_NAME];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* makes sure all needed dbis are opened / created & starts the transaction
|
|
139
|
+
* @param {lmdb.RootDatabase} env - lmdb environment object
|
|
140
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
141
|
+
* @param {Array.<String>} writeAttributes - list of all attributes to write to the database
|
|
142
|
+
* @returns {*}
|
|
143
|
+
*/
|
|
144
|
+
function initializeTransaction(env, hash_attribute, writeAttributes) {
|
|
145
|
+
//dbis must be opened / created before starting the transaction
|
|
146
|
+
if (writeAttributes.indexOf(hdbTerms.TIME_STAMP_NAMES_ENUM.CREATED_TIME) < 0) {
|
|
147
|
+
writeAttributes.push(hdbTerms.TIME_STAMP_NAMES_ENUM.CREATED_TIME);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (writeAttributes.indexOf(hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME) < 0) {
|
|
151
|
+
writeAttributes.push(hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
environmentUtil.initializeDBIs(env, hash_attribute, writeAttributes);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* updates records into LMDB
|
|
159
|
+
* @param {lmdb.RootDatabase} env - lmdb environment object
|
|
160
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
161
|
+
* @param {Array.<String>} writeAttributes - list of all attributes to write to the database
|
|
162
|
+
* @param {Array.<Object>} records - object array records to update
|
|
163
|
+
* @param {boolean|number} timestamp
|
|
164
|
+
* @returns {Promise<UpdateRecordsResponseObject>}
|
|
165
|
+
*/
|
|
166
|
+
async function updateRecords(env, hash_attribute, writeAttributes, records, timestamp = common.getNextMonotonicTime()) {
|
|
167
|
+
//validate
|
|
168
|
+
validateWrite(env, hash_attribute, writeAttributes, records);
|
|
169
|
+
|
|
170
|
+
initializeTransaction(env, hash_attribute, writeAttributes);
|
|
171
|
+
|
|
172
|
+
let result = new UpdateRecordsResponseObject();
|
|
173
|
+
|
|
174
|
+
//iterate update records
|
|
175
|
+
let removeIndices = [];
|
|
176
|
+
let puts = [];
|
|
177
|
+
let keys = [];
|
|
178
|
+
for (let index = 0; index < records.length; index++) {
|
|
179
|
+
let record = records[index];
|
|
180
|
+
let hashValue = record[hash_attribute];
|
|
181
|
+
|
|
182
|
+
let promise;
|
|
183
|
+
try {
|
|
184
|
+
promise = updateUpsertRecord(env, hash_attribute, record, hashValue, result, true, timestamp);
|
|
185
|
+
} catch {
|
|
186
|
+
result.skipped_hashes.push(hashValue);
|
|
187
|
+
removeIndices.push(index);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
puts.push(promise);
|
|
191
|
+
keys.push(hashValue);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return finalizeWrite(puts, keys, records, result, timestamp, removeIndices);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* upserts records into LMDB
|
|
199
|
+
* @param {lmdb.RootDatabase} env - lmdb environment object
|
|
200
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
201
|
+
* @param {Array.<String>} writeAttributes - list of all attributes to write to the database
|
|
202
|
+
* @param {Array.<Object>} records - object array records to update
|
|
203
|
+
* @param {boolean|number} timestamp
|
|
204
|
+
* @returns {Promise<UpdateRecordsResponseObject>}
|
|
205
|
+
*/
|
|
206
|
+
async function upsertRecords(env, hash_attribute, writeAttributes, records, timestamp = common.getNextMonotonicTime()) {
|
|
207
|
+
//validate
|
|
208
|
+
try {
|
|
209
|
+
validateWrite(env, hash_attribute, writeAttributes, records);
|
|
210
|
+
} catch (err) {
|
|
211
|
+
throw handleHDBError(err, err.message, hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
initializeTransaction(env, hash_attribute, writeAttributes);
|
|
215
|
+
|
|
216
|
+
let result = new UpsertRecordsResponseObject();
|
|
217
|
+
|
|
218
|
+
let puts = [];
|
|
219
|
+
let keys = [];
|
|
220
|
+
//iterate upsert records
|
|
221
|
+
for (let index = 0; index < records.length; index++) {
|
|
222
|
+
let record = records[index];
|
|
223
|
+
let hashValue = undefined;
|
|
224
|
+
if (hdbUtils.isEmpty(record[hash_attribute])) {
|
|
225
|
+
hashValue = uuid.v4();
|
|
226
|
+
record[hash_attribute] = hashValue;
|
|
227
|
+
} else {
|
|
228
|
+
hashValue = record[hash_attribute];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// do an upsert without requiring the record to previously existed
|
|
232
|
+
let promise = updateUpsertRecord(env, hash_attribute, record, hashValue, result, false, timestamp);
|
|
233
|
+
puts.push(promise);
|
|
234
|
+
keys.push(hashValue);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return finalizeWrite(puts, keys, records, result, timestamp);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async function finalizeWrite(puts, keys, records, result, timestamp, removeIndices = []) {
|
|
241
|
+
let putResults = await Promise.all(puts);
|
|
242
|
+
for (let x = 0, length = putResults.length; x < length; x++) {
|
|
243
|
+
if (putResults[x] === true) {
|
|
244
|
+
result.written_hashes.push(keys[x]);
|
|
245
|
+
} else {
|
|
246
|
+
result.skipped_hashes.push(keys[x]);
|
|
247
|
+
removeIndices.push(x);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
result.txn_time = timestamp || common.getNextMonotonicTime();
|
|
252
|
+
|
|
253
|
+
removeSkippedRecords(records, removeIndices);
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* central function used by updateRecords & upsertRecords to write a row to lmdb
|
|
259
|
+
* @param {lmdb.RootDatabase} env
|
|
260
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
261
|
+
* @param {{}} record - the record to process
|
|
262
|
+
* @param {string|number} hashValue - the hash attribute value
|
|
263
|
+
* @param {UpdateRecordsResponseObject|UpsertRecordsResponseObject} result
|
|
264
|
+
* @param {boolean} Require existing record
|
|
265
|
+
* @param {number} timestamp
|
|
266
|
+
*/
|
|
267
|
+
function updateUpsertRecord(env, hash_attribute, record, hashValue, result, mustExist = false, timestamp) {
|
|
268
|
+
let primaryDbi = env.dbis[hash_attribute];
|
|
269
|
+
let existingEntry = primaryDbi.getEntry(hashValue);
|
|
270
|
+
let existingRecord = existingEntry?.value;
|
|
271
|
+
let hadExisting = existingRecord;
|
|
272
|
+
if (!existingRecord) {
|
|
273
|
+
if (mustExist) return false;
|
|
274
|
+
existingRecord = {};
|
|
275
|
+
}
|
|
276
|
+
setTimestamps(record, !hadExisting, timestamp);
|
|
277
|
+
if (
|
|
278
|
+
Number.isInteger(record[UPDATED_TIME_ATTRIBUTE_NAME]) &&
|
|
279
|
+
existingRecord[UPDATED_TIME_ATTRIBUTE_NAME] > record[UPDATED_TIME_ATTRIBUTE_NAME]
|
|
280
|
+
) {
|
|
281
|
+
// This is not an error condition in our world of last-record-wins
|
|
282
|
+
// replication. If the existing record is newer than it just means the provided record
|
|
283
|
+
// is, well... older. And newer records are supposed to "win" over older records, and that
|
|
284
|
+
// is normal, non-error behavior.
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
if (hadExisting) result.original_records.push(existingRecord);
|
|
288
|
+
let completion;
|
|
289
|
+
const doPut = () => {
|
|
290
|
+
// iterate the entries from the record
|
|
291
|
+
// for-in is about 5x as fast as for-of Object.entries, and this is extremely time sensitive since it is
|
|
292
|
+
// inside a write transaction
|
|
293
|
+
for (let key in record) {
|
|
294
|
+
if (!record.hasOwnProperty(key) || key === hash_attribute) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
let value = record[key];
|
|
298
|
+
let dbi = env.dbis[key];
|
|
299
|
+
if (dbi === undefined) {
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
let existingValue = existingRecord[key];
|
|
304
|
+
|
|
305
|
+
if (typeof value === 'function') {
|
|
306
|
+
let valueResults = value([[existingRecord]]);
|
|
307
|
+
if (Array.isArray(valueResults)) {
|
|
308
|
+
value = valueResults[0][hdbTerms.FUNC_VAL];
|
|
309
|
+
record[key] = value;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (value === existingValue) {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
//if the update cleared out the attribute value we need to delete it from the index
|
|
317
|
+
let values = common.getIndexedValues(existingValue);
|
|
318
|
+
if (values) {
|
|
319
|
+
if (LMDB_PREFETCH_WRITES)
|
|
320
|
+
dbi.prefetch(
|
|
321
|
+
values.map((v) => ({ key: v, value: hashValue })),
|
|
322
|
+
noop
|
|
323
|
+
);
|
|
324
|
+
for (let i = 0, l = values.length; i < l; i++) {
|
|
325
|
+
dbi.remove(values[i], hashValue);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
values = common.getIndexedValues(value);
|
|
329
|
+
if (values) {
|
|
330
|
+
if (LMDB_PREFETCH_WRITES)
|
|
331
|
+
dbi.prefetch(
|
|
332
|
+
values.map((v) => ({ key: v, value: hashValue })),
|
|
333
|
+
noop
|
|
334
|
+
);
|
|
335
|
+
for (let i = 0, l = values.length; i < l; i++) {
|
|
336
|
+
dbi.put(values[i], hashValue);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// there is no point in prefetching the main record since it was already retrieved for the merge
|
|
341
|
+
let mergedRecord = { ...existingRecord, ...record };
|
|
342
|
+
primaryDbi.put(hashValue, mergedRecord, mergedRecord[UPDATED_TIME_ATTRIBUTE_NAME]);
|
|
343
|
+
};
|
|
344
|
+
// use optimistic locking to only commit if the existing record state still holds true.
|
|
345
|
+
// this is superior to using an async transaction since it doesn't require JS execution
|
|
346
|
+
// during the write transaction.
|
|
347
|
+
if (existingEntry) completion = primaryDbi.ifVersion(hashValue, existingEntry.version, doPut);
|
|
348
|
+
else completion = primaryDbi.ifNoExists(hashValue, doPut);
|
|
349
|
+
return completion.then((success) => {
|
|
350
|
+
if (!success) {
|
|
351
|
+
// try again
|
|
352
|
+
return updateUpsertRecord(env, hash_attribute, record, hashValue, result, mustExist, timestamp);
|
|
353
|
+
}
|
|
354
|
+
return true;
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* common validation function for env, hash_attribute & fetchAttributes
|
|
360
|
+
* @param {lmdb.RootDatabase} env - lmdb environment object
|
|
361
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
362
|
+
* @param {Array.<String>} writeAttributes - list of all attributes to write to the database
|
|
363
|
+
*/
|
|
364
|
+
function validateBasic(env, hash_attribute, writeAttributes) {
|
|
365
|
+
common.validateEnv(env);
|
|
366
|
+
|
|
367
|
+
if (hash_attribute === undefined) {
|
|
368
|
+
throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (!Array.isArray(writeAttributes)) {
|
|
372
|
+
if (writeAttributes === undefined) {
|
|
373
|
+
throw new Error(LMDB_ERRORS.WRITE_ATTRIBUTES_REQUIRED);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
throw new Error(LMDB_ERRORS.WRITE_ATTRIBUTES_MUST_BE_ARRAY);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* validates the parameters for LMDB
|
|
382
|
+
* @param {lmdb.RootDatabase} env - lmdb environment object
|
|
383
|
+
* @param {String} hash_attribute - name of the table's hash attribute
|
|
384
|
+
* @param {Array.<String>} writeAttributes - list of all attributes to write to the database
|
|
385
|
+
* @param {Array.<Object>} records - object array records to insert
|
|
386
|
+
*/
|
|
387
|
+
function validateWrite(env, hash_attribute, writeAttributes, records) {
|
|
388
|
+
validateBasic(env, hash_attribute, writeAttributes);
|
|
389
|
+
|
|
390
|
+
if (!Array.isArray(records)) {
|
|
391
|
+
if (records === undefined) {
|
|
392
|
+
throw new Error(LMDB_ERRORS.RECORDS_REQUIRED);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
throw new Error(LMDB_ERRORS.RECORDS_MUST_BE_ARRAY);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function noop() {
|
|
400
|
+
// prefetch callback
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
module.exports = {
|
|
404
|
+
insertRecords,
|
|
405
|
+
updateRecords,
|
|
406
|
+
upsertRecords,
|
|
407
|
+
};
|