@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,81 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* BridgeMethods Class provides a framework for all HarperBridge method classes
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
class BridgeMethods {
|
|
8
|
+
createSchema() {
|
|
9
|
+
throw new Error('createSchema bridge method is not defined');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
dropSchema() {
|
|
13
|
+
throw new Error('dropSchema bridge method is not defined');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
createTable() {
|
|
17
|
+
throw new Error('createTable bridge method is not defined');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
dropTable() {
|
|
21
|
+
throw new Error('dropTable bridge method is not defined');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
createRecords() {
|
|
25
|
+
throw new Error('createRecords bridge method is not defined');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
updateRecords() {
|
|
29
|
+
throw new Error('updateRecords bridge method is not defined');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async upsertRecords() {
|
|
33
|
+
throw new Error('upsertRecords bridge method is not defined');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
deleteRecords() {
|
|
37
|
+
throw new Error('deleteRecords bridge method is not defined');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
createAttribute() {
|
|
41
|
+
throw new Error('createAttribute bridge method is not defined');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
dropAttribute() {
|
|
45
|
+
throw new Error('dropAttribute bridge method is not defined');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
searchByConditions() {
|
|
49
|
+
throw new Error('searchByConditions bridge method is not defined');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
searchByHash() {
|
|
53
|
+
throw new Error('searchByHash bridge method is not defined');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
searchByValue() {
|
|
57
|
+
throw new Error('searchByValue bridge method is not defined');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
getDataByHash() {
|
|
61
|
+
throw new Error('getDataByHash bridge method is not defined');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
getDataByValue() {
|
|
65
|
+
throw new Error('getDataByValue bridge method is not defined');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
deleteRecordsBefore() {
|
|
69
|
+
throw new Error('deleteRecordsBefore bridge method is not defined');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
deleteAuditLogsBefore() {
|
|
73
|
+
throw new Error('deleteAuditLogsBefore bridge method is not defined');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async readAuditLog() {
|
|
77
|
+
throw new Error('readAuditLog bridge method is not defined');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
module.exports = BridgeMethods;
|
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
import LMDBBridge from './lmdbBridge/LMDBBridge.js';
|
|
2
|
+
import searchValidator from '../../validation/searchValidator.js';
|
|
3
|
+
import { handleHDBError, ClientError, hdbErrors } from '../../utility/errors/hdbError.js';
|
|
4
|
+
import { table, getDatabases, database, dropDatabase } from '../../resources/databases.ts';
|
|
5
|
+
import insertUpdateValidate from './bridgeUtility/insertUpdateValidate.js';
|
|
6
|
+
import SearchObject from '../SearchObject.js';
|
|
7
|
+
import {
|
|
8
|
+
OPERATIONS_ENUM,
|
|
9
|
+
VALUE_SEARCH_COMPARATORS,
|
|
10
|
+
VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP,
|
|
11
|
+
READ_AUDIT_LOG_SEARCH_TYPES_ENUM,
|
|
12
|
+
} from '../../utility/hdbTerms.ts';
|
|
13
|
+
import * as signalling from '../../utility/signalling.js';
|
|
14
|
+
import { SchemaEventMsg } from '../../server/threads/itc.js';
|
|
15
|
+
import { asyncSetTimeout } from '../../utility/common_utils.js';
|
|
16
|
+
import { transaction } from '../../resources/transaction.ts';
|
|
17
|
+
import type { Condition, Query, Context, Select, Id, DirectCondition } from '../../resources/ResourceInterface.ts';
|
|
18
|
+
import { collapseData } from '../../resources/tracked.ts';
|
|
19
|
+
import { errorToString } from '../../utility/logging/harper_logger.js';
|
|
20
|
+
|
|
21
|
+
const { HDB_ERROR_MSGS } = hdbErrors;
|
|
22
|
+
const DEFAULT_DATABASE = 'data';
|
|
23
|
+
const DELETE_CHUNK = 10000;
|
|
24
|
+
const DELETE_PAUSE_MS = 10;
|
|
25
|
+
|
|
26
|
+
export type SearchByConditionsRequest = Query &
|
|
27
|
+
Context & {
|
|
28
|
+
schema?: string;
|
|
29
|
+
database?: string;
|
|
30
|
+
table: string;
|
|
31
|
+
get_attributes: Select;
|
|
32
|
+
reverse?: boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Currently we are extending LMDBBridge so we can use the LMDB methods as a fallback until all our RAPI methods are
|
|
37
|
+
* implemented
|
|
38
|
+
*/
|
|
39
|
+
export class ResourceBridge extends LMDBBridge {
|
|
40
|
+
async searchByConditions(searchObject: SearchByConditionsRequest) {
|
|
41
|
+
if (searchObject.select !== undefined) searchObject.get_attributes = searchObject.select;
|
|
42
|
+
|
|
43
|
+
const table = getTable(searchObject);
|
|
44
|
+
if (!table) {
|
|
45
|
+
throw new ClientError(`Table ${searchObject.table} not found`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
searchObject.conditions = searchObject.conditions.map(mapCondition);
|
|
49
|
+
function mapCondition(condition: Condition) {
|
|
50
|
+
if ('conditions' in condition && condition.conditions) {
|
|
51
|
+
condition.conditions = condition.conditions.map(mapCondition);
|
|
52
|
+
return condition;
|
|
53
|
+
} else {
|
|
54
|
+
const c = condition as DirectCondition;
|
|
55
|
+
return {
|
|
56
|
+
attribute: c.attribute ?? c.search_attribute,
|
|
57
|
+
comparator: c.comparator ?? c.search_type,
|
|
58
|
+
value: c.value !== undefined ? c.value : c.search_value, // null is valid value
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const validationError = searchValidator(searchObject, 'conditions');
|
|
64
|
+
if (validationError) {
|
|
65
|
+
throw handleHDBError(validationError, validationError.message, 400, undefined, undefined, true);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return table.search(
|
|
69
|
+
{
|
|
70
|
+
conditions: searchObject.conditions,
|
|
71
|
+
//set the operator to always be lowercase for later evaluations
|
|
72
|
+
operator: searchObject.operator ? searchObject.operator.toLowerCase() : undefined,
|
|
73
|
+
limit: searchObject.limit,
|
|
74
|
+
offset: searchObject.offset,
|
|
75
|
+
reverse: searchObject.reverse,
|
|
76
|
+
select: getSelect(searchObject, table),
|
|
77
|
+
sort: searchObject.sort,
|
|
78
|
+
allowFullScan: true, // operations API can do full scans by default, but REST is more cautious about what it allows
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
onlyIfCached: searchObject.onlyIfCached,
|
|
82
|
+
noCacheStore: searchObject.noCacheStore,
|
|
83
|
+
noCache: searchObject.noCache,
|
|
84
|
+
replicateFrom: searchObject.replicateFrom,
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Writes new table data to the system tables creates the environment file and creates two datastores to track created and updated
|
|
91
|
+
* timestamps for new table data.
|
|
92
|
+
* @param tableSystemData
|
|
93
|
+
* @param tableCreateObj
|
|
94
|
+
*/
|
|
95
|
+
async createTable(tableSystemData, tableCreateObj) {
|
|
96
|
+
let attributes = tableCreateObj.attributes;
|
|
97
|
+
const schemaDefined = Boolean(attributes);
|
|
98
|
+
const primaryKeyName = tableCreateObj.primary_key || tableCreateObj.hash_attribute;
|
|
99
|
+
if (attributes) {
|
|
100
|
+
// allow for attributes to be specified, but do some massaging to make sure they are in the right form
|
|
101
|
+
for (const attribute of attributes) {
|
|
102
|
+
if (attribute.is_primary_key) {
|
|
103
|
+
attribute.isPrimaryKey = true;
|
|
104
|
+
delete attribute.is_primary_key;
|
|
105
|
+
} else if (attribute.name === primaryKeyName && primaryKeyName) attribute.isPrimaryKey = true;
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
// legacy default schema for tables created through operations API without attributes
|
|
109
|
+
if (!primaryKeyName)
|
|
110
|
+
throw new ClientError('A primary key must be specified with a `primary_key` property or with `attributes`');
|
|
111
|
+
attributes = [
|
|
112
|
+
{ name: primaryKeyName, isPrimaryKey: true },
|
|
113
|
+
{ name: '__createdtime__', indexed: true },
|
|
114
|
+
{ name: '__updatedtime__', indexed: true },
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
table({
|
|
118
|
+
database: tableCreateObj.database ?? tableCreateObj.schema,
|
|
119
|
+
table: tableCreateObj.table,
|
|
120
|
+
attributes,
|
|
121
|
+
schemaDefined,
|
|
122
|
+
expiration: tableCreateObj.expiration,
|
|
123
|
+
audit: tableCreateObj.audit,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async createAttribute(createAttributeObj) {
|
|
128
|
+
await getTable(createAttributeObj).addAttributes([
|
|
129
|
+
{
|
|
130
|
+
name: createAttributeObj.attribute,
|
|
131
|
+
indexed: createAttributeObj.indexed ?? true,
|
|
132
|
+
},
|
|
133
|
+
]);
|
|
134
|
+
return `attribute ${createAttributeObj.schema}.${createAttributeObj.table}.${createAttributeObj.attribute} successfully created.`;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async dropAttribute(dropAttributeObj) {
|
|
138
|
+
const Table = getTable(dropAttributeObj);
|
|
139
|
+
await Table.removeAttributes([dropAttributeObj.attribute]);
|
|
140
|
+
if (!Table.schemaDefined) {
|
|
141
|
+
// legacy behavior of deleting all the property values
|
|
142
|
+
const property = dropAttributeObj.attribute;
|
|
143
|
+
let resolution;
|
|
144
|
+
const deleteRecord = (key, record, version): Promise<void> => {
|
|
145
|
+
record = { ...record };
|
|
146
|
+
delete record[property];
|
|
147
|
+
return Table.primaryStore.put(key, record, version);
|
|
148
|
+
};
|
|
149
|
+
for (const { key, value: record, version } of Table.primaryStore.getRange({ start: true, versions: true })) {
|
|
150
|
+
resolution = deleteRecord(key, record, version);
|
|
151
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
152
|
+
}
|
|
153
|
+
await resolution;
|
|
154
|
+
}
|
|
155
|
+
return `successfully deleted ${dropAttributeObj.schema}.${dropAttributeObj.table}.${dropAttributeObj.attribute}`;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
dropTable(dropTableObject) {
|
|
159
|
+
return getTable(dropTableObject).dropTable();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
createSchema(createSchemaObj) {
|
|
163
|
+
database({
|
|
164
|
+
database: createSchemaObj.schema,
|
|
165
|
+
table: null,
|
|
166
|
+
});
|
|
167
|
+
return signalling.signalSchemaChange(
|
|
168
|
+
new SchemaEventMsg(process.pid, OPERATIONS_ENUM.CREATE_SCHEMA, createSchemaObj.schema)
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async dropSchema(dropSchemaObj) {
|
|
173
|
+
await dropDatabase(dropSchemaObj.schema);
|
|
174
|
+
signalling.signalSchemaChange(new SchemaEventMsg(process.pid, OPERATIONS_ENUM.DROP_SCHEMA, dropSchemaObj.schema));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
async updateRecords(updateObj) {
|
|
178
|
+
updateObj.requires_existing = true;
|
|
179
|
+
return this.upsertRecords(updateObj);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async createRecords(updateObj) {
|
|
183
|
+
updateObj.requires_no_existing = true;
|
|
184
|
+
return this.upsertRecords(updateObj);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async upsertRecords(upsertObj) {
|
|
188
|
+
const { attributes } = insertUpdateValidate(upsertObj);
|
|
189
|
+
|
|
190
|
+
let new_attributes;
|
|
191
|
+
const Table = getDatabases()[upsertObj.schema][upsertObj.table];
|
|
192
|
+
const context: Context = {
|
|
193
|
+
user: upsertObj.hdb_user,
|
|
194
|
+
expiresAt: upsertObj.expiresAt,
|
|
195
|
+
originatingOperation: upsertObj.operation,
|
|
196
|
+
};
|
|
197
|
+
if (upsertObj.replicateTo) context.replicateTo = upsertObj.replicateTo;
|
|
198
|
+
if (upsertObj.replicatedConfirmation) context.replicatedConfirmation = upsertObj.replicatedConfirmation;
|
|
199
|
+
return transaction(context, async (transaction) => {
|
|
200
|
+
if (!Table.schemaDefined) {
|
|
201
|
+
new_attributes = [];
|
|
202
|
+
for (const attribute_name of attributes) {
|
|
203
|
+
const existingAttribute = Table.attributes.find(
|
|
204
|
+
(existingAttribute) => existingAttribute.name == attribute_name
|
|
205
|
+
);
|
|
206
|
+
if (!existingAttribute) {
|
|
207
|
+
new_attributes.push(attribute_name);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (new_attributes.length > 0) {
|
|
211
|
+
await Table.addAttributes(
|
|
212
|
+
new_attributes.map((name) => ({
|
|
213
|
+
name,
|
|
214
|
+
indexed: true,
|
|
215
|
+
}))
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const keys = [];
|
|
221
|
+
const skipped = [];
|
|
222
|
+
for (const record of upsertObj.records) {
|
|
223
|
+
const id = record[Table.primaryKey];
|
|
224
|
+
let existingRecord = id != undefined && (await Table.get(id, context));
|
|
225
|
+
if ((upsertObj.requires_existing && !existingRecord) || (upsertObj.requires_no_existing && existingRecord)) {
|
|
226
|
+
skipped.push(record[Table.primaryKey]);
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (existingRecord) existingRecord = collapseData(existingRecord);
|
|
230
|
+
for (const key in record) {
|
|
231
|
+
if (Object.prototype.hasOwnProperty.call(record, key)) {
|
|
232
|
+
let value = record[key];
|
|
233
|
+
if (typeof value === 'function') {
|
|
234
|
+
try {
|
|
235
|
+
const valueResults = value([[existingRecord]]);
|
|
236
|
+
if (Array.isArray(valueResults)) {
|
|
237
|
+
value = valueResults[0].func_val;
|
|
238
|
+
record[key] = value;
|
|
239
|
+
}
|
|
240
|
+
} catch (error) {
|
|
241
|
+
error.message += 'Trying to set key ' + key + ' on object' + JSON.stringify(record);
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
await (id == undefined
|
|
248
|
+
? Table.create(record, context)
|
|
249
|
+
: existingRecord
|
|
250
|
+
? Table.patch(record, context)
|
|
251
|
+
: Table.put(record, context));
|
|
252
|
+
keys.push(record[Table.primaryKey]);
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
txn_time: transaction.timestamp,
|
|
256
|
+
written_hashes: keys,
|
|
257
|
+
new_attributes,
|
|
258
|
+
skipped_hashes: skipped,
|
|
259
|
+
};
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
async deleteRecords(deleteObj) {
|
|
264
|
+
const Table = getDatabases()[deleteObj.schema][deleteObj.table];
|
|
265
|
+
const context: Context = { user: deleteObj.hdb_user };
|
|
266
|
+
if (deleteObj.replicateTo) context.replicateTo = deleteObj.replicateTo;
|
|
267
|
+
if (deleteObj.replicatedConfirmation) context.replicatedConfirmation = deleteObj.replicatedConfirmation;
|
|
268
|
+
return transaction(context, async (transaction) => {
|
|
269
|
+
const ids: Id[] = deleteObj.hash_values || deleteObj.records.map((record) => record[Table.primaryKey]);
|
|
270
|
+
const deleted = [];
|
|
271
|
+
const skipped = [];
|
|
272
|
+
for (const id of ids) {
|
|
273
|
+
if (await Table.delete(id, context)) deleted.push(id);
|
|
274
|
+
else skipped.push(id);
|
|
275
|
+
}
|
|
276
|
+
return createDeleteResponse(deleted, skipped, transaction.timestamp);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Deletes all records in a schema.table that fall behind a passed date.
|
|
282
|
+
* @param deleteObj
|
|
283
|
+
* {
|
|
284
|
+
* operation: 'delete_records_before' <string>,
|
|
285
|
+
* date: ISO-8601 format YYYY-MM-DD <string>,
|
|
286
|
+
* schema: Schema where table resides <string>,
|
|
287
|
+
* table: Table to delete records from <string>,
|
|
288
|
+
* }
|
|
289
|
+
* @returns {undefined}
|
|
290
|
+
*/
|
|
291
|
+
async deleteRecordsBefore(deleteObj) {
|
|
292
|
+
const Table = getDatabases()[deleteObj.schema][deleteObj.table];
|
|
293
|
+
if (!Table.createdTimeProperty) {
|
|
294
|
+
throw new ClientError(
|
|
295
|
+
`Table must have a '__createdtime__' attribute or @createdTime timestamp defined to perform this operation`
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const recordsToDelete = await Table.search({
|
|
300
|
+
conditions: [
|
|
301
|
+
{
|
|
302
|
+
attribute: Table.createdTimeProperty.name,
|
|
303
|
+
value: Date.parse(deleteObj.date),
|
|
304
|
+
comparator: VALUE_SEARCH_COMPARATORS.LESS,
|
|
305
|
+
},
|
|
306
|
+
],
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
let deleteCalled = false;
|
|
310
|
+
const deletedIds = [];
|
|
311
|
+
const skippedIds = [];
|
|
312
|
+
let i = 0;
|
|
313
|
+
let ids = [];
|
|
314
|
+
const chunkDelete = async () => {
|
|
315
|
+
const deleteRes = await this.deleteRecords({
|
|
316
|
+
schema: deleteObj.schema,
|
|
317
|
+
table: deleteObj.table,
|
|
318
|
+
hash_values: ids,
|
|
319
|
+
});
|
|
320
|
+
deletedIds.push(...deleteRes.deleted_hashes);
|
|
321
|
+
skippedIds.push(...deleteRes.skipped_hashes);
|
|
322
|
+
await asyncSetTimeout(DELETE_PAUSE_MS);
|
|
323
|
+
ids = [];
|
|
324
|
+
deleteCalled = true;
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
for await (const records of recordsToDelete) {
|
|
328
|
+
ids.push(records[Table.primaryKey]);
|
|
329
|
+
i++;
|
|
330
|
+
if (i % DELETE_CHUNK === 0) {
|
|
331
|
+
await chunkDelete();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (ids.length > 0) await chunkDelete();
|
|
336
|
+
|
|
337
|
+
if (!deleteCalled) {
|
|
338
|
+
return { message: 'No records found to delete' };
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return createDeleteResponse(deletedIds, skippedIds, undefined);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* fetches records by their hash values and returns an Array of the results
|
|
346
|
+
* @param {SearchByHashObject} searchObject
|
|
347
|
+
*/
|
|
348
|
+
searchByHash(searchObject) {
|
|
349
|
+
if (searchObject.select !== undefined) searchObject.get_attributes = searchObject.select;
|
|
350
|
+
const validationError = searchValidator(searchObject, 'hashes');
|
|
351
|
+
if (validationError) {
|
|
352
|
+
throw validationError;
|
|
353
|
+
}
|
|
354
|
+
return getRecords(searchObject);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Called by some SQL functions
|
|
359
|
+
* @param searchObject
|
|
360
|
+
*/
|
|
361
|
+
async getDataByHash(searchObject) {
|
|
362
|
+
const map = new Map();
|
|
363
|
+
searchObject._returnKeyValue = true;
|
|
364
|
+
for await (const { key, value } of getRecords(searchObject, true)) {
|
|
365
|
+
map.set(key, value);
|
|
366
|
+
}
|
|
367
|
+
return map;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
searchByValue(searchObject: SearchObject, comparator?: string) {
|
|
371
|
+
if (comparator && VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[comparator] === undefined) {
|
|
372
|
+
throw new Error(`Value search comparator - ${comparator} - is not valid`);
|
|
373
|
+
}
|
|
374
|
+
if (searchObject.select !== undefined) searchObject.get_attributes = searchObject.select;
|
|
375
|
+
if (searchObject.search_attribute !== undefined) searchObject.attribute = searchObject.search_attribute;
|
|
376
|
+
if (searchObject.search_value !== undefined) searchObject.value = searchObject.search_value;
|
|
377
|
+
|
|
378
|
+
const validationError = searchValidator(searchObject, 'value');
|
|
379
|
+
if (validationError) {
|
|
380
|
+
throw validationError;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const table = getTable(searchObject);
|
|
384
|
+
if (!table) {
|
|
385
|
+
throw new ClientError(`Table ${searchObject.table} not found`);
|
|
386
|
+
}
|
|
387
|
+
let value = searchObject.value;
|
|
388
|
+
if (value.includes?.('*')) {
|
|
389
|
+
if (value.startsWith('*')) {
|
|
390
|
+
if (value.endsWith('*')) {
|
|
391
|
+
if (value !== '*') {
|
|
392
|
+
comparator = 'contains';
|
|
393
|
+
value = value.slice(1, -1);
|
|
394
|
+
}
|
|
395
|
+
} else {
|
|
396
|
+
comparator = 'ends_with';
|
|
397
|
+
value = value.slice(1);
|
|
398
|
+
}
|
|
399
|
+
} else if (value.endsWith('*')) {
|
|
400
|
+
comparator = 'starts_with';
|
|
401
|
+
value = value.slice(0, -1);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (comparator === VALUE_SEARCH_COMPARATORS.BETWEEN) value = [value, searchObject.end_value];
|
|
405
|
+
const conditions =
|
|
406
|
+
value === '*'
|
|
407
|
+
? []
|
|
408
|
+
: [
|
|
409
|
+
{
|
|
410
|
+
attribute: searchObject.attribute,
|
|
411
|
+
value,
|
|
412
|
+
comparator,
|
|
413
|
+
},
|
|
414
|
+
];
|
|
415
|
+
|
|
416
|
+
return table.search(
|
|
417
|
+
{
|
|
418
|
+
conditions,
|
|
419
|
+
allowFullScan: true,
|
|
420
|
+
limit: searchObject.limit,
|
|
421
|
+
offset: searchObject.offset,
|
|
422
|
+
reverse: searchObject.reverse,
|
|
423
|
+
sort: searchObject.sort,
|
|
424
|
+
select: getSelect(searchObject, table),
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
onlyIfCached: searchObject.onlyIfCached,
|
|
428
|
+
noCacheStore: searchObject.noCacheStore,
|
|
429
|
+
noCache: searchObject.noCache,
|
|
430
|
+
replicateFrom: searchObject.replicateFrom,
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
async getDataByValue(searchObject: SearchObject, comparator) {
|
|
436
|
+
const map = new Map();
|
|
437
|
+
const table = getTable(searchObject);
|
|
438
|
+
if (
|
|
439
|
+
searchObject.get_attributes &&
|
|
440
|
+
!searchObject.get_attributes.includes(table.primaryKey) &&
|
|
441
|
+
searchObject.get_attributes[0] !== '*'
|
|
442
|
+
)
|
|
443
|
+
// ensure that we get the primary key so we can make a mapping
|
|
444
|
+
searchObject.get_attributes.push(table.primaryKey);
|
|
445
|
+
for await (const record of this.searchByValue(searchObject, comparator)) {
|
|
446
|
+
map.set(record[table.primaryKey], record);
|
|
447
|
+
}
|
|
448
|
+
return map;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
resetReadTxn(schema, table) {
|
|
452
|
+
getTable({ schema, table })?.primaryStore.resetReadTxn?.();
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
async deleteAuditLogsBefore(deleteObj) {
|
|
456
|
+
const table = getTable(deleteObj);
|
|
457
|
+
return table.deleteHistory(deleteObj.timestamp, deleteObj.cleanup_deleted_records);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
async readAuditLog(readAuditLogObj) {
|
|
461
|
+
const table = getTable(readAuditLogObj);
|
|
462
|
+
const histories = {};
|
|
463
|
+
switch (readAuditLogObj.search_type) {
|
|
464
|
+
case READ_AUDIT_LOG_SEARCH_TYPES_ENUM.HASH_VALUE:
|
|
465
|
+
// get the history of each record
|
|
466
|
+
for (const id of readAuditLogObj.search_values) {
|
|
467
|
+
histories[id] = (await table.getHistoryOfRecord(id)).map((auditRecord) => {
|
|
468
|
+
let operation = auditRecord.operation ?? auditRecord.type;
|
|
469
|
+
if (operation === 'put') operation = 'upsert';
|
|
470
|
+
return {
|
|
471
|
+
operation,
|
|
472
|
+
timestamp: auditRecord.version,
|
|
473
|
+
user_name: auditRecord.user,
|
|
474
|
+
hash_values: [id],
|
|
475
|
+
records: [auditRecord.value],
|
|
476
|
+
};
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return histories;
|
|
480
|
+
case READ_AUDIT_LOG_SEARCH_TYPES_ENUM.USERNAME: {
|
|
481
|
+
const users = readAuditLogObj.search_values;
|
|
482
|
+
// do a full table scan of the history and find users
|
|
483
|
+
for await (const entry of groupRecordsInHistory(table)) {
|
|
484
|
+
if (users.includes(entry.user_name)) {
|
|
485
|
+
const entriesForUser = histories[entry.user_name] || (histories[entry.user_name] = []);
|
|
486
|
+
entriesForUser.push(entry);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return histories;
|
|
490
|
+
}
|
|
491
|
+
default:
|
|
492
|
+
return groupRecordsInHistory(
|
|
493
|
+
table,
|
|
494
|
+
readAuditLogObj.search_values?.[0],
|
|
495
|
+
readAuditLogObj.search_values?.[1],
|
|
496
|
+
readAuditLogObj.limit
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function getSelect({ get_attributes }, table) {
|
|
503
|
+
if (get_attributes) {
|
|
504
|
+
if (get_attributes[0] === '*') {
|
|
505
|
+
if (table.schemaDefined) return;
|
|
506
|
+
else get_attributes = table.attributes.map((attribute) => attribute.name);
|
|
507
|
+
}
|
|
508
|
+
get_attributes.forceNulls = true;
|
|
509
|
+
return get_attributes;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Iterator for asynchronous getting ids from an array
|
|
514
|
+
*/
|
|
515
|
+
function getRecords(searchObject, returnKeyValue?) {
|
|
516
|
+
const table = getTable(searchObject);
|
|
517
|
+
const select = getSelect(searchObject, table);
|
|
518
|
+
if (!table) {
|
|
519
|
+
throw new ClientError(`Table ${searchObject.table} not found`);
|
|
520
|
+
}
|
|
521
|
+
let lazy;
|
|
522
|
+
if (select && table.attributes.length - select.length > 2 && select.length < 5) lazy = true;
|
|
523
|
+
// we need to get the transaction and ensure that the transaction spans the entire duration
|
|
524
|
+
// of the iteration
|
|
525
|
+
const context = {
|
|
526
|
+
user: searchObject.hdb_user,
|
|
527
|
+
onlyIfCached: searchObject.onlyIfCached,
|
|
528
|
+
noCacheStore: searchObject.noCacheStore,
|
|
529
|
+
noCache: searchObject.noCache,
|
|
530
|
+
replicateFrom: searchObject.replicateFrom,
|
|
531
|
+
};
|
|
532
|
+
let finishedIteration;
|
|
533
|
+
transaction(context, () => new Promise((resolve) => (finishedIteration = resolve)));
|
|
534
|
+
const ids = searchObject.ids || searchObject.hash_values;
|
|
535
|
+
let i = 0;
|
|
536
|
+
return {
|
|
537
|
+
[Symbol.asyncIterator]() {
|
|
538
|
+
return {
|
|
539
|
+
async next() {
|
|
540
|
+
if (i < ids.length) {
|
|
541
|
+
const id = ids[i++];
|
|
542
|
+
let record;
|
|
543
|
+
try {
|
|
544
|
+
record = await table.get({ id, lazy, select }, context);
|
|
545
|
+
record = record && collapseData(record);
|
|
546
|
+
} catch (error) {
|
|
547
|
+
record = {
|
|
548
|
+
message: errorToString(error),
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
if (returnKeyValue)
|
|
552
|
+
return {
|
|
553
|
+
value: { key: id, value: record },
|
|
554
|
+
};
|
|
555
|
+
else return { value: record };
|
|
556
|
+
} else {
|
|
557
|
+
finishedIteration();
|
|
558
|
+
return { done: true };
|
|
559
|
+
}
|
|
560
|
+
},
|
|
561
|
+
return(value) {
|
|
562
|
+
finishedIteration();
|
|
563
|
+
return {
|
|
564
|
+
value,
|
|
565
|
+
done: true,
|
|
566
|
+
};
|
|
567
|
+
},
|
|
568
|
+
// eslint-disable-next-line no-unused-vars
|
|
569
|
+
throw(error) {
|
|
570
|
+
finishedIteration();
|
|
571
|
+
return {
|
|
572
|
+
done: true,
|
|
573
|
+
};
|
|
574
|
+
},
|
|
575
|
+
};
|
|
576
|
+
},
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
function getTable(operationObject) {
|
|
580
|
+
const databaseName = operationObject.database || operationObject.schema || DEFAULT_DATABASE;
|
|
581
|
+
const tables = getDatabases()[databaseName];
|
|
582
|
+
if (!tables) throw handleHDBError(new Error(), HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(databaseName), 404);
|
|
583
|
+
return tables[operationObject.table];
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* creates the response object for deletes based on the deleted & skipped hashes
|
|
587
|
+
* @param {[]} deleted - list of hash values successfully deleted
|
|
588
|
+
* @param {[]} skipped - list of hash values which did not get deleted
|
|
589
|
+
* @param {number} txnTime - the transaction timestamp
|
|
590
|
+
* @returns {{skipped_hashes: [], deleted_hashes: [], message: string}}
|
|
591
|
+
*/
|
|
592
|
+
function createDeleteResponse(deleted, skipped, txnTime) {
|
|
593
|
+
const total = deleted.length + skipped.length;
|
|
594
|
+
const plural = total === 1 ? 'record' : 'records';
|
|
595
|
+
|
|
596
|
+
return {
|
|
597
|
+
message: `${deleted.length} of ${total} ${plural} successfully deleted`,
|
|
598
|
+
deleted_hashes: deleted,
|
|
599
|
+
skipped_hashes: skipped,
|
|
600
|
+
txn_time: txnTime,
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
async function* groupRecordsInHistory(table, start?, end?, limit?) {
|
|
605
|
+
let enqueued;
|
|
606
|
+
let count = 0;
|
|
607
|
+
for await (const entry of table.getHistory(start, end)) {
|
|
608
|
+
let operation = entry.operation ?? entry.type;
|
|
609
|
+
if (operation === 'put') operation = 'upsert';
|
|
610
|
+
const { id, version: timestamp, value } = entry;
|
|
611
|
+
if (enqueued?.timestamp === timestamp) {
|
|
612
|
+
enqueued.hash_values.push(id);
|
|
613
|
+
enqueued.records.push(value);
|
|
614
|
+
} else {
|
|
615
|
+
if (enqueued) {
|
|
616
|
+
yield enqueued;
|
|
617
|
+
count++;
|
|
618
|
+
if (limit && limit <= count) {
|
|
619
|
+
enqueued = undefined;
|
|
620
|
+
break;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
enqueued = {
|
|
624
|
+
operation,
|
|
625
|
+
user_name: entry.user,
|
|
626
|
+
timestamp,
|
|
627
|
+
hash_values: [id],
|
|
628
|
+
records: [value],
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
if (enqueued) yield enqueued;
|
|
633
|
+
}
|