@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +17 -10
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/ResourceInterface.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +12 -4
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +265 -73
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +11 -12
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +52 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +2 -1
- package/dist/utility/lmdb/commonUtility.js +20 -13
- package/dist/utility/lmdb/commonUtility.js.map +1 -1
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +35 -16
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4531 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +733 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +596 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-C1G-Jo6n.js +37 -0
- package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
- package/studio/web/assets/index-D-CahN0-.js +2 -0
- package/studio/web/assets/index-D-CahN0-.js.map +1 -0
- package/studio/web/assets/index-DxlZI0PX.js +235 -0
- package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
- package/studio/web/assets/profiler-CU93QiSW.js +2 -0
- package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +130 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
- package/dist/resources/ResourceInterfaceV2.js.map +0 -1
- package/dist/resources/ResourceV2.d.ts +0 -30
- package/dist/resources/ResourceV2.js +0 -27
- package/dist/resources/ResourceV2.js.map +0 -1
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const schemaMetadataValidator = require('../validation/schemaMetadataValidator.js');
|
|
4
|
+
const { validateBySchema } = require('../validation/validationWrapper.js');
|
|
5
|
+
const { commonValidators, schemaRegex } = require('../validation/common_validators.js');
|
|
6
|
+
const Joi = require('joi');
|
|
7
|
+
const logger = require('../utility/logging/harper_logger.js');
|
|
8
|
+
const uuidV4 = require('uuid').v4;
|
|
9
|
+
const signalling = require('../utility/signalling.js');
|
|
10
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
11
|
+
const util = require('util');
|
|
12
|
+
const harperBridge = require('./harperBridge/harperBridge.js');
|
|
13
|
+
const { handleHDBError, hdbErrors, ClientError } = require('../utility/errors/hdbError.js');
|
|
14
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
15
|
+
const { SchemaEventMsg } = require('../server/threads/itc.js');
|
|
16
|
+
const { getDatabases, dropTableMeta } = require('../resources/databases.ts');
|
|
17
|
+
const { transformReq } = require('../utility/common_utils.js');
|
|
18
|
+
const { server } = require('../server/Server.ts');
|
|
19
|
+
const { cleanupOrphans } = require('../resources/blob.ts');
|
|
20
|
+
|
|
21
|
+
const DB_NAME_CONSTRAINTS = Joi.string()
|
|
22
|
+
.min(1)
|
|
23
|
+
.max(commonValidators.schema_length.maximum)
|
|
24
|
+
.pattern(schemaRegex)
|
|
25
|
+
.messages({ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message });
|
|
26
|
+
|
|
27
|
+
const TABLE_NAME_CONSTRAINTS = Joi.string()
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(commonValidators.schema_length.maximum)
|
|
30
|
+
.pattern(schemaRegex)
|
|
31
|
+
.messages({ 'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message })
|
|
32
|
+
.required();
|
|
33
|
+
|
|
34
|
+
const PRIMARY_KEY_CONSTRAINTS = Joi.string()
|
|
35
|
+
.min(1)
|
|
36
|
+
.max(commonValidators.schema_length.maximum)
|
|
37
|
+
.pattern(schemaRegex)
|
|
38
|
+
.messages({
|
|
39
|
+
'string.pattern.base': '{:#label} ' + commonValidators.schema_format.message,
|
|
40
|
+
'any.required': "'primary_key' is required",
|
|
41
|
+
'string.base': "'primary_key' must be a string",
|
|
42
|
+
})
|
|
43
|
+
.required();
|
|
44
|
+
|
|
45
|
+
module.exports = {
|
|
46
|
+
createSchema,
|
|
47
|
+
createSchemaStructure,
|
|
48
|
+
createTable,
|
|
49
|
+
createTableStructure,
|
|
50
|
+
createAttribute,
|
|
51
|
+
dropSchema,
|
|
52
|
+
dropTable,
|
|
53
|
+
dropAttribute,
|
|
54
|
+
getBackup,
|
|
55
|
+
cleanupOrphanBlobs,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** EXPORTED FUNCTIONS **/
|
|
59
|
+
|
|
60
|
+
async function createSchema(schemaCreateObject) {
|
|
61
|
+
let schemaStructure = await createSchemaStructure(schemaCreateObject);
|
|
62
|
+
signalling.signalSchemaChange(
|
|
63
|
+
new SchemaEventMsg(process.pid, schemaCreateObject.operation, schemaCreateObject.schema)
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return schemaStructure;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function createSchemaStructure(schemaCreateObject) {
|
|
70
|
+
const validation = validateBySchema(
|
|
71
|
+
schemaCreateObject,
|
|
72
|
+
Joi.object({
|
|
73
|
+
database: DB_NAME_CONSTRAINTS,
|
|
74
|
+
schema: DB_NAME_CONSTRAINTS,
|
|
75
|
+
})
|
|
76
|
+
);
|
|
77
|
+
if (validation) throw new ClientError(validation.message);
|
|
78
|
+
|
|
79
|
+
transformReq(schemaCreateObject);
|
|
80
|
+
|
|
81
|
+
if (!(await schemaMetadataValidator.checkSchemaExists(schemaCreateObject.schema))) {
|
|
82
|
+
throw handleHDBError(
|
|
83
|
+
new Error(),
|
|
84
|
+
HDB_ERROR_MSGS.SCHEMA_EXISTS_ERR(schemaCreateObject.schema),
|
|
85
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
86
|
+
hdbTerms.LOG_LEVELS.ERROR,
|
|
87
|
+
HDB_ERROR_MSGS.SCHEMA_EXISTS_ERR(schemaCreateObject.schema),
|
|
88
|
+
true
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
await harperBridge.createSchema(schemaCreateObject);
|
|
93
|
+
|
|
94
|
+
return `database '${schemaCreateObject.schema}' successfully created`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function createTable(createTableObject) {
|
|
98
|
+
transformReq(createTableObject);
|
|
99
|
+
createTableObject.primary_key = createTableObject.primary_key ?? createTableObject.hash_attribute;
|
|
100
|
+
return await createTableStructure(createTableObject);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function createTableStructure(createTableObject) {
|
|
104
|
+
const validation = validateBySchema(
|
|
105
|
+
createTableObject,
|
|
106
|
+
Joi.object({
|
|
107
|
+
database: DB_NAME_CONSTRAINTS,
|
|
108
|
+
schema: DB_NAME_CONSTRAINTS,
|
|
109
|
+
table: TABLE_NAME_CONSTRAINTS,
|
|
110
|
+
residence: Joi.array().items(Joi.string().min(1)).optional(),
|
|
111
|
+
primary_key: PRIMARY_KEY_CONSTRAINTS,
|
|
112
|
+
})
|
|
113
|
+
);
|
|
114
|
+
if (validation) throw new ClientError(validation.message);
|
|
115
|
+
|
|
116
|
+
let invalidTableMsg = await schemaMetadataValidator.checkSchemaTableExists(
|
|
117
|
+
createTableObject.schema,
|
|
118
|
+
createTableObject.table
|
|
119
|
+
);
|
|
120
|
+
if (!invalidTableMsg) {
|
|
121
|
+
throw handleHDBError(
|
|
122
|
+
new Error(),
|
|
123
|
+
HDB_ERROR_MSGS.TABLE_EXISTS_ERR(createTableObject.schema, createTableObject.table),
|
|
124
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
125
|
+
hdbTerms.LOG_LEVELS.ERROR,
|
|
126
|
+
HDB_ERROR_MSGS.TABLE_EXISTS_ERR(createTableObject.schema, createTableObject.table),
|
|
127
|
+
true
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let tableSystemData = {
|
|
132
|
+
name: createTableObject.table,
|
|
133
|
+
schema: createTableObject.schema,
|
|
134
|
+
id: uuidV4(),
|
|
135
|
+
primary_key: createTableObject.primary_key,
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
if (createTableObject.residence) {
|
|
139
|
+
if (global.clustering_on) {
|
|
140
|
+
tableSystemData.residence = createTableObject.residence;
|
|
141
|
+
await harperBridge.createTable(tableSystemData, createTableObject);
|
|
142
|
+
} else {
|
|
143
|
+
throw handleHDBError(
|
|
144
|
+
new Error(),
|
|
145
|
+
`Clustering does not appear to be enabled. Cannot insert table with property 'residence'.`,
|
|
146
|
+
HTTP_STATUS_CODES.BAD_REQUEST
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
await harperBridge.createTable(tableSystemData, createTableObject);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return `table '${createTableObject.schema}.${createTableObject.table}' successfully created.`;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function dropSchema(dropSchemaObject) {
|
|
157
|
+
const validation = validateBySchema(
|
|
158
|
+
dropSchemaObject,
|
|
159
|
+
Joi.object({
|
|
160
|
+
database: Joi.string(),
|
|
161
|
+
schema: Joi.string(),
|
|
162
|
+
})
|
|
163
|
+
.or('database', 'schema')
|
|
164
|
+
.messages({
|
|
165
|
+
'object.missing': "'database' is required",
|
|
166
|
+
})
|
|
167
|
+
);
|
|
168
|
+
if (validation) throw new ClientError(validation.message);
|
|
169
|
+
|
|
170
|
+
transformReq(dropSchemaObject);
|
|
171
|
+
|
|
172
|
+
let invalidSchemaMsg = await schemaMetadataValidator.checkSchemaExists(dropSchemaObject.schema);
|
|
173
|
+
if (invalidSchemaMsg) {
|
|
174
|
+
throw handleHDBError(
|
|
175
|
+
new Error(),
|
|
176
|
+
invalidSchemaMsg,
|
|
177
|
+
HTTP_STATUS_CODES.NOT_FOUND,
|
|
178
|
+
hdbTerms.LOG_LEVELS.ERROR,
|
|
179
|
+
invalidSchemaMsg,
|
|
180
|
+
true
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
await harperBridge.dropSchema(dropSchemaObject);
|
|
185
|
+
signalling.signalSchemaChange(new SchemaEventMsg(process.pid, dropSchemaObject.operation, dropSchemaObject.schema));
|
|
186
|
+
|
|
187
|
+
let response = await server.replication.replicateOperation(dropSchemaObject);
|
|
188
|
+
response.message = `successfully deleted '${dropSchemaObject.schema}'`;
|
|
189
|
+
return response;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function dropTable(dropTableObject) {
|
|
193
|
+
const validation = validateBySchema(
|
|
194
|
+
dropTableObject,
|
|
195
|
+
Joi.object({
|
|
196
|
+
database: Joi.string(),
|
|
197
|
+
schema: Joi.string(),
|
|
198
|
+
table: Joi.string().required(),
|
|
199
|
+
})
|
|
200
|
+
);
|
|
201
|
+
if (validation) throw new ClientError(validation.message);
|
|
202
|
+
|
|
203
|
+
transformReq(dropTableObject);
|
|
204
|
+
|
|
205
|
+
let invalidSchemaTableMsg = await schemaMetadataValidator.checkSchemaTableExists(
|
|
206
|
+
dropTableObject.schema,
|
|
207
|
+
dropTableObject.table
|
|
208
|
+
);
|
|
209
|
+
if (invalidSchemaTableMsg) {
|
|
210
|
+
throw handleHDBError(
|
|
211
|
+
new Error(),
|
|
212
|
+
invalidSchemaTableMsg,
|
|
213
|
+
HTTP_STATUS_CODES.NOT_FOUND,
|
|
214
|
+
hdbTerms.LOG_LEVELS.ERROR,
|
|
215
|
+
invalidSchemaTableMsg,
|
|
216
|
+
true
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
await harperBridge.dropTable(dropTableObject);
|
|
221
|
+
|
|
222
|
+
await dropTableMeta({ table: dropTableObject.table, database: dropTableObject.schema });
|
|
223
|
+
|
|
224
|
+
let response = await server.replication.replicateOperation(dropTableObject);
|
|
225
|
+
response.message = `successfully deleted table '${dropTableObject.schema}.${dropTableObject.table}'`;
|
|
226
|
+
return response;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Drops all files for the specified attribute.
|
|
231
|
+
* @param dropAttributeObject - The JSON formatted inbound message.
|
|
232
|
+
* @returns {Promise<*>}
|
|
233
|
+
*/
|
|
234
|
+
async function dropAttribute(dropAttributeObject) {
|
|
235
|
+
const validation = validateBySchema(
|
|
236
|
+
dropAttributeObject,
|
|
237
|
+
Joi.object({
|
|
238
|
+
database: Joi.string(),
|
|
239
|
+
schema: Joi.string(),
|
|
240
|
+
table: Joi.string().required(),
|
|
241
|
+
attribute: Joi.string().required(),
|
|
242
|
+
})
|
|
243
|
+
);
|
|
244
|
+
if (validation) throw new ClientError(validation.message);
|
|
245
|
+
|
|
246
|
+
transformReq(dropAttributeObject);
|
|
247
|
+
|
|
248
|
+
let invalidSchemaTableMsg = await schemaMetadataValidator.checkSchemaTableExists(
|
|
249
|
+
dropAttributeObject.schema,
|
|
250
|
+
dropAttributeObject.table
|
|
251
|
+
);
|
|
252
|
+
if (invalidSchemaTableMsg) {
|
|
253
|
+
throw handleHDBError(
|
|
254
|
+
new Error(),
|
|
255
|
+
invalidSchemaTableMsg,
|
|
256
|
+
HTTP_STATUS_CODES.NOT_FOUND,
|
|
257
|
+
hdbTerms.LOG_LEVELS.ERROR,
|
|
258
|
+
invalidSchemaTableMsg,
|
|
259
|
+
true
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (
|
|
264
|
+
dropAttributeObject.attribute ===
|
|
265
|
+
global.hdb_schema[dropAttributeObject.schema][dropAttributeObject.table].primary_key
|
|
266
|
+
) {
|
|
267
|
+
throw handleHDBError(
|
|
268
|
+
new Error(),
|
|
269
|
+
'You cannot drop a hash attribute',
|
|
270
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
271
|
+
undefined,
|
|
272
|
+
undefined,
|
|
273
|
+
true
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (hdbTerms.TIME_STAMP_NAMES.indexOf(dropAttributeObject.attribute) >= 0) {
|
|
278
|
+
throw handleHDBError(
|
|
279
|
+
new Error(),
|
|
280
|
+
`cannot drop internal timestamp attribute: ${dropAttributeObject.attribute}`,
|
|
281
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
282
|
+
undefined,
|
|
283
|
+
undefined,
|
|
284
|
+
true
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
try {
|
|
289
|
+
await harperBridge.dropAttribute(dropAttributeObject);
|
|
290
|
+
dropAttributeFromGlobal(dropAttributeObject);
|
|
291
|
+
signalling.signalSchemaChange(
|
|
292
|
+
new SchemaEventMsg(
|
|
293
|
+
process.pid,
|
|
294
|
+
dropAttributeObject.operation,
|
|
295
|
+
dropAttributeObject.schema,
|
|
296
|
+
dropAttributeObject.table,
|
|
297
|
+
dropAttributeObject.attribute
|
|
298
|
+
)
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
return `successfully deleted attribute '${dropAttributeObject.attribute}'`;
|
|
302
|
+
} catch (err) {
|
|
303
|
+
logger.error(`Got an error deleting attribute ${util.inspect(dropAttributeObject)}.`);
|
|
304
|
+
throw err;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Removes the dropped attribute from the global hdb schema object.
|
|
310
|
+
* @param dropAttributeObject
|
|
311
|
+
*/
|
|
312
|
+
function dropAttributeFromGlobal(dropAttributeObject) {
|
|
313
|
+
let attributesObj = Object.values(
|
|
314
|
+
global.hdb_schema[dropAttributeObject.schema][dropAttributeObject.table]['attributes']
|
|
315
|
+
);
|
|
316
|
+
|
|
317
|
+
for (let i = 0; i < attributesObj.length; i++) {
|
|
318
|
+
if (attributesObj[i].attribute === dropAttributeObject.attribute) {
|
|
319
|
+
global.hdb_schema[dropAttributeObject.schema][dropAttributeObject.table]['attributes'].splice(i, 1);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
async function createAttribute(createAttributeObject) {
|
|
325
|
+
transformReq(createAttributeObject);
|
|
326
|
+
|
|
327
|
+
const tableAttr = getDatabases()[createAttributeObject.schema][createAttributeObject.table].attributes;
|
|
328
|
+
for (const { name } of tableAttr) {
|
|
329
|
+
if (name === createAttributeObject.attribute) {
|
|
330
|
+
throw handleHDBError(
|
|
331
|
+
new Error(),
|
|
332
|
+
`attribute '${createAttributeObject.attribute}' already exists in ${createAttributeObject.schema}.${createAttributeObject.table}`,
|
|
333
|
+
HTTP_STATUS_CODES.BAD_REQUEST,
|
|
334
|
+
undefined,
|
|
335
|
+
undefined,
|
|
336
|
+
true
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
await harperBridge.createAttribute(createAttributeObject);
|
|
342
|
+
signalling.signalSchemaChange(
|
|
343
|
+
new SchemaEventMsg(
|
|
344
|
+
process.pid,
|
|
345
|
+
createAttributeObject.operation,
|
|
346
|
+
createAttributeObject.schema,
|
|
347
|
+
createAttributeObject.table,
|
|
348
|
+
createAttributeObject.attribute
|
|
349
|
+
)
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
return `attribute '${createAttributeObject.schema}.${createAttributeObject.table}.${createAttributeObject.attribute}' successfully created.`;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function getBackup(getBackupObject) {
|
|
356
|
+
return harperBridge.getBackup(getBackupObject);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function cleanupOrphanBlobs(request) {
|
|
360
|
+
if (!request.database) throw new ClientError('Must provide "database" name for search for orphaned blobs');
|
|
361
|
+
const database = databases[request.database];
|
|
362
|
+
if (!database) throw new ClientError(`Unknown database '${request.database}'`);
|
|
363
|
+
// don't await, it will probably take hours
|
|
364
|
+
cleanupOrphans(databases[request.database], request.database);
|
|
365
|
+
return { message: 'Orphaned blobs cleanup started, check logs for progress' };
|
|
366
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const logger = require('../utility/logging/harper_logger.js');
|
|
4
|
+
const { validateBySchema } = require('../validation/validationWrapper.js');
|
|
5
|
+
const Joi = require('joi');
|
|
6
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
7
|
+
const { handleHDBError, hdbErrors, ClientError } = require('../utility/errors/hdbError.js');
|
|
8
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
9
|
+
const envMngr = require('../utility/environment/environmentManager.js');
|
|
10
|
+
envMngr.initSync();
|
|
11
|
+
const { getDatabases } = require('../resources/databases.ts');
|
|
12
|
+
const fs = require('fs-extra');
|
|
13
|
+
|
|
14
|
+
module.exports = {
|
|
15
|
+
describeAll,
|
|
16
|
+
describeTable: descTable,
|
|
17
|
+
describeSchema,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* This method is exposed to the API and internally for system operations. If the op is being made internally, the `opObj`
|
|
22
|
+
* argument is not passed and, therefore, no permissions are used to filter the final schema metadata results.
|
|
23
|
+
* @param opObj
|
|
24
|
+
* @returns {Promise<{}|HdbError>}
|
|
25
|
+
*/
|
|
26
|
+
async function describeAll(opObj = {}) {
|
|
27
|
+
try {
|
|
28
|
+
const sysCall = hdbUtils.isEmptyOrZeroLength(opObj);
|
|
29
|
+
const bypassAuth = !!opObj.bypass_auth;
|
|
30
|
+
let rolePerms;
|
|
31
|
+
let isSu;
|
|
32
|
+
if (!sysCall && !bypassAuth) {
|
|
33
|
+
rolePerms = opObj.hdb_user?.role?.permission;
|
|
34
|
+
isSu = rolePerms?.super_user;
|
|
35
|
+
}
|
|
36
|
+
let databases = getDatabases();
|
|
37
|
+
let schemaList = {};
|
|
38
|
+
let schemaPerms = {};
|
|
39
|
+
let tResults = [];
|
|
40
|
+
const exact_count = opObj?.exact_count;
|
|
41
|
+
const include_computed = opObj?.include_computed;
|
|
42
|
+
for (let schema in databases) {
|
|
43
|
+
schemaList[schema] = true;
|
|
44
|
+
if (!sysCall && !isSu && !bypassAuth) schemaPerms[schema] = opObj.hdb_user?.role?.permission[schema]?.describe;
|
|
45
|
+
let tables = databases[schema];
|
|
46
|
+
for (let table in tables) {
|
|
47
|
+
try {
|
|
48
|
+
let desc;
|
|
49
|
+
if (sysCall || isSu || bypassAuth) {
|
|
50
|
+
desc = await descTable({ schema, table, exact_count, include_computed });
|
|
51
|
+
} else if (rolePerms && rolePerms[schema].describe && rolePerms[schema].tables[table].describe) {
|
|
52
|
+
const tAttrPerms = rolePerms[schema].tables[table].attribute_permissions;
|
|
53
|
+
desc = await descTable({ schema, table, exact_count, include_computed }, tAttrPerms);
|
|
54
|
+
}
|
|
55
|
+
if (desc) {
|
|
56
|
+
tResults.push(desc);
|
|
57
|
+
}
|
|
58
|
+
} catch (e) {
|
|
59
|
+
logger.error(e);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let hdbDescription = {};
|
|
65
|
+
for (let t in tResults) {
|
|
66
|
+
if (sysCall || isSu || bypassAuth) {
|
|
67
|
+
if (hdbDescription[tResults[t].schema] == null) {
|
|
68
|
+
hdbDescription[tResults[t].schema] = {};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
hdbDescription[tResults[t].schema][tResults[t].name] = tResults[t];
|
|
72
|
+
if (schemaList[tResults[t].schema]) {
|
|
73
|
+
delete schemaList[tResults[t].schema];
|
|
74
|
+
}
|
|
75
|
+
} else if (schemaPerms[tResults[t].schema]) {
|
|
76
|
+
if (hdbDescription[tResults[t].schema] == null) {
|
|
77
|
+
hdbDescription[tResults[t].schema] = {};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
hdbDescription[tResults[t].schema][tResults[t].name] = tResults[t];
|
|
81
|
+
if (schemaList[tResults[t].schema]) {
|
|
82
|
+
delete schemaList[tResults[t].schema];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
for (let schema in schemaList) {
|
|
88
|
+
if (sysCall || isSu || bypassAuth) {
|
|
89
|
+
hdbDescription[schema] = {};
|
|
90
|
+
} else if (schemaPerms[schema]) {
|
|
91
|
+
hdbDescription[schema] = {};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return hdbDescription;
|
|
95
|
+
} catch (e) {
|
|
96
|
+
logger.error('Got an error in describeAll');
|
|
97
|
+
logger.error(e);
|
|
98
|
+
return handleHDBError(new Error(), HDB_ERROR_MSGS.DESCRIBE_ALL_ERR);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* This method will return the metadata for a table - if `attrPerms` are passed as an argument (or included in the `describeTableObject` arg),
|
|
104
|
+
* the final results w/ be filtered based on those permissions
|
|
105
|
+
*
|
|
106
|
+
* @param describeTableObject
|
|
107
|
+
* @param attrPerms - optional - permissions for the role requesting metadata for the table used when chained to other
|
|
108
|
+
* internal operations. If this method is hit via the API, perms will be grabbed from the describeTableObject which
|
|
109
|
+
* includes the users role and permissions.
|
|
110
|
+
* @returns {Promise<{}|*>}
|
|
111
|
+
*/
|
|
112
|
+
async function descTable(describeTableObject, attrPerms) {
|
|
113
|
+
hdbUtils.transformReq(describeTableObject);
|
|
114
|
+
let { schema, table } = describeTableObject;
|
|
115
|
+
schema = schema?.toString();
|
|
116
|
+
table = table?.toString();
|
|
117
|
+
let tableAttrPerms = attrPerms;
|
|
118
|
+
|
|
119
|
+
//If the describeTableObject includes a `hdb_user` value, it is being called from the API and we can grab the user's
|
|
120
|
+
// role permissions from there
|
|
121
|
+
if (describeTableObject.hdb_user && !describeTableObject.hdb_user?.role?.permission?.super_user) {
|
|
122
|
+
tableAttrPerms = describeTableObject.hdb_user?.role?.permission[schema]?.tables[table]?.attribute_permissions;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const validation = validateBySchema(
|
|
126
|
+
describeTableObject,
|
|
127
|
+
Joi.object({
|
|
128
|
+
database: Joi.string(),
|
|
129
|
+
table: Joi.string().required(),
|
|
130
|
+
exact_count: Joi.boolean().strict(),
|
|
131
|
+
include_computed: Joi.boolean().strict(),
|
|
132
|
+
})
|
|
133
|
+
);
|
|
134
|
+
if (validation) throw new ClientError(validation.message);
|
|
135
|
+
|
|
136
|
+
let databases = getDatabases();
|
|
137
|
+
let tables = databases[schema];
|
|
138
|
+
if (!tables) {
|
|
139
|
+
throw handleHDBError(
|
|
140
|
+
new Error(),
|
|
141
|
+
HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(describeTableObject.schema),
|
|
142
|
+
HTTP_STATUS_CODES.NOT_FOUND
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
let tableObj = tables[table];
|
|
146
|
+
if (!tableObj)
|
|
147
|
+
throw handleHDBError(
|
|
148
|
+
new Error(),
|
|
149
|
+
HDB_ERROR_MSGS.TABLE_NOT_FOUND(describeTableObject.schema, describeTableObject.table),
|
|
150
|
+
HTTP_STATUS_CODES.NOT_FOUND
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
function pushAtt(att) {
|
|
154
|
+
if (!att.computed || describeTableObject.include_computed)
|
|
155
|
+
attributes.push({
|
|
156
|
+
attribute: att.attribute,
|
|
157
|
+
type: att.type,
|
|
158
|
+
elements: att.elements?.type,
|
|
159
|
+
indexed: att.indexed,
|
|
160
|
+
is_primary_key: att.isPrimaryKey,
|
|
161
|
+
assigned_created_time: att.assignCreatedTime,
|
|
162
|
+
assigned_updated_time: att.assignUpdatedTime,
|
|
163
|
+
nullable: att.nullable,
|
|
164
|
+
computed: att.computed ? true : undefined, // only include if computed
|
|
165
|
+
properties: att.properties
|
|
166
|
+
? att.properties.map((prop) => {
|
|
167
|
+
return { type: prop.type, name: prop.name };
|
|
168
|
+
})
|
|
169
|
+
: undefined,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let attributes = [];
|
|
174
|
+
if (tableAttrPerms) {
|
|
175
|
+
let permittedAttr = {};
|
|
176
|
+
tableAttrPerms.forEach((a) => {
|
|
177
|
+
if (a.describe) permittedAttr[a.attribute_name] = true;
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
tableObj.attributes.forEach((a) => {
|
|
181
|
+
if (permittedAttr[a.name]) pushAtt(a);
|
|
182
|
+
});
|
|
183
|
+
} else {
|
|
184
|
+
tableObj.attributes?.forEach((att) => pushAtt(att));
|
|
185
|
+
}
|
|
186
|
+
let db_size;
|
|
187
|
+
try {
|
|
188
|
+
db_size = (await fs.stat(tableObj.primaryStore.path)).size;
|
|
189
|
+
} catch (error) {
|
|
190
|
+
logger.warn(`unable to get database size`, error);
|
|
191
|
+
}
|
|
192
|
+
let tableResult = {
|
|
193
|
+
schema,
|
|
194
|
+
name: tableObj.tableName,
|
|
195
|
+
primary_key: tableObj.attributes.find((attribute) => attribute.isPrimaryKey || attribute.isPrimaryKey)?.name,
|
|
196
|
+
audit: tableObj.audit,
|
|
197
|
+
schema_defined: tableObj.schemaDefined,
|
|
198
|
+
attributes,
|
|
199
|
+
db_size,
|
|
200
|
+
};
|
|
201
|
+
if (tableObj.replicate !== undefined) tableResult.replicate = tableObj.replicate;
|
|
202
|
+
if (tableObj.expirationMS !== undefined) tableResult.expiration = tableObj.expirationMS / 1000 + 's';
|
|
203
|
+
if (tableObj.sealed !== undefined) tableResult.sealed = tableObj.sealed;
|
|
204
|
+
if (tableObj.sources?.length > 0)
|
|
205
|
+
tableResult.sources = tableObj.sources
|
|
206
|
+
.map((source) => source.name)
|
|
207
|
+
.filter((source) => source && source !== 'Replicator');
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
const recordCount = await tableObj.getRecordCount({ exactCount: !!describeTableObject.exact_count });
|
|
211
|
+
tableResult.record_count = recordCount.recordCount;
|
|
212
|
+
tableResult.table_size = tableObj.getSize();
|
|
213
|
+
tableResult.db_audit_size = tableObj.getAuditSize();
|
|
214
|
+
tableResult.estimated_record_range = recordCount.estimatedRange;
|
|
215
|
+
let auditStore = tableObj.auditStore;
|
|
216
|
+
if (auditStore) {
|
|
217
|
+
for (let key of auditStore.getKeys({ reverse: true, limit: 1 })) {
|
|
218
|
+
tableResult.last_updated_record = key[0];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (!tableResult.last_updated_record && tableObj.indices.__updatedtime__) {
|
|
222
|
+
for (let key of tableObj.indices.__updatedtime__.getKeys({ reverse: true, limit: 1 })) {
|
|
223
|
+
tableResult.last_updated_record = key;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
} catch (e) {
|
|
227
|
+
logger.warn(`unable to stat table dbi due to ${e}`);
|
|
228
|
+
}
|
|
229
|
+
return tableResult;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Returns the schema metadata filtered based on permissions for the user role making the request
|
|
234
|
+
*
|
|
235
|
+
* @param describeSchemaObject
|
|
236
|
+
* @returns {Promise<{}|[]>}
|
|
237
|
+
*/
|
|
238
|
+
async function describeSchema(describeSchemaObject) {
|
|
239
|
+
hdbUtils.transformReq(describeSchemaObject);
|
|
240
|
+
|
|
241
|
+
const validation = validateBySchema(
|
|
242
|
+
describeSchemaObject,
|
|
243
|
+
Joi.object({
|
|
244
|
+
database: Joi.string(),
|
|
245
|
+
exact_count: Joi.boolean().strict(),
|
|
246
|
+
include_computed: Joi.boolean().strict(),
|
|
247
|
+
})
|
|
248
|
+
);
|
|
249
|
+
if (validation) throw new ClientError(validation.message);
|
|
250
|
+
|
|
251
|
+
let schemaPerms;
|
|
252
|
+
|
|
253
|
+
if (describeSchemaObject.hdb_user && !describeSchemaObject.hdb_user?.role?.permission?.super_user) {
|
|
254
|
+
schemaPerms = describeSchemaObject.hdb_user?.role?.permission[describeSchemaObject.schema];
|
|
255
|
+
}
|
|
256
|
+
const schemaName = describeSchemaObject.schema.toString();
|
|
257
|
+
|
|
258
|
+
let databases = getDatabases();
|
|
259
|
+
let schema = databases[schemaName];
|
|
260
|
+
if (!schema) {
|
|
261
|
+
throw handleHDBError(
|
|
262
|
+
new Error(),
|
|
263
|
+
HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(describeSchemaObject.schema),
|
|
264
|
+
HTTP_STATUS_CODES.NOT_FOUND
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
let results = {};
|
|
268
|
+
for (let tableName in schema) {
|
|
269
|
+
let table_perms;
|
|
270
|
+
if (schemaPerms && schemaPerms.tables[tableName]) {
|
|
271
|
+
table_perms = schemaPerms.tables[tableName];
|
|
272
|
+
}
|
|
273
|
+
if (hdbUtils.isEmpty(table_perms) || table_perms.describe) {
|
|
274
|
+
let data = await descTable(
|
|
275
|
+
{
|
|
276
|
+
schema: describeSchemaObject.schema,
|
|
277
|
+
table: tableName,
|
|
278
|
+
exact_count: describeSchemaObject.exact_count,
|
|
279
|
+
include_computed: describeSchemaObject.include_computed,
|
|
280
|
+
},
|
|
281
|
+
table_perms ? table_perms.attribute_permissions : null
|
|
282
|
+
);
|
|
283
|
+
if (data) {
|
|
284
|
+
results[data.name] = data;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return results;
|
|
289
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
searchByConditions,
|
|
5
|
+
searchByHash,
|
|
6
|
+
searchByValue,
|
|
7
|
+
search,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const harperBridge = require('./harperBridge/harperBridge.js');
|
|
11
|
+
const { transformReq } = require('../utility/common_utils.js');
|
|
12
|
+
|
|
13
|
+
async function searchByConditions(searchObject) {
|
|
14
|
+
transformReq(searchObject);
|
|
15
|
+
return harperBridge.searchByConditions(searchObject);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function searchByHash(searchObject) {
|
|
19
|
+
transformReq(searchObject);
|
|
20
|
+
if (searchObject.ids) searchObject.hash_values = searchObject.ids;
|
|
21
|
+
let array = [];
|
|
22
|
+
for await (let record of harperBridge.searchByHash(searchObject)) {
|
|
23
|
+
if (record) array.push(record);
|
|
24
|
+
}
|
|
25
|
+
return array;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function searchByValue(searchObject) {
|
|
29
|
+
transformReq(searchObject);
|
|
30
|
+
if (searchObject.hasOwnProperty('desc') === true) {
|
|
31
|
+
searchObject.reverse = searchObject.desc;
|
|
32
|
+
}
|
|
33
|
+
const array = [];
|
|
34
|
+
for await (let record of harperBridge.searchByValue(searchObject)) {
|
|
35
|
+
array.push(record);
|
|
36
|
+
}
|
|
37
|
+
return array;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function search(statement, callback) {
|
|
41
|
+
try {
|
|
42
|
+
const SelectValidator = require('../sqlTranslator/SelectValidator.js');
|
|
43
|
+
const SQLSearch = require('./SQLSearch.js');
|
|
44
|
+
let validator = new SelectValidator(statement);
|
|
45
|
+
validator.validate();
|
|
46
|
+
|
|
47
|
+
let sqlSearch = new SQLSearch(validator.statement, validator.attributes);
|
|
48
|
+
|
|
49
|
+
sqlSearch
|
|
50
|
+
.search()
|
|
51
|
+
.then((data) => {
|
|
52
|
+
callback(null, data);
|
|
53
|
+
})
|
|
54
|
+
.catch((e) => {
|
|
55
|
+
callback(e, null);
|
|
56
|
+
});
|
|
57
|
+
} catch (e) {
|
|
58
|
+
return callback(e);
|
|
59
|
+
}
|
|
60
|
+
}
|