@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.1
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/components/Logger.js +3 -0
- 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 +16 -9
- 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/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 +4 -1
- 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 +243 -66
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +4 -5
- 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 +50 -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 +1 -0
- 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 +21 -3
- 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/ResourceInterfaceV2.ts +53 -0
- package/resources/ResourceV2.ts +67 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4527 -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 +716 -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 +594 -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-BTgXJX9d.js +235 -0
- package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
- package/studio/web/assets/index-C-GXfcup.js +37 -0
- package/studio/web/assets/index-C-GXfcup.js.map +1 -0
- package/studio/web/assets/index-PFlNdimM.js +2 -0
- package/studio/web/assets/index-PFlNdimM.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-C3TJZJ4o.js +266 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
- package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
- package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
- package/studio/web/assets/startRecording-B_9J9Csd.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 +119 -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/v1.d.ts +39 -0
- package/v1.js +41 -0
- package/v2.d.ts +39 -0
- package/v2.js +41 -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/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,207 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
|
|
4
|
+
const lmdbTerms = require('../../../../utility/lmdb/terms.js');
|
|
5
|
+
const hdbTerms = require('../../../../utility/hdbTerms.ts');
|
|
6
|
+
const hdbUtils = require('../../../../utility/common_utils.js');
|
|
7
|
+
const { getTransactionAuditStorePath } = require('../lmdbUtility/initializePaths.js');
|
|
8
|
+
const searchUtility = require('../../../../utility/lmdb/searchUtility.js');
|
|
9
|
+
const LMDBTransactionObject = require('../lmdbUtility/LMDBTransactionObject.js');
|
|
10
|
+
const log = require('../../../../utility/logging/harper_logger.js');
|
|
11
|
+
|
|
12
|
+
module.exports = readAuditLog;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* function execute the readTransactionLog operation
|
|
16
|
+
* @param {ReadAuditLogObject} readAuditLogObj
|
|
17
|
+
* @returns {Promise<[]>}
|
|
18
|
+
*/
|
|
19
|
+
async function readAuditLog(readAuditLogObj) {
|
|
20
|
+
let basePath = getTransactionAuditStorePath(readAuditLogObj.schema, readAuditLogObj.table);
|
|
21
|
+
let env = await environmentUtility.openEnvironment(basePath, readAuditLogObj.table, true);
|
|
22
|
+
let allDbis = environmentUtility.listDBIs(env);
|
|
23
|
+
|
|
24
|
+
environmentUtility.initializeDBIs(env, lmdbTerms.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP, allDbis);
|
|
25
|
+
let hash_attribute;
|
|
26
|
+
switch (readAuditLogObj.search_type) {
|
|
27
|
+
case hdbTerms.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.TIMESTAMP:
|
|
28
|
+
return searchTransactionsByTimestamp(env, readAuditLogObj.search_values);
|
|
29
|
+
case hdbTerms.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:
|
|
30
|
+
//get the hash attribute
|
|
31
|
+
hash_attribute = global.hdb_schema[readAuditLogObj.schema][readAuditLogObj.table].hash_attribute;
|
|
32
|
+
return searchTransactionsByHashValues(env, readAuditLogObj.search_values, hash_attribute);
|
|
33
|
+
case hdbTerms.READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME:
|
|
34
|
+
return searchTransactionsByUsername(env, readAuditLogObj.search_values);
|
|
35
|
+
default:
|
|
36
|
+
return searchTransactionsByTimestamp(env);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
*
|
|
42
|
+
* @param {lmdb.RootDatabase} env
|
|
43
|
+
* @param {[number]} timestamps - this must be undefined or a 1 or 2 element numeric array, representing a start timestamp & end end timestamp (element 1 must be less than element 2).
|
|
44
|
+
* If undefined or empty array is passed the function will iterate the entire transaction log.
|
|
45
|
+
* If only 1 element is supplied the second will be set to now UTC and the transaction log will be traversed from the designated start time until now.
|
|
46
|
+
* If 2 elements are supplied the transaction log will be read between the two timestamps
|
|
47
|
+
*/
|
|
48
|
+
function searchTransactionsByTimestamp(env, timestamps = [0, Date.now()]) {
|
|
49
|
+
if (hdbUtils.isEmpty(timestamps[0])) {
|
|
50
|
+
timestamps[0] = 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (hdbUtils.isEmpty(timestamps[1])) {
|
|
54
|
+
timestamps[1] = Date.now();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let timestampDbi = env.dbis[lmdbTerms.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP];
|
|
58
|
+
|
|
59
|
+
//advance the endValue by 1 key
|
|
60
|
+
let nextValue;
|
|
61
|
+
for (let key of timestampDbi.getKeys({ start: timestamps[1] })) {
|
|
62
|
+
if (key !== timestamps[1]) {
|
|
63
|
+
nextValue = key;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return timestampDbi
|
|
69
|
+
.getRange({ start: timestamps[0], end: nextValue })
|
|
70
|
+
.map(({ value }) => Object.assign(new LMDBTransactionObject(), value));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
* @param {lmdb.RootDatabase} env
|
|
76
|
+
* @param {[string]} usernames
|
|
77
|
+
*/
|
|
78
|
+
function searchTransactionsByUsername(env, usernames = []) {
|
|
79
|
+
let results = new Map();
|
|
80
|
+
for (let x = 0; x < usernames.length; x++) {
|
|
81
|
+
let username = usernames[x];
|
|
82
|
+
|
|
83
|
+
let ids = [];
|
|
84
|
+
for (let value of env.dbis[lmdbTerms.TRANSACTIONS_DBI_NAMES_ENUM.USER_NAME].getValues(username)) {
|
|
85
|
+
ids.push(value);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
results.set(username, batchSearchTransactions(env, ids));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return Object.fromEntries(results);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
*
|
|
96
|
+
* @param {lmdb.RootDatabase} env
|
|
97
|
+
* @param {[string]} hash_values
|
|
98
|
+
* @param {string} hash_attribute
|
|
99
|
+
*/
|
|
100
|
+
function searchTransactionsByHashValues(env, hash_values, hash_attribute) {
|
|
101
|
+
let timestampHashMap = new Map();
|
|
102
|
+
for (let x = 0, length = hash_values.length; x < length; x++) {
|
|
103
|
+
let hashValue = hash_values[x];
|
|
104
|
+
let hashResults = searchUtility.equals(
|
|
105
|
+
env,
|
|
106
|
+
lmdbTerms.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP,
|
|
107
|
+
lmdbTerms.TRANSACTIONS_DBI_NAMES_ENUM.HASH_VALUE,
|
|
108
|
+
hashValue
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
for (let { value } of hashResults) {
|
|
112
|
+
let numberKey = Number(value);
|
|
113
|
+
if (timestampHashMap.has(numberKey)) {
|
|
114
|
+
let entry = timestampHashMap.get(numberKey);
|
|
115
|
+
entry.push(hashValue.toString());
|
|
116
|
+
} else {
|
|
117
|
+
timestampHashMap.set(numberKey, [hashValue.toString()]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
let ids = Array.from(timestampHashMap.keys());
|
|
122
|
+
let txns = batchSearchTransactions(env, ids);
|
|
123
|
+
|
|
124
|
+
let resultsMap = new Map();
|
|
125
|
+
//iterate txns & pull out just the records related to the hash
|
|
126
|
+
for (let x = 0; x < txns.length; x++) {
|
|
127
|
+
let transaction = txns[x];
|
|
128
|
+
let timestamp = transaction.timestamp;
|
|
129
|
+
let hashes = timestampHashMap.get(timestamp);
|
|
130
|
+
|
|
131
|
+
loopRecords(transaction, 'records', hash_attribute, hashes, resultsMap);
|
|
132
|
+
|
|
133
|
+
loopRecords(transaction, 'original_records', hash_attribute, hashes, resultsMap);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return Object.fromEntries(resultsMap);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
*
|
|
141
|
+
* @param transaction
|
|
142
|
+
* @param recordsAttribute
|
|
143
|
+
* @param hash_attribute
|
|
144
|
+
* @param hashes
|
|
145
|
+
* @param resultsMap
|
|
146
|
+
*/
|
|
147
|
+
function loopRecords(transaction, recordsAttribute, hash_attribute, hashes, resultsMap) {
|
|
148
|
+
let timestamp = transaction.timestamp;
|
|
149
|
+
|
|
150
|
+
if (transaction[recordsAttribute]) {
|
|
151
|
+
for (let y = 0; y < transaction[recordsAttribute].length; y++) {
|
|
152
|
+
let record = transaction[recordsAttribute][y];
|
|
153
|
+
let hashValue = record[hash_attribute].toString();
|
|
154
|
+
if (hashes.indexOf(hashValue) >= 0) {
|
|
155
|
+
if (resultsMap.has(hashValue)) {
|
|
156
|
+
let txnObjects = resultsMap.get(hashValue);
|
|
157
|
+
let txnObject = txnObjects[txnObjects.length - 1];
|
|
158
|
+
|
|
159
|
+
if (txnObject.timestamp === timestamp) {
|
|
160
|
+
txnObject[recordsAttribute] = [record];
|
|
161
|
+
} else {
|
|
162
|
+
let newTxnObject = new LMDBTransactionObject(
|
|
163
|
+
transaction.operation,
|
|
164
|
+
transaction.user_name,
|
|
165
|
+
timestamp,
|
|
166
|
+
undefined
|
|
167
|
+
);
|
|
168
|
+
newTxnObject[recordsAttribute] = [record];
|
|
169
|
+
txnObjects.push(newTxnObject);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
let txnObject = new LMDBTransactionObject(transaction.operation, transaction.user_name, timestamp, undefined);
|
|
173
|
+
txnObject[recordsAttribute] = [record];
|
|
174
|
+
resultsMap.set(hashValue, [txnObject]);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
*
|
|
183
|
+
* @param env
|
|
184
|
+
* @param ids
|
|
185
|
+
* @returns {[LMDBTransactionObject]}
|
|
186
|
+
*/
|
|
187
|
+
function batchSearchTransactions(env, ids) {
|
|
188
|
+
let results = [];
|
|
189
|
+
try {
|
|
190
|
+
//this sorts the ids numerically asc
|
|
191
|
+
let timestampDbi = env.dbis[lmdbTerms.TRANSACTIONS_DBI_NAMES_ENUM.TIMESTAMP];
|
|
192
|
+
for (let x = 0; x < ids.length; x++) {
|
|
193
|
+
try {
|
|
194
|
+
let value = timestampDbi.get(ids[x]);
|
|
195
|
+
if (value) {
|
|
196
|
+
let txnRecord = Object.assign(new LMDBTransactionObject(), value);
|
|
197
|
+
results.push(txnRecord);
|
|
198
|
+
}
|
|
199
|
+
} catch (e) {
|
|
200
|
+
log.warn(e);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return results;
|
|
204
|
+
} catch (e) {
|
|
205
|
+
throw e;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line no-unused-vars
|
|
4
|
+
const { SearchByConditionsObject, SearchCondition } = require('../../../SearchByConditionsObject.js');
|
|
5
|
+
const SearchObject = require('../../../SearchObject.js');
|
|
6
|
+
const searchValidator = require('../../../../validation/searchValidator.js');
|
|
7
|
+
const searchUtility = require('../../../../utility/lmdb/searchUtility.js');
|
|
8
|
+
const lmdbTerms = require('../../../../utility/lmdb/terms.js');
|
|
9
|
+
const lmdb_search = require('../lmdbUtility/lmdbSearch.js');
|
|
10
|
+
const cursorFunctions = require('../../../../utility/lmdb/searchCursorFunctions.js');
|
|
11
|
+
const _ = require('lodash');
|
|
12
|
+
const { getSchemaPath } = require('../lmdbUtility/initializePaths.js');
|
|
13
|
+
const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
|
|
14
|
+
const { handleHDBError, hdbErrors } = require('../../../../utility/errors/hdbError.js');
|
|
15
|
+
const { HTTP_STATUS_CODES } = hdbErrors;
|
|
16
|
+
const RANGE_ESTIMATE = 100000000;
|
|
17
|
+
|
|
18
|
+
module.exports = lmdbSearchByConditions;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* gets records by conditions - returns array of Objects
|
|
22
|
+
* @param {SearchByConditionsObject} searchObject
|
|
23
|
+
* @returns {Array.<Object>}
|
|
24
|
+
*/
|
|
25
|
+
async function lmdbSearchByConditions(searchObject) {
|
|
26
|
+
let validationError = searchValidator(searchObject, 'conditions');
|
|
27
|
+
if (validationError) {
|
|
28
|
+
throw handleHDBError(
|
|
29
|
+
validationError,
|
|
30
|
+
validationError.message,
|
|
31
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
32
|
+
undefined,
|
|
33
|
+
undefined,
|
|
34
|
+
true
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//set the operator to always be lowercase for later evaluations
|
|
39
|
+
searchObject.operator = searchObject.operator ? searchObject.operator.toLowerCase() : undefined;
|
|
40
|
+
|
|
41
|
+
searchObject.offset = Number.isInteger(searchObject.offset) ? searchObject.offset : 0;
|
|
42
|
+
let schemaPath = getSchemaPath(searchObject.schema, searchObject.table);
|
|
43
|
+
let env = await environmentUtility.openEnvironment(schemaPath, searchObject.table);
|
|
44
|
+
|
|
45
|
+
const tableInfo = global.hdb_schema[searchObject.schema][searchObject.table];
|
|
46
|
+
|
|
47
|
+
// make sure the dbis have been opened prior to the read transaction starting
|
|
48
|
+
for (let condition of searchObject.conditions) {
|
|
49
|
+
environmentUtility.openDBI(env, condition.attribute);
|
|
50
|
+
}
|
|
51
|
+
// Sort the conditions by narrowest to broadest. Note that we want to do this both for intersection where
|
|
52
|
+
// it allows us to do minimal filtering, and for union where we can return the fastest results first
|
|
53
|
+
// in an iterator/stream.
|
|
54
|
+
let sortedConditions = _.sortBy(searchObject.conditions, (condition) => {
|
|
55
|
+
if (condition.estimated_count === undefined) {
|
|
56
|
+
// skip if it is cached
|
|
57
|
+
let searchType = condition.comparator;
|
|
58
|
+
if (searchType === lmdbTerms.SEARCH_TYPES.EQUALS)
|
|
59
|
+
// we only attempt to estimate count on equals operator because that's really all that LMDB supports (some other key-value stores like libmdbx could be considered if we need to do estimated counts of ranges at some point)
|
|
60
|
+
condition.estimated_count = searchUtility.count(env, condition.attribute, condition.value);
|
|
61
|
+
else if (searchType === lmdbTerms.SEARCH_TYPES.CONTAINS || searchType === lmdbTerms.SEARCH_TYPES.ENDS_WITH)
|
|
62
|
+
condition.estimated_count = Infinity;
|
|
63
|
+
// this search types can't/doesn't use indices, so try do them last
|
|
64
|
+
// for range queries (betweens, starts-with, greater, etc.), just arbitrarily guess
|
|
65
|
+
else condition.estimated_count = RANGE_ESTIMATE;
|
|
66
|
+
}
|
|
67
|
+
return condition.estimated_count; // use cached count
|
|
68
|
+
});
|
|
69
|
+
// we create the read transaction after ensuring that the dbis have been opened (necessary for a stable read
|
|
70
|
+
// transaction, and we really don't care if the
|
|
71
|
+
// counts are done in the same read transaction because they are just estimates.
|
|
72
|
+
let transaction = env.useReadTransaction();
|
|
73
|
+
transaction.database = env;
|
|
74
|
+
// both AND and OR start by getting an iterator for the ids for first condition
|
|
75
|
+
let ids = await executeConditionSearch(transaction, searchObject, sortedConditions[0], tableInfo.hash_attribute);
|
|
76
|
+
// and then things diverge...
|
|
77
|
+
let records;
|
|
78
|
+
if (!searchObject.operator || searchObject.operator.toLowerCase() === 'and') {
|
|
79
|
+
// get the intersection of condition searches by using the indexed query for the first condition
|
|
80
|
+
// and then filtering by all subsequent conditions
|
|
81
|
+
let primaryDbi = env.dbis[tableInfo.hash_attribute];
|
|
82
|
+
let filters = sortedConditions.slice(1).map(lmdb_search.filterByType);
|
|
83
|
+
let filtersLength = filters.length;
|
|
84
|
+
let fetchAttributes = searchUtility.setGetWholeRowAttributes(env, searchObject.get_attributes);
|
|
85
|
+
records = ids.map((id) => primaryDbi.get(id, { transaction, lazy: true }));
|
|
86
|
+
if (filtersLength > 0)
|
|
87
|
+
records = records.filter((record) => {
|
|
88
|
+
for (let i = 0; i < filtersLength; i++) {
|
|
89
|
+
if (!filters[i](record)) return false; // didn't match filters
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
});
|
|
93
|
+
if (searchObject.offset || searchObject.limit !== undefined)
|
|
94
|
+
records = records.slice(
|
|
95
|
+
searchObject.offset,
|
|
96
|
+
searchObject.limit !== undefined ? (searchObject.offset || 0) + searchObject.limit : undefined
|
|
97
|
+
);
|
|
98
|
+
records = records.map((record) => cursorFunctions.parseRow(record, fetchAttributes));
|
|
99
|
+
} else {
|
|
100
|
+
//get the union of ids from all condition searches
|
|
101
|
+
for (let i = 1; i < sortedConditions.length; i++) {
|
|
102
|
+
let condition = sortedConditions[i];
|
|
103
|
+
// might want to lazily execute this after getting to this point in the iteration
|
|
104
|
+
let nextIds = await executeConditionSearch(transaction, searchObject, condition, tableInfo.hash_attribute);
|
|
105
|
+
ids = ids.concat(nextIds);
|
|
106
|
+
}
|
|
107
|
+
let returnedIds = new Set();
|
|
108
|
+
let offset = searchObject.offset || 0;
|
|
109
|
+
ids = ids
|
|
110
|
+
.filter((id) => {
|
|
111
|
+
if (returnedIds.has(id))
|
|
112
|
+
// skip duplicates
|
|
113
|
+
return false;
|
|
114
|
+
returnedIds.add(id);
|
|
115
|
+
return true;
|
|
116
|
+
})
|
|
117
|
+
.slice(offset, searchObject.limit && searchObject.limit + offset);
|
|
118
|
+
records = searchUtility.batchSearchByHash(transaction, tableInfo.hash_attribute, searchObject.get_attributes, ids);
|
|
119
|
+
}
|
|
120
|
+
records.onDone = () => {
|
|
121
|
+
transaction.done(); // need to complete the transaction once iteration is complete
|
|
122
|
+
};
|
|
123
|
+
return records;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
*
|
|
128
|
+
* @param transaction
|
|
129
|
+
* @param {SearchByConditionsObject} searchObject
|
|
130
|
+
* @param {SearchCondition} condition
|
|
131
|
+
* @param {String} hash_attribute
|
|
132
|
+
* @returns {Promise<unknown[]>}
|
|
133
|
+
*/
|
|
134
|
+
async function executeConditionSearch(transaction, searchObject, condition, hash_attribute) {
|
|
135
|
+
//build a prototype object for search
|
|
136
|
+
let search = new SearchObject(
|
|
137
|
+
searchObject.schema,
|
|
138
|
+
searchObject.table,
|
|
139
|
+
undefined,
|
|
140
|
+
undefined,
|
|
141
|
+
hash_attribute,
|
|
142
|
+
searchObject.get_attributes
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
//execute conditional search
|
|
146
|
+
let comparator = condition.comparator;
|
|
147
|
+
search.attribute = condition.attribute;
|
|
148
|
+
|
|
149
|
+
if (comparator === lmdbTerms.SEARCH_TYPES.BETWEEN) {
|
|
150
|
+
search.value = condition.value[0];
|
|
151
|
+
search.end_value = condition.value[1];
|
|
152
|
+
} else {
|
|
153
|
+
search.value = condition.value;
|
|
154
|
+
}
|
|
155
|
+
return lmdb_search.searchByType(transaction, search, comparator, hash_attribute).map((e) => e.value);
|
|
156
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const searchUtility = require('../../../../utility/lmdb/searchUtility.js');
|
|
4
|
+
const hashSearchInit = require('../lmdbUtility/initializeHashSearch.js');
|
|
5
|
+
|
|
6
|
+
module.exports = lmdbSearchByHash;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* fetches records by their hash values and returns an Array of the results
|
|
10
|
+
* @param {SearchByHashObject} searchObject
|
|
11
|
+
*/
|
|
12
|
+
async function lmdbSearchByHash(searchObject) {
|
|
13
|
+
let environment = await hashSearchInit(searchObject);
|
|
14
|
+
const tableInfo = global.hdb_schema[searchObject.schema][searchObject.table];
|
|
15
|
+
return searchUtility.batchSearchByHash(
|
|
16
|
+
environment,
|
|
17
|
+
tableInfo.hash_attribute,
|
|
18
|
+
searchObject.get_attributes,
|
|
19
|
+
searchObject.hash_values
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line no-unused-vars
|
|
4
|
+
const SearchObject = require('../../../SearchObject.js');
|
|
5
|
+
const searchValidator = require('../../../../validation/searchValidator.js');
|
|
6
|
+
const commonUtils = require('../../../../utility/common_utils.js');
|
|
7
|
+
const hdbTerms = require('../../../../utility/hdbTerms.ts');
|
|
8
|
+
const lmdb_search = require('../lmdbUtility/lmdbSearch.js');
|
|
9
|
+
|
|
10
|
+
module.exports = lmdbSearchByValue;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* gets records by value - returns array of Objects
|
|
14
|
+
* @param {SearchObject} searchObject
|
|
15
|
+
* @param {hdbTerms.VALUE_SEARCH_COMPARATORS} [comparator]
|
|
16
|
+
* @returns {Promise<{}|{}[]>}
|
|
17
|
+
*/
|
|
18
|
+
async function lmdbSearchByValue(searchObject, comparator) {
|
|
19
|
+
let comparatorSearch = !commonUtils.isEmpty(comparator);
|
|
20
|
+
if (comparatorSearch && hdbTerms.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[comparator] === undefined) {
|
|
21
|
+
throw new Error(`Value search comparator - ${comparator} - is not valid`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let validationError = searchValidator(searchObject, 'value');
|
|
25
|
+
if (validationError) {
|
|
26
|
+
throw validationError;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return lmdb_search.prepSearch(searchObject, comparator, false);
|
|
30
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { database } = require('../../../../resources/databases.ts');
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
writeTransaction,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* This is wrapper for write transactions, ensuring that all reads and writes within the callback occur atomically
|
|
11
|
+
* @param schema
|
|
12
|
+
* @param table
|
|
13
|
+
* @param callback
|
|
14
|
+
* @returns {Promise<any>}
|
|
15
|
+
*/
|
|
16
|
+
async function writeTransaction(schema, table, callback) {
|
|
17
|
+
let rootStore = database({ database: schema, table });
|
|
18
|
+
return rootStore.transaction(callback);
|
|
19
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const insertUpdateValidate = require('../../bridgeUtility/insertUpdateValidate.js');
|
|
4
|
+
const lmdbProcessRows = require('../lmdbUtility/lmdbProcessRows.js');
|
|
5
|
+
const lmdbCheckNewAttributes = require('../lmdbUtility/lmdbCheckForNewAttributes.js');
|
|
6
|
+
const hdbTerms = require('../../../../utility/hdbTerms.ts');
|
|
7
|
+
const lmdb_update_records = require('../../../../utility/lmdb/writeUtility.js').updateRecords;
|
|
8
|
+
const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
|
|
9
|
+
const { getSchemaPath } = require('../lmdbUtility/initializePaths.js');
|
|
10
|
+
const writeTransaction = require('../lmdbUtility/lmdbWriteTransaction.js');
|
|
11
|
+
const logger = require('../../../../utility/logging/harper_logger.js');
|
|
12
|
+
|
|
13
|
+
module.exports = lmdbUpdateRecords;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Orchestrates the update of data in LMDB and the creation of new attributes/dbis
|
|
17
|
+
* if they do not already exist.
|
|
18
|
+
* @param updateObj
|
|
19
|
+
* @returns {{skipped_hashes: *, written_hashes: *, schema_table: *}}
|
|
20
|
+
*/
|
|
21
|
+
async function lmdbUpdateRecords(updateObj) {
|
|
22
|
+
try {
|
|
23
|
+
let { schemaTable, attributes } = insertUpdateValidate(updateObj);
|
|
24
|
+
|
|
25
|
+
lmdbProcessRows(updateObj, attributes, schemaTable.hash_attribute);
|
|
26
|
+
|
|
27
|
+
if (updateObj.schema !== hdbTerms.SYSTEM_SCHEMA_NAME) {
|
|
28
|
+
if (!attributes.includes(hdbTerms.TIME_STAMP_NAMES_ENUM.CREATED_TIME)) {
|
|
29
|
+
attributes.push(hdbTerms.TIME_STAMP_NAMES_ENUM.CREATED_TIME);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (!attributes.includes(hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)) {
|
|
33
|
+
attributes.push(hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let new_attributes = await lmdbCheckNewAttributes(updateObj.hdb_auth_header, schemaTable, attributes);
|
|
38
|
+
let envBasePath = getSchemaPath(updateObj.schema, updateObj.table);
|
|
39
|
+
let environment = await environmentUtility.openEnvironment(envBasePath, updateObj.table);
|
|
40
|
+
let lmdbResponse = await lmdb_update_records(
|
|
41
|
+
environment,
|
|
42
|
+
schemaTable.hash_attribute,
|
|
43
|
+
attributes,
|
|
44
|
+
updateObj.records,
|
|
45
|
+
updateObj.__origin?.timestamp
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
await writeTransaction(updateObj, lmdbResponse);
|
|
50
|
+
} catch (e) {
|
|
51
|
+
logger.error(`unable to write transaction due to ${e.message}`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
written_hashes: lmdbResponse.written_hashes,
|
|
56
|
+
skipped_hashes: lmdbResponse.skipped_hashes,
|
|
57
|
+
schemaTable,
|
|
58
|
+
new_attributes,
|
|
59
|
+
txn_time: lmdbResponse.txn_time,
|
|
60
|
+
};
|
|
61
|
+
} catch (err) {
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line no-unused-vars
|
|
4
|
+
const UpsertObject = require('../../../dataObjects/UpsertObject.js');
|
|
5
|
+
const insertUpdateValidate = require('../../bridgeUtility/insertUpdateValidate.js');
|
|
6
|
+
const lmdbProcessRows = require('../lmdbUtility/lmdbProcessRows.js');
|
|
7
|
+
const lmdbCheckNewAttributes = require('../lmdbUtility/lmdbCheckForNewAttributes.js');
|
|
8
|
+
const hdbTerms = require('../../../../utility/hdbTerms.ts');
|
|
9
|
+
const lmdb_upsert_records = require('../../../../utility/lmdb/writeUtility.js').upsertRecords;
|
|
10
|
+
const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
|
|
11
|
+
const { getSchemaPath } = require('../lmdbUtility/initializePaths.js');
|
|
12
|
+
const writeTransaction = require('../lmdbUtility/lmdbWriteTransaction.js');
|
|
13
|
+
|
|
14
|
+
const logger = require('../../../../utility/logging/harper_logger.js');
|
|
15
|
+
const { handleHDBError, hdbErrors } = require('../../../../utility/errors/hdbError.js');
|
|
16
|
+
|
|
17
|
+
module.exports = lmdbUpsertRecords;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Orchestrates the UPSERT of data in LMDB and the creation of new attributes/dbis
|
|
21
|
+
* if they do not already exist.
|
|
22
|
+
* @param {UpsertObject} upsertObj
|
|
23
|
+
* @returns {{ skipped_hashes: *, written_hashes: *, schema_table: *, new_attributes: *, txn_time: * }}
|
|
24
|
+
*/
|
|
25
|
+
async function lmdbUpsertRecords(upsertObj) {
|
|
26
|
+
let validationResult;
|
|
27
|
+
try {
|
|
28
|
+
validationResult = insertUpdateValidate(upsertObj);
|
|
29
|
+
} catch (err) {
|
|
30
|
+
throw handleHDBError(err, err.message, hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST, undefined, undefined, true);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let { schemaTable, attributes } = validationResult;
|
|
34
|
+
|
|
35
|
+
lmdbProcessRows(upsertObj, attributes, schemaTable.hash_attribute);
|
|
36
|
+
|
|
37
|
+
if (upsertObj.schema !== hdbTerms.SYSTEM_SCHEMA_NAME) {
|
|
38
|
+
if (!attributes.includes(hdbTerms.TIME_STAMP_NAMES_ENUM.CREATED_TIME)) {
|
|
39
|
+
attributes.push(hdbTerms.TIME_STAMP_NAMES_ENUM.CREATED_TIME);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!attributes.includes(hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME)) {
|
|
43
|
+
attributes.push(hdbTerms.TIME_STAMP_NAMES_ENUM.UPDATED_TIME);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let new_attributes = await lmdbCheckNewAttributes(upsertObj.hdb_auth_header, schemaTable, attributes);
|
|
48
|
+
let envBasePath = getSchemaPath(upsertObj.schema, upsertObj.table);
|
|
49
|
+
let environment = await environmentUtility.openEnvironment(envBasePath, upsertObj.table);
|
|
50
|
+
let lmdbResponse = await lmdb_upsert_records(
|
|
51
|
+
environment,
|
|
52
|
+
schemaTable.hash_attribute,
|
|
53
|
+
attributes,
|
|
54
|
+
upsertObj.records,
|
|
55
|
+
upsertObj.__origin?.timestamp
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
await writeTransaction(upsertObj, lmdbResponse);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
logger.error(`unable to write transaction due to ${e.message}`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
written_hashes: lmdbResponse.written_hashes,
|
|
66
|
+
schemaTable,
|
|
67
|
+
new_attributes,
|
|
68
|
+
txn_time: lmdbResponse.txn_time,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const CreateAttributeObject = require('../../../CreateAttributeObject.js');
|
|
4
|
+
|
|
5
|
+
class LMDBCreateAttributeObject extends CreateAttributeObject {
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param {String} schema
|
|
9
|
+
* @param {String} table
|
|
10
|
+
* @param {String} attribute
|
|
11
|
+
* @param {*} [id] - optional, the predefined id for this attribute
|
|
12
|
+
* @param {Boolean} [dupSort] - optional, whether this attribute will allow duplicate keys in the lmdb dbi, defaults to true
|
|
13
|
+
* @param {Boolean} [isHashAttribute]
|
|
14
|
+
*/
|
|
15
|
+
constructor(schema, table, attribute, id, dupSort = true, isHashAttribute = false) {
|
|
16
|
+
super(schema, table, attribute, id);
|
|
17
|
+
this.dup_sort = dupSort;
|
|
18
|
+
this.isPrimaryKey = isHashAttribute;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = LMDBCreateAttributeObject;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const LMDBTransactionObject = require('./LMDBTransactionObject.js');
|
|
3
|
+
const OPERATIONS_ENUM = require('../../../../utility/hdbTerms.ts').OPERATIONS_ENUM;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* class to define a delete transaction
|
|
7
|
+
*/
|
|
8
|
+
class LMDBDeleteTransactionObject extends LMDBTransactionObject {
|
|
9
|
+
/**
|
|
10
|
+
* @param {Array.<string|number>} hash_values - hash values of deleted records
|
|
11
|
+
* @param {Array.<Object>} originalRecords - original records prior to delete
|
|
12
|
+
* @param {string} userName - username that executed transaction
|
|
13
|
+
* @param {number} timestamp - timestamp of transaction
|
|
14
|
+
* @param {any} origin
|
|
15
|
+
*/
|
|
16
|
+
constructor(hash_values, originalRecords, userName, timestamp, origin = undefined) {
|
|
17
|
+
super(OPERATIONS_ENUM.DELETE, userName, timestamp, hash_values, origin);
|
|
18
|
+
this.original_records = originalRecords;
|
|
19
|
+
//this.hash_values = hash_values;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = LMDBDeleteTransactionObject;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const LMDBTransactionObject = require('./LMDBTransactionObject.js');
|
|
3
|
+
const OPERATIONS_ENUM = require('../../../../utility/hdbTerms.ts').OPERATIONS_ENUM;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* class to define an insert transaction
|
|
7
|
+
*/
|
|
8
|
+
class LMDBInsertTransactionObject extends LMDBTransactionObject {
|
|
9
|
+
/**
|
|
10
|
+
* @param {Array.<Object>} records - inserted records
|
|
11
|
+
* @param {string} userName - username that executed trasaction
|
|
12
|
+
* @param {number} timestamp - timestamp of the transaction
|
|
13
|
+
* @param {[String|Number]} hash_values
|
|
14
|
+
* @param {any} origin
|
|
15
|
+
*/
|
|
16
|
+
constructor(records, userName, timestamp, hash_values, origin = undefined) {
|
|
17
|
+
super(OPERATIONS_ENUM.INSERT, userName, timestamp, hash_values, origin);
|
|
18
|
+
this.records = records;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = LMDBInsertTransactionObject;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* base class for transactions
|
|
5
|
+
*/
|
|
6
|
+
class LMDBTransactionObject {
|
|
7
|
+
/**
|
|
8
|
+
* @param {string} operation - name of operation
|
|
9
|
+
* @param {string} userName - username that executed transaction
|
|
10
|
+
* @param {number} timestamp - timestamp of transaction
|
|
11
|
+
* @param {[string|number]} hash_values
|
|
12
|
+
* @param {any} origin
|
|
13
|
+
*/
|
|
14
|
+
constructor(operation, userName, timestamp, hash_values, origin = undefined) {
|
|
15
|
+
this.operation = operation;
|
|
16
|
+
this.user_name = userName;
|
|
17
|
+
this.timestamp = timestamp;
|
|
18
|
+
this.hash_values = hash_values;
|
|
19
|
+
this.origin = origin;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = LMDBTransactionObject;
|