@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,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Response object from lmdb delete function
|
|
5
|
+
* @param {Array.<string|number>} deleted
|
|
6
|
+
* @param {Array.<string|number>} skipped
|
|
7
|
+
* @param {number} txnTime
|
|
8
|
+
* @param {Array.<Object>} originalRecords
|
|
9
|
+
*/
|
|
10
|
+
class DeleteRecordsResponseObject {
|
|
11
|
+
/**
|
|
12
|
+
* @param {Array.<string|number>} deleted
|
|
13
|
+
* @param {Array.<string|number>} skipped
|
|
14
|
+
* @param {number} txnTime
|
|
15
|
+
* @param {Array.<Object>} originalRecords
|
|
16
|
+
*/
|
|
17
|
+
constructor(deleted = [], skipped = [], txnTime = undefined, originalRecords = []) {
|
|
18
|
+
this.deleted = deleted;
|
|
19
|
+
this.skipped = skipped;
|
|
20
|
+
this.txn_time = txnTime;
|
|
21
|
+
this.original_records = originalRecords;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = DeleteRecordsResponseObject;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Response object from lmdb insert function
|
|
5
|
+
* @param {Array.<string|number>} written_hashes
|
|
6
|
+
* @param {Array.<string|number>} skipped_hashes
|
|
7
|
+
* @param {number} txnTime
|
|
8
|
+
*/
|
|
9
|
+
class InsertRecordsResponseObject {
|
|
10
|
+
/**
|
|
11
|
+
* @param {Array.<string|number>} written_hashes
|
|
12
|
+
* @param {Array.<string|number>} skipped_hashes
|
|
13
|
+
* @param {number} txnTime
|
|
14
|
+
*/
|
|
15
|
+
constructor(written_hashes = [], skipped_hashes = [], txnTime = undefined) {
|
|
16
|
+
this.written_hashes = written_hashes;
|
|
17
|
+
this.skipped_hashes = skipped_hashes;
|
|
18
|
+
this.txn_time = txnTime;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = InsertRecordsResponseObject;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const envMngr = require('../environment/environmentManager.js');
|
|
3
|
+
const terms = require('../../utility/hdbTerms.ts');
|
|
4
|
+
const { RecordEncoder } = require('../../resources/RecordEncoder.ts');
|
|
5
|
+
envMngr.initSync();
|
|
6
|
+
|
|
7
|
+
const LMDB_CACHING = envMngr.get(terms.CONFIG_PARAMS.STORAGE_CACHING) !== false;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Defines how a DBI will be created/opened
|
|
11
|
+
*/
|
|
12
|
+
class OpenDBIObject {
|
|
13
|
+
/**
|
|
14
|
+
* @param {Boolean} dupSort - if the dbi allows duplicate keys
|
|
15
|
+
* @param {Boolean} useVersions - if the dbi uses versions
|
|
16
|
+
*/
|
|
17
|
+
constructor(dupSort, isPrimary = false) {
|
|
18
|
+
this.dupSort = dupSort === true;
|
|
19
|
+
this.encoding = dupSort ? 'ordered-binary' : 'msgpack';
|
|
20
|
+
this.useVersions = isPrimary;
|
|
21
|
+
this.sharedStructuresKey = Symbol.for('structures');
|
|
22
|
+
if (isPrimary) {
|
|
23
|
+
this.cache = LMDB_CACHING && { validated: true };
|
|
24
|
+
this.randomAccessStructure = true;
|
|
25
|
+
this.freezeData = true;
|
|
26
|
+
this.encoder = { Encoder: RecordEncoder };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.OpenDBIObject = OpenDBIObject;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
//Set initial map size to 1Gb
|
|
3
|
+
// eslint-disable-next-line no-magic-numbers
|
|
4
|
+
const MAP_SIZE = 1024 * 1024 * 1024;
|
|
5
|
+
//allow up to 1,000 named data bases in an environment
|
|
6
|
+
const MAX_DBS = 10000;
|
|
7
|
+
const MAX_READERS = 2048;
|
|
8
|
+
const envMngr = require('../environment/environmentManager.js');
|
|
9
|
+
const terms = require('../../utility/hdbTerms.ts');
|
|
10
|
+
envMngr.initSync();
|
|
11
|
+
|
|
12
|
+
class OpenEnvironmentObject {
|
|
13
|
+
constructor(path, readOnly = false) {
|
|
14
|
+
this.path = path;
|
|
15
|
+
this.mapSize = MAP_SIZE;
|
|
16
|
+
this.maxDbs = MAX_DBS;
|
|
17
|
+
this.maxReaders = MAX_READERS;
|
|
18
|
+
this.sharedStructuresKey = Symbol.for('structures');
|
|
19
|
+
this.readOnly = readOnly;
|
|
20
|
+
this.trackMetrics = true;
|
|
21
|
+
this.eventTurnBatching = false; // event turn batching is not needed in Harper
|
|
22
|
+
this.noSync =
|
|
23
|
+
envMngr.get(terms.CONFIG_PARAMS.STORAGE_WRITEASYNC) === true ||
|
|
24
|
+
envMngr.get(terms.CONFIG_PARAMS.STORAGE_WRITEASYNC) === 'true' ||
|
|
25
|
+
envMngr.get(terms.CONFIG_PARAMS.STORAGE_WRITEASYNC) === 'TRUE';
|
|
26
|
+
//this.noFSAccess = true; // we might re-enable this if we want secure JS environments
|
|
27
|
+
// otherwise overlappingSync uses lmdb-js default, which is enabled on linux/mac, disabled on windows
|
|
28
|
+
if (envMngr.get(terms.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC) !== undefined)
|
|
29
|
+
this.overlappingSync = envMngr.get(terms.CONFIG_PARAMS.STORAGE_OVERLAPPINGSYNC);
|
|
30
|
+
if (envMngr.get(terms.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD))
|
|
31
|
+
this.maxFreeSpaceToLoad = envMngr.get(terms.CONFIG_PARAMS.STORAGE_MAXFREESPACETOLOAD);
|
|
32
|
+
if (envMngr.get(terms.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN))
|
|
33
|
+
this.maxFreeSpaceToRetain = envMngr.get(terms.CONFIG_PARAMS.STORAGE_MAXFREESPACETORETAIN);
|
|
34
|
+
if (envMngr.get(terms.CONFIG_PARAMS.STORAGE_PAGESIZE))
|
|
35
|
+
this.pageSize = envMngr.get(terms.CONFIG_PARAMS.STORAGE_PAGESIZE);
|
|
36
|
+
this.noReadAhead = envMngr.get(terms.CONFIG_PARAMS.STORAGE_NOREADAHEAD);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = OpenEnvironmentObject;
|
|
41
|
+
OpenEnvironmentObject.MAX_DBS = MAX_DBS;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Response object from lmdb update function
|
|
5
|
+
* @param {Array.<string|number>} written_hashes
|
|
6
|
+
* @param {Array.<string|number>} skipped_hashes
|
|
7
|
+
* @param {number} txnTime
|
|
8
|
+
* @param {Array.<Object>} originalRecords
|
|
9
|
+
*/
|
|
10
|
+
class UpdateRecordsResponseObject {
|
|
11
|
+
/**
|
|
12
|
+
* @param {Array.<string|number>} written_hashes
|
|
13
|
+
* @param {Array.<string|number>} skipped_hashes
|
|
14
|
+
* @param {number} txnTime
|
|
15
|
+
* @param {Array.<Object>} originalRecords
|
|
16
|
+
*/
|
|
17
|
+
constructor(written_hashes = [], skipped_hashes = [], txnTime = undefined, originalRecords = []) {
|
|
18
|
+
this.written_hashes = written_hashes;
|
|
19
|
+
this.skipped_hashes = skipped_hashes;
|
|
20
|
+
this.txn_time = txnTime;
|
|
21
|
+
this.original_records = originalRecords;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = UpdateRecordsResponseObject;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Response object from lmdb upsert function
|
|
5
|
+
* @param {Array.<string|number>} written_hashes
|
|
6
|
+
* @param {number} txnTime
|
|
7
|
+
* @param {Array.<Object>} originalRecords
|
|
8
|
+
*/
|
|
9
|
+
class UpsertRecordsResponseObject {
|
|
10
|
+
/**
|
|
11
|
+
* @param {Array.<string|number>} written_hashes
|
|
12
|
+
* @param {number} txnTime
|
|
13
|
+
* @param {Array.<Object>} originalRecords
|
|
14
|
+
*/
|
|
15
|
+
constructor(written_hashes = [], txnTime = undefined, originalRecords = []) {
|
|
16
|
+
this.written_hashes = written_hashes;
|
|
17
|
+
this.txn_time = txnTime;
|
|
18
|
+
this.original_records = originalRecords;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = UpsertRecordsResponseObject;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const environmentUtility = require('./environmentUtility.js');
|
|
4
|
+
const harperLogger = require('../logging/harper_logger.js');
|
|
5
|
+
const LMDB_ERRORS = require('../errors/commonErrors.js').LMDB_ERRORS_ENUM;
|
|
6
|
+
|
|
7
|
+
module.exports = cleanLMDBMap;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* this function strips away the cached environments from global when a schema item is removed
|
|
11
|
+
* @param msg
|
|
12
|
+
*/
|
|
13
|
+
async function cleanLMDBMap(msg) {
|
|
14
|
+
try {
|
|
15
|
+
if (global.lmdb_map !== undefined && msg.operation !== undefined) {
|
|
16
|
+
let keys = Object.keys(global.lmdb_map);
|
|
17
|
+
let cachedEnvironment = undefined;
|
|
18
|
+
|
|
19
|
+
switch (msg.operation) {
|
|
20
|
+
case 'drop_schema':
|
|
21
|
+
for (let x = 0; x < keys.length; x++) {
|
|
22
|
+
let key = keys[x];
|
|
23
|
+
if (key.startsWith(`${msg.schema}.`) || key.startsWith(`txn.${msg.schema}.`)) {
|
|
24
|
+
try {
|
|
25
|
+
await environmentUtility.closeEnvironment(global.lmdb_map[key]);
|
|
26
|
+
} catch (err) {
|
|
27
|
+
if (err.message !== LMDB_ERRORS.ENV_REQUIRED) {
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
case 'drop_table':
|
|
35
|
+
// eslint-disable-next-line no-case-declarations
|
|
36
|
+
let schemaTableName = `${msg.schema}.${msg.table}`;
|
|
37
|
+
// eslint-disable-next-line no-case-declarations
|
|
38
|
+
let txnSchemaTableName = `txn.${schemaTableName}`;
|
|
39
|
+
try {
|
|
40
|
+
await environmentUtility.closeEnvironment(global.lmdb_map[schemaTableName]);
|
|
41
|
+
await environmentUtility.closeEnvironment(global.lmdb_map[txnSchemaTableName]);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
if (err.message !== LMDB_ERRORS.ENV_REQUIRED) {
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
case 'drop_attribute':
|
|
49
|
+
cachedEnvironment = global.lmdb_map[`${msg.schema}.${msg.table}`];
|
|
50
|
+
if (
|
|
51
|
+
cachedEnvironment !== undefined &&
|
|
52
|
+
typeof cachedEnvironment.dbis === 'object' &&
|
|
53
|
+
cachedEnvironment.dbis[`${msg.attribute}`] !== undefined
|
|
54
|
+
) {
|
|
55
|
+
delete cachedEnvironment.dbis[`${msg.attribute}`];
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} catch (e) {
|
|
63
|
+
harperLogger.error(e);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const LMDB_ERRORS = require('../errors/commonErrors.js').LMDB_ERRORS_ENUM;
|
|
4
|
+
// eslint-disable-next-line no-unused-vars
|
|
5
|
+
const lmdb = require('lmdb');
|
|
6
|
+
const lmdbTerms = require('./terms.js');
|
|
7
|
+
|
|
8
|
+
const { OVERFLOW_MARKER, MAX_SEARCH_KEY_LENGTH } = lmdbTerms;
|
|
9
|
+
const PRIMITIVES = ['number', 'string', 'symbol', 'boolean', 'bigint'];
|
|
10
|
+
/**
|
|
11
|
+
* validates the env argument
|
|
12
|
+
* @param {lmdb.Transaction|lmdb.RootDatabase} env - environment object used thigh level to interact with all data in an
|
|
13
|
+
* environment
|
|
14
|
+
*/
|
|
15
|
+
function validateEnv(env) {
|
|
16
|
+
env = env?.primaryStore || env;
|
|
17
|
+
if (!env) {
|
|
18
|
+
throw new Error(LMDB_ERRORS.ENV_REQUIRED);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* converts raw data to it's string version
|
|
24
|
+
* @param rawValue
|
|
25
|
+
* @returns {Number|String|null}
|
|
26
|
+
*/
|
|
27
|
+
function stringifyData(rawValue) {
|
|
28
|
+
if (rawValue === null || rawValue === undefined) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let value;
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
value = typeof rawValue === 'object' ? JSON.stringify(rawValue) : rawValue.toString();
|
|
36
|
+
} catch {
|
|
37
|
+
value = rawValue.toString();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* takes a raw value and converts it to be written to LMDB. lmdb-store accepts primitives ('number', 'string', 'symbol', 'boolean', 'bigint', buffer) and array of primitives as keys.
|
|
45
|
+
* if it is anything else we convert to string
|
|
46
|
+
* @param {*} key - raw value which needs to be converted
|
|
47
|
+
* @returns {*}
|
|
48
|
+
*/
|
|
49
|
+
function convertKeyValueToWrite(key) {
|
|
50
|
+
//if this is a primitive return the value
|
|
51
|
+
if (key instanceof Date) {
|
|
52
|
+
return key.valueOf();
|
|
53
|
+
}
|
|
54
|
+
return key;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Return all the indexable values from an attribute, ready to be indexed
|
|
59
|
+
*/
|
|
60
|
+
function getIndexedValues(value, indexNulls) {
|
|
61
|
+
if (value === null) {
|
|
62
|
+
return indexNulls ? [null] : undefined;
|
|
63
|
+
}
|
|
64
|
+
if (value === undefined) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
if (PRIMITIVES.includes(typeof value)) {
|
|
68
|
+
if (value.length > MAX_SEARCH_KEY_LENGTH) {
|
|
69
|
+
return [value.slice(0, MAX_SEARCH_KEY_LENGTH) + OVERFLOW_MARKER];
|
|
70
|
+
}
|
|
71
|
+
return [value];
|
|
72
|
+
}
|
|
73
|
+
if (Array.isArray(value)) {
|
|
74
|
+
const values = [];
|
|
75
|
+
for (let i = 0, l = value.length; i < l; i++) {
|
|
76
|
+
let element = value[i];
|
|
77
|
+
if (PRIMITIVES.includes(typeof element)) {
|
|
78
|
+
if (element.length > MAX_SEARCH_KEY_LENGTH) {
|
|
79
|
+
values.push(element.slice(0, MAX_SEARCH_KEY_LENGTH) + OVERFLOW_MARKER);
|
|
80
|
+
} else {
|
|
81
|
+
values.push(element);
|
|
82
|
+
}
|
|
83
|
+
} else if (element === null && indexNulls) {
|
|
84
|
+
values.push(null);
|
|
85
|
+
} else if (element instanceof Date) {
|
|
86
|
+
values.push(element.getTime());
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return values;
|
|
90
|
+
} else if (value instanceof Date) {
|
|
91
|
+
return [value.getTime()];
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
let lastTime = 0; // reported time used to ensure monotonic time.
|
|
97
|
+
let startTime = 0; // the start time of the (current time relative to performance time counter)
|
|
98
|
+
function adjustStartTime() {
|
|
99
|
+
// calculate the start time
|
|
100
|
+
// TODO: We may actually want to implement a gradual time shift if the clock time really changes substantially
|
|
101
|
+
// and for sub-millisecond updates, may want to average them so we can progressively narrow in on true time
|
|
102
|
+
startTime = Date.now() - performance.now();
|
|
103
|
+
}
|
|
104
|
+
adjustStartTime();
|
|
105
|
+
// we periodically update our start time because clock time can drift (but we still ensure monotonic time)
|
|
106
|
+
const TIME_ADJUSTMENT_INTERVAL = 60000;
|
|
107
|
+
setInterval(adjustStartTime, TIME_ADJUSTMENT_INTERVAL).unref();
|
|
108
|
+
/**
|
|
109
|
+
* A monotonic timestamp that is guaranteed to be higher than the last call to this function.
|
|
110
|
+
* Will use decimal microseconds as necessary to differentiate from previous calls without too much drift.
|
|
111
|
+
*/
|
|
112
|
+
function getNextMonotonicTime() {
|
|
113
|
+
let now = performance.now() + startTime;
|
|
114
|
+
if (now > lastTime) {
|
|
115
|
+
// current time is higher than last time, can safely return it
|
|
116
|
+
lastTime = now;
|
|
117
|
+
return now;
|
|
118
|
+
}
|
|
119
|
+
// otherwise, we MUST return a higher time than last time, so we increase the time and return it.
|
|
120
|
+
// increment by as small of count as possible, to minimize how far we are from clock time
|
|
121
|
+
lastTime += 0.000488;
|
|
122
|
+
return lastTime;
|
|
123
|
+
}
|
|
124
|
+
module.exports = {
|
|
125
|
+
validateEnv,
|
|
126
|
+
stringifyData,
|
|
127
|
+
convertKeyValueToWrite,
|
|
128
|
+
getNextMonotonicTime,
|
|
129
|
+
getIndexedValues,
|
|
130
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const environmentUtil = require('./environmentUtility.js');
|
|
4
|
+
const common = require('./commonUtility.js');
|
|
5
|
+
const LMDB_ERRORS = require('../errors/commonErrors.js').LMDB_ERRORS_ENUM;
|
|
6
|
+
const log = require('../logging/harper_logger.js');
|
|
7
|
+
// eslint-disable-next-line no-unused-vars
|
|
8
|
+
const lmdb = require('lmdb');
|
|
9
|
+
const DeleteRecordsResponseObject = require('./DeleteRecordsResponseObject.js');
|
|
10
|
+
const hdbTerms = require('../hdbTerms.ts');
|
|
11
|
+
const UPDATED_TIME_ATTRIBUTE_NAME = hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* deletes rows and their entries in all indices
|
|
15
|
+
* @param {lmdb.RootDatabase} env - environment object used high level to interact with all data in an environment
|
|
16
|
+
* @param {String} hash_attribute - name of the hash_attribute for this environment
|
|
17
|
+
* @param {Array.<String>} ids - list of ids to delete
|
|
18
|
+
* @param {number} whenDeleted - The timestamp of the deletion
|
|
19
|
+
* @returns {Promise<DeleteRecordsResponseObject>}
|
|
20
|
+
*/
|
|
21
|
+
async function deleteRecords(env, hash_attribute, ids, whenDeleted) {
|
|
22
|
+
//validate
|
|
23
|
+
common.validateEnv(env);
|
|
24
|
+
|
|
25
|
+
if (hash_attribute === undefined) {
|
|
26
|
+
throw new Error(LMDB_ERRORS.HASH_ATTRIBUTE_REQUIRED);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!Array.isArray(ids)) {
|
|
30
|
+
if (ids === undefined) {
|
|
31
|
+
throw new Error(LMDB_ERRORS.IDS_REQUIRED);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
throw new Error(LMDB_ERRORS.IDS_MUST_BE_ITERABLE);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
//open all dbis for this env
|
|
39
|
+
let allDbis = environmentUtil.listDBIs(env);
|
|
40
|
+
environmentUtil.initializeDBIs(env, hash_attribute, allDbis);
|
|
41
|
+
let deleted = new DeleteRecordsResponseObject();
|
|
42
|
+
|
|
43
|
+
//iterate records and process deletes
|
|
44
|
+
let hashValue;
|
|
45
|
+
let puts = [];
|
|
46
|
+
let keys = [];
|
|
47
|
+
for (let x = 0, length = ids.length; x < length; x++) {
|
|
48
|
+
try {
|
|
49
|
+
hashValue = ids[x];
|
|
50
|
+
|
|
51
|
+
//attempt to fetch the hash attribute value, this is the row.
|
|
52
|
+
let record = env.dbis[hash_attribute].get(hashValue);
|
|
53
|
+
//if it doesn't exist we skip & move to the next id
|
|
54
|
+
if (
|
|
55
|
+
!record ||
|
|
56
|
+
// of if the deletion timestamp is older than the current record, last-write wins
|
|
57
|
+
(whenDeleted && record[UPDATED_TIME_ATTRIBUTE_NAME] > whenDeleted)
|
|
58
|
+
) {
|
|
59
|
+
deleted.skipped.push(hashValue);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let promise = env.dbis[hash_attribute].ifVersion(hashValue, lmdb.IF_EXISTS, () => {
|
|
64
|
+
//always just delete the hash_attribute entry upfront
|
|
65
|
+
env.dbis[hash_attribute].remove(hashValue);
|
|
66
|
+
|
|
67
|
+
//iterate & delete the non-hash attribute entries
|
|
68
|
+
for (let y = 0; y < allDbis.length; y++) {
|
|
69
|
+
let attribute = allDbis[y];
|
|
70
|
+
if (!record.hasOwnProperty(attribute) || attribute === hash_attribute) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let dbi = env.dbis[attribute];
|
|
75
|
+
let value = record[attribute];
|
|
76
|
+
if (value !== null && value !== undefined) {
|
|
77
|
+
try {
|
|
78
|
+
let values = common.getIndexedValues(value);
|
|
79
|
+
if (values) {
|
|
80
|
+
for (let i = 0, l = values.length; i < l; i++) {
|
|
81
|
+
dbi.remove(values[i], hashValue);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
log.warn(`cannot delete from attribute: ${attribute}, ${value}:${hashValue}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
puts.push(promise);
|
|
91
|
+
keys.push(hashValue);
|
|
92
|
+
deleted.original_records.push(record);
|
|
93
|
+
} catch (e) {
|
|
94
|
+
log.warn(e);
|
|
95
|
+
deleted.skipped.push(hashValue);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
let removeIndices = [];
|
|
100
|
+
let putResults = await Promise.all(puts);
|
|
101
|
+
for (let x = 0, length = putResults.length; x < length; x++) {
|
|
102
|
+
if (putResults[x] === true) {
|
|
103
|
+
deleted.deleted.push(keys[x]);
|
|
104
|
+
} else {
|
|
105
|
+
deleted.skipped.push(keys[x]);
|
|
106
|
+
removeIndices.push(x);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
let offset = 0;
|
|
111
|
+
for (let x = 0; x < removeIndices.length; x++) {
|
|
112
|
+
let index = removeIndices[x];
|
|
113
|
+
deleted.original_records.splice(index - offset, 1);
|
|
114
|
+
//the offset needs to increase for every index we remove
|
|
115
|
+
offset++;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
deleted.txn_time = common.getNextMonotonicTime();
|
|
119
|
+
|
|
120
|
+
return deleted;
|
|
121
|
+
} catch (e) {
|
|
122
|
+
throw e;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
module.exports = {
|
|
127
|
+
deleteRecords,
|
|
128
|
+
};
|