@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,242 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
evaluateSQL,
|
|
5
|
+
processAST,
|
|
6
|
+
convertSQLToAST,
|
|
7
|
+
checkASTPermissions,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const insert = require('../dataLayer/insert.js');
|
|
11
|
+
const util = require('util');
|
|
12
|
+
const cbInsertInsert = util.callbackify(insert.insert);
|
|
13
|
+
const search = require('../dataLayer/search.js').search;
|
|
14
|
+
const update = require('../dataLayer/update.js').update;
|
|
15
|
+
const cbUpdateUpdate = util.callbackify(update);
|
|
16
|
+
const deleteTranslator = require('./deleteTranslator.js').convertDelete;
|
|
17
|
+
const alasql = require('alasql');
|
|
18
|
+
const opAuth = require('../utility/operation_authorization.js');
|
|
19
|
+
const logger = require('../utility/logging/harper_logger.js');
|
|
20
|
+
const alasqlFunctionImporter = require('./alasqlFunctionImporter.js');
|
|
21
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
22
|
+
const terms = require('../utility/hdbTerms.ts');
|
|
23
|
+
const { hdbErrors, handleHDBError } = require('../utility/errors/hdbError.js');
|
|
24
|
+
const { HTTP_STATUS_CODES } = hdbErrors;
|
|
25
|
+
|
|
26
|
+
//here we call to define and import custom functions to alasql
|
|
27
|
+
alasqlFunctionImporter(alasql);
|
|
28
|
+
|
|
29
|
+
let UNAUTHORIZED_RESPONSE = 403;
|
|
30
|
+
const SQL_INSERT_ERROR_MSG = 'There was a problem performing this insert. Please check the logs and try again.';
|
|
31
|
+
|
|
32
|
+
class ParsedSQLObject {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.ast = undefined;
|
|
35
|
+
this.variant = undefined;
|
|
36
|
+
this.permissions_checked = false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function evaluateSQL(jsonMessage, callback) {
|
|
41
|
+
let parsedSql = jsonMessage.parsed_sql_object;
|
|
42
|
+
if (!parsedSql) {
|
|
43
|
+
parsedSql = convertSQLToAST(jsonMessage.sql);
|
|
44
|
+
//TODO; This is a temporary check and should be removed once validation is integrated.
|
|
45
|
+
let schema = undefined;
|
|
46
|
+
let statement = parsedSql.ast.statements[0];
|
|
47
|
+
if (statement instanceof alasql.yy.Insert) {
|
|
48
|
+
schema = statement.into.databaseid;
|
|
49
|
+
} else if (statement instanceof alasql.yy.Select) {
|
|
50
|
+
schema = statement.from ? statement.from[0].databaseid : null;
|
|
51
|
+
} else if (statement instanceof alasql.yy.Update) {
|
|
52
|
+
schema = statement.table.databaseid;
|
|
53
|
+
} else if (statement instanceof alasql.yy.Delete) {
|
|
54
|
+
schema = statement.table.databaseid;
|
|
55
|
+
} else {
|
|
56
|
+
logger.error(`AST in evaluateSQL is not a valid SQL type.`);
|
|
57
|
+
}
|
|
58
|
+
if (!(statement instanceof alasql.yy.Select) && hdbUtils.isEmptyOrZeroLength(schema)) {
|
|
59
|
+
return callback('No schema specified', null);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
processAST(jsonMessage, parsedSql, (error, results) => {
|
|
63
|
+
if (error) {
|
|
64
|
+
return callback(error);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
callback(null, results);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Provides a direct path to checking permissions for a given AST. Returns false if permissions check fails.
|
|
73
|
+
* @param jsonMessage - The JSON inbound message.
|
|
74
|
+
* @param parsedSqlObject - The Parsed SQL statement specified in the inbound json message, of type ParsedSQLObject.
|
|
75
|
+
* @returns {Array} - False if permissions check denys the statement.
|
|
76
|
+
*/
|
|
77
|
+
function checkASTPermissions(jsonMessage, parsedSqlObject) {
|
|
78
|
+
let verifyResult = undefined;
|
|
79
|
+
try {
|
|
80
|
+
verifyResult = opAuth.verifyPermsAst(
|
|
81
|
+
parsedSqlObject.ast.statements[0],
|
|
82
|
+
jsonMessage.hdb_user,
|
|
83
|
+
parsedSqlObject.variant
|
|
84
|
+
);
|
|
85
|
+
parsedSqlObject.permissions_checked = true;
|
|
86
|
+
} catch (e) {
|
|
87
|
+
throw e;
|
|
88
|
+
}
|
|
89
|
+
if (verifyResult) {
|
|
90
|
+
return verifyResult;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function convertSQLToAST(sql) {
|
|
96
|
+
let astResponse = new ParsedSQLObject();
|
|
97
|
+
if (!sql) {
|
|
98
|
+
throw handleHDBError(
|
|
99
|
+
new Error(),
|
|
100
|
+
"The 'sql' parameter is missing from the request body",
|
|
101
|
+
HTTP_STATUS_CODES.BAD_REQUEST
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
let trimmedSql = sql.trim();
|
|
106
|
+
let ast = alasql.parse(trimmedSql);
|
|
107
|
+
let variant = trimmedSql.split(' ')[0].toLowerCase();
|
|
108
|
+
astResponse.ast = ast;
|
|
109
|
+
astResponse.variant = variant;
|
|
110
|
+
} catch (e) {
|
|
111
|
+
let splitError = e.message.split('\n');
|
|
112
|
+
if (splitError[1]) {
|
|
113
|
+
throw handleHDBError(
|
|
114
|
+
e,
|
|
115
|
+
`Invalid SQL at: ${splitError[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,
|
|
116
|
+
HTTP_STATUS_CODES.BAD_REQUEST
|
|
117
|
+
);
|
|
118
|
+
} else {
|
|
119
|
+
throw handleHDBError(
|
|
120
|
+
e,
|
|
121
|
+
`We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,
|
|
122
|
+
HTTP_STATUS_CODES.BAD_REQUEST
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return astResponse;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function processAST(jsonMessage, parsedSqlObject, callback) {
|
|
131
|
+
try {
|
|
132
|
+
let sqlFunction = nullFunction;
|
|
133
|
+
|
|
134
|
+
if (!jsonMessage.bypass_auth && !parsedSqlObject.permissions_checked) {
|
|
135
|
+
let permissionsCheck = checkASTPermissions(jsonMessage, parsedSqlObject);
|
|
136
|
+
if (permissionsCheck && permissionsCheck.length > 0) {
|
|
137
|
+
return callback(UNAUTHORIZED_RESPONSE, permissionsCheck);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let statement = {
|
|
142
|
+
statement: parsedSqlObject.ast.statements[0],
|
|
143
|
+
hdb_user: jsonMessage.hdb_user,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
switch (parsedSqlObject.variant) {
|
|
147
|
+
case terms.VALID_SQL_OPS_ENUM.SELECT:
|
|
148
|
+
sqlFunction = search;
|
|
149
|
+
statement = parsedSqlObject.ast.statements[0];
|
|
150
|
+
break;
|
|
151
|
+
case terms.VALID_SQL_OPS_ENUM.INSERT:
|
|
152
|
+
//TODO add validator for insert, need to make sure columns are specified
|
|
153
|
+
sqlFunction = convertInsert;
|
|
154
|
+
break;
|
|
155
|
+
case terms.VALID_SQL_OPS_ENUM.UPDATE:
|
|
156
|
+
sqlFunction = cbUpdateUpdate;
|
|
157
|
+
break;
|
|
158
|
+
case terms.VALID_SQL_OPS_ENUM.DELETE:
|
|
159
|
+
sqlFunction = deleteTranslator;
|
|
160
|
+
break;
|
|
161
|
+
default:
|
|
162
|
+
throw new Error(`unsupported SQL type ${parsedSqlObject.variant} in SQL: ${jsonMessage}`);
|
|
163
|
+
}
|
|
164
|
+
sqlFunction(statement, (err, data) => {
|
|
165
|
+
if (err) {
|
|
166
|
+
callback(err);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
callback(null, data);
|
|
170
|
+
});
|
|
171
|
+
} catch (e) {
|
|
172
|
+
return callback(e);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function nullFunction(sql, callback) {
|
|
177
|
+
logger.info(sql);
|
|
178
|
+
callback('unknown sql statement');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function convertInsert({ statement, hdb_user }, callback) {
|
|
182
|
+
let schemaTable = statement.into;
|
|
183
|
+
let insertObject = {
|
|
184
|
+
schema: schemaTable.databaseid,
|
|
185
|
+
table: schemaTable.tableid,
|
|
186
|
+
operation: 'insert',
|
|
187
|
+
hdb_user,
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
let columns = statement.columns.map((column) => column.columnid);
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
insertObject.records = createDataObjects(columns, statement.values);
|
|
194
|
+
} catch (e) {
|
|
195
|
+
return callback(e);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
cbInsertInsert(insertObject, (err, res) => {
|
|
199
|
+
if (err) {
|
|
200
|
+
return callback(err);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
// We do not want the API returning the new attributes property.
|
|
205
|
+
delete res.new_attributes;
|
|
206
|
+
delete res.txn_time;
|
|
207
|
+
} catch (deleteErr) {
|
|
208
|
+
logger.error(`Error delete new_attributes from insert response: ${deleteErr}`);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
callback(null, res);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function createDataObjects(columns, values) {
|
|
216
|
+
try {
|
|
217
|
+
return values.map((valueObjects) => {
|
|
218
|
+
//compare number of values to number of columns, if no match throw error
|
|
219
|
+
if (columns.length !== valueObjects.length) {
|
|
220
|
+
throw 'number of values do not match number of columns in insert';
|
|
221
|
+
}
|
|
222
|
+
let record = {};
|
|
223
|
+
//make sure none of the value entries have a columnid
|
|
224
|
+
valueObjects.forEach((value, x) => {
|
|
225
|
+
if (value.columnid) {
|
|
226
|
+
throw 'cannot use a column in insert value';
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if ('value' in value) {
|
|
230
|
+
record[columns[x]] = value.value;
|
|
231
|
+
} else {
|
|
232
|
+
record[columns[x]] = alasql.compile(`SELECT ${value.toString()} AS [${terms.FUNC_VAL}] FROM ?`);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
return record;
|
|
237
|
+
});
|
|
238
|
+
} catch (err) {
|
|
239
|
+
logger.error(err);
|
|
240
|
+
throw new Error(SQL_INSERT_ERROR_MSG);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* This class is meant as a getter object that sits between the alasql (or other module) AST and any module requiring interpreted
|
|
4
|
+
* AST SQL values such as attributes, tables, etc.
|
|
5
|
+
**/
|
|
6
|
+
|
|
7
|
+
const alasql = require('alasql');
|
|
8
|
+
const RecursiveIterator = require('recursive-iterator');
|
|
9
|
+
const harperLogger = require('../utility/logging/harper_logger.js');
|
|
10
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
11
|
+
const terms = require('../utility/hdbTerms.ts');
|
|
12
|
+
|
|
13
|
+
class sqlStatementBucket {
|
|
14
|
+
constructor(ast) {
|
|
15
|
+
this.ast = ast;
|
|
16
|
+
// affectedAttributes stores a table and it's attributes as a Map [schema, Map[table, [attributesArray]]].
|
|
17
|
+
this.affected_attributes = new Map();
|
|
18
|
+
this.table_lookup = new Map();
|
|
19
|
+
this.schema_lookup = new Map();
|
|
20
|
+
this.table_to_schema_lookup = new Map();
|
|
21
|
+
interpretAST(
|
|
22
|
+
this.ast,
|
|
23
|
+
this.affected_attributes,
|
|
24
|
+
this.table_lookup,
|
|
25
|
+
this.schema_lookup,
|
|
26
|
+
this.table_to_schema_lookup
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Returns all attributes stored under a schema/table key set.
|
|
32
|
+
* @param schemaName - Name of the schema to search under
|
|
33
|
+
* @param tableName - Name of the table to pull attributes for.
|
|
34
|
+
* @returns {Array}
|
|
35
|
+
*/
|
|
36
|
+
getAttributesBySchemaTableName(schemaName, tableName) {
|
|
37
|
+
if (!schemaName || !tableName || !this.affected_attributes) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
if (this.affected_attributes.has(schemaName)) {
|
|
41
|
+
if (!this.affected_attributes.get(schemaName).has(tableName)) {
|
|
42
|
+
tableName = this.table_lookup.get(tableName);
|
|
43
|
+
if (!tableName) return [];
|
|
44
|
+
}
|
|
45
|
+
return this.affected_attributes.get(schemaName).get(tableName);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns all tables that were inferred from the AST.
|
|
51
|
+
* @returns {Array}
|
|
52
|
+
*/
|
|
53
|
+
getAllTables() {
|
|
54
|
+
let tables = [];
|
|
55
|
+
if (!this.affected_attributes) {
|
|
56
|
+
return tables;
|
|
57
|
+
}
|
|
58
|
+
for (const schema of this.affected_attributes.keys()) {
|
|
59
|
+
tables.push(Array.from(this.affected_attributes.get(schema).keys()));
|
|
60
|
+
}
|
|
61
|
+
return tables;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Get an array of all tables under the passed in schema name. Will return an empty array with invalid parameters
|
|
66
|
+
* @param schemaName - name of the schema
|
|
67
|
+
* @returns {Array}
|
|
68
|
+
*/
|
|
69
|
+
getTablesBySchemaName(schemaName) {
|
|
70
|
+
if (!schemaName || !this.affected_attributes) return [];
|
|
71
|
+
return Array.from(this.affected_attributes.get(schemaName).keys());
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Gets an array of schemas that were inferred from the passed in AST
|
|
76
|
+
* @returns {Array}
|
|
77
|
+
*/
|
|
78
|
+
getSchemas() {
|
|
79
|
+
if (!this.affected_attributes) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
return Array.from(this.affected_attributes.keys());
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get the full AST
|
|
87
|
+
* @returns {*}
|
|
88
|
+
*/
|
|
89
|
+
getAst() {
|
|
90
|
+
return this.ast;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
*When a SELECT * is included in the AST for a non-SU, we need to convert the star into the specific attributes the
|
|
95
|
+
* user has READ permissions
|
|
96
|
+
*
|
|
97
|
+
* @param rolePerms - role permission set to update the wildcard to the permitted attributes
|
|
98
|
+
* @returns {ast} - this function returns the updated AST that can be used for final validation and the additional
|
|
99
|
+
* steps to complete the request
|
|
100
|
+
*/
|
|
101
|
+
updateAttributeWildcardsForRolePerms(rolePerms) {
|
|
102
|
+
const astWildcards = this.ast.columns.filter((col) => terms.SEARCH_WILDCARDS.includes(col.columnid));
|
|
103
|
+
|
|
104
|
+
//If there are no wildcards, we can skip this step
|
|
105
|
+
if (astWildcards.length === 0) {
|
|
106
|
+
return this.ast;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//This function will need to be updated if/when we start to do cross-schema joins - i.e. function will need
|
|
110
|
+
// to handle multiple schema values instead of just the one below
|
|
111
|
+
const fromDatabaseid = this.ast.from[0].databaseid;
|
|
112
|
+
this.ast.columns = this.ast.columns.filter((col) => !terms.SEARCH_WILDCARDS.includes(col.columnid));
|
|
113
|
+
|
|
114
|
+
astWildcards.forEach((val) => {
|
|
115
|
+
let colSchema = this.table_to_schema_lookup.has(val.tableid)
|
|
116
|
+
? this.table_to_schema_lookup.get(val.tableid)
|
|
117
|
+
: fromDatabaseid;
|
|
118
|
+
let colTable = this.table_lookup.has(val.tableid) ? this.table_lookup.get(val.tableid) : this.ast.from[0].tableid;
|
|
119
|
+
|
|
120
|
+
//We only want to do this if the table that is being SELECT *'d has READ permissions - if not, we will only
|
|
121
|
+
// want to send the table permissions error response so we can skip this step.
|
|
122
|
+
if (
|
|
123
|
+
rolePerms[colSchema] &&
|
|
124
|
+
rolePerms[colSchema].tables[colTable] &&
|
|
125
|
+
rolePerms[colSchema].tables[colTable][terms.PERMS_CRUD_ENUM.READ]
|
|
126
|
+
) {
|
|
127
|
+
let finalTableAttrs;
|
|
128
|
+
if (rolePerms[colSchema].tables[colTable].attribute_permissions.length > 0) {
|
|
129
|
+
finalTableAttrs = filterReadRestrictedAttrs(rolePerms[colSchema].tables[colTable].attribute_permissions);
|
|
130
|
+
} else {
|
|
131
|
+
//If the user has READ perms for the table but no perms for the attributes in it, we add all the attrs
|
|
132
|
+
// into the AST * affectedAttributes map so that the individual attribute permissions error responses
|
|
133
|
+
// are returned to the user
|
|
134
|
+
finalTableAttrs = global.hdb_schema[colSchema][colTable].attributes.map((attr) => ({
|
|
135
|
+
attribute_name: attr.attribute,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
//It's important to REMOVE the wildcard as we replace it with the actual attributes that will be selected
|
|
140
|
+
const tableAffectedAttrs = this.affected_attributes
|
|
141
|
+
.get(colSchema)
|
|
142
|
+
.get(colTable)
|
|
143
|
+
.filter((attr) => !terms.SEARCH_WILDCARDS.includes(attr));
|
|
144
|
+
finalTableAttrs.forEach(({ attribute_name }) => {
|
|
145
|
+
let newColumn = new alasql.yy.Column({ columnid: attribute_name });
|
|
146
|
+
if (val.tableid) {
|
|
147
|
+
newColumn.tableid = val.tableid;
|
|
148
|
+
}
|
|
149
|
+
this.ast.columns.push(newColumn);
|
|
150
|
+
if (!tableAffectedAttrs.includes(attribute_name)) {
|
|
151
|
+
tableAffectedAttrs.push(attribute_name);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
this.affected_attributes.get(colSchema).set(colTable, tableAffectedAttrs);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
return this.ast;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Takes full table attribute permissions array and filters out attributes w/ FALSE READ perms
|
|
164
|
+
*
|
|
165
|
+
* @param attrPerms [] - attribute permissions for a table
|
|
166
|
+
* @returns [] - array of attribute permissions objects w/ READ perms === TRUE
|
|
167
|
+
*/
|
|
168
|
+
|
|
169
|
+
function filterReadRestrictedAttrs(attrPerms) {
|
|
170
|
+
return attrPerms.filter((perm) => perm[terms.PERMS_CRUD_ENUM.READ]);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function interpretAST(ast, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup) {
|
|
174
|
+
getRecordAttributesAST(ast, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Takes an AST definition and adds it to the schema/table affectedAttributes parameter as well as adding table alias'
|
|
179
|
+
* to the tableLookup parameter.
|
|
180
|
+
*
|
|
181
|
+
* @param record - An AST style record
|
|
182
|
+
* @param {Map} affectedAttributes - A map of attributes affected in the call. Defined as [schema, Map[table, [attributesArray]]].
|
|
183
|
+
* @param {Map} tableLookup - A map that will be filled in. This map contains alias to table definitions as [alias, tableName].
|
|
184
|
+
*/
|
|
185
|
+
function addSchemaTableToMap(record, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup) {
|
|
186
|
+
if (!record || !record.databaseid) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (!affectedAttributes.has(record.databaseid)) {
|
|
190
|
+
affectedAttributes.set(record.databaseid, new Map());
|
|
191
|
+
}
|
|
192
|
+
if (!affectedAttributes.get(record.databaseid).has(record.tableid)) {
|
|
193
|
+
affectedAttributes.get(record.databaseid).set(record.tableid, []);
|
|
194
|
+
}
|
|
195
|
+
if (record.as) {
|
|
196
|
+
if (!tableLookup.has(record.as)) {
|
|
197
|
+
tableLookup.set(record.as, record.tableid);
|
|
198
|
+
}
|
|
199
|
+
if (schemaLookup && !schemaLookup.has(record.as)) {
|
|
200
|
+
schemaLookup.set(record.as, record.databaseid);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (tableToSchemaLookup) {
|
|
204
|
+
const schemaId = record.databaseid;
|
|
205
|
+
let tableId = record.tableid;
|
|
206
|
+
if (record.as) {
|
|
207
|
+
tableId = record.as;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
tableToSchemaLookup.set(tableId, schemaId);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Pull the table attributes specified in the AST statement and adds them to the affectedAttributes and tableLookup parameters.
|
|
216
|
+
*
|
|
217
|
+
* @param ast - the syntax tree containing SQL specifications
|
|
218
|
+
* @param {Map} affectedAttributes - A map containing attributes affected by the statement. Defined as [schema, Map[table, [attributesArray]]].
|
|
219
|
+
* @param {Map} tableLookup - A map that will be filled in. This map contains alias to table definitions as [alias, tableName].
|
|
220
|
+
*/
|
|
221
|
+
function getRecordAttributesAST(ast, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup) {
|
|
222
|
+
if (!ast) {
|
|
223
|
+
harperLogger.info(`getRecordAttributesAST: invalid SQL syntax tree`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
// We can reference any schema/table attributes, so we need to check each possibility
|
|
227
|
+
// affected attributes is a Map of Maps like so [schema, Map[table, [attributesArray]]];
|
|
228
|
+
if (ast instanceof alasql.yy.Insert) {
|
|
229
|
+
getInsertAttributes(ast, affectedAttributes, tableLookup);
|
|
230
|
+
} else if (ast instanceof alasql.yy.Select) {
|
|
231
|
+
getSelectAttributes(ast, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup);
|
|
232
|
+
} else if (ast instanceof alasql.yy.Update) {
|
|
233
|
+
getUpdateAttributes(ast, affectedAttributes, tableLookup);
|
|
234
|
+
} else if (ast instanceof alasql.yy.Delete) {
|
|
235
|
+
getDeleteAttributes(ast, affectedAttributes, tableLookup);
|
|
236
|
+
} else {
|
|
237
|
+
harperLogger.error(`AST in getRecordAttributesAST() is not a valid SQL type.`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Retrieve the schemas, tables, and attributes from the source Select AST.
|
|
243
|
+
*
|
|
244
|
+
* @param ast - SQL command converted to an AST
|
|
245
|
+
* @param affectedAttributes - A map containing attributes affected by the statement. Defined as [schema, Map[table, [attributesArray]]].
|
|
246
|
+
* @param tableLookup - A map that will be filled in. This map contains alias to table definitions as [alias, tableName].
|
|
247
|
+
*/
|
|
248
|
+
function getSelectAttributes(ast, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup) {
|
|
249
|
+
if (!ast) {
|
|
250
|
+
harperLogger.info(`getSelectAttributes: invalid SQL syntax tree`);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (!ast.from || ast.from[0] === undefined) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
let schema = ast.from[0].databaseid;
|
|
257
|
+
if (hdbUtils.isEmptyOrZeroLength(schema)) {
|
|
258
|
+
harperLogger.error('No schema specified');
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
ast.from.forEach((from) => {
|
|
262
|
+
addSchemaTableToMap(from, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup);
|
|
263
|
+
});
|
|
264
|
+
if (ast.joins) {
|
|
265
|
+
ast.joins.forEach((join) => {
|
|
266
|
+
//copying the 'as' to the table rather than on the join allows for a more generic function in addSchemaTableToMap().
|
|
267
|
+
// as it can take a .table as well as a .join record. It's a bit hacky, but I don't think this should cause any problems.
|
|
268
|
+
if (join.as) {
|
|
269
|
+
join.table.as = join.as;
|
|
270
|
+
}
|
|
271
|
+
addSchemaTableToMap(join.table, affectedAttributes, tableLookup, schemaLookup, tableToSchemaLookup);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const iterator = new RecursiveIterator(ast.columns);
|
|
276
|
+
for (let { node } of iterator) {
|
|
277
|
+
if (node && node.columnid) {
|
|
278
|
+
let tableName = node.tableid;
|
|
279
|
+
const columnSchema = schemaLookup.has(tableName) ? schemaLookup.get(tableName) : schema;
|
|
280
|
+
|
|
281
|
+
if (!tableName) {
|
|
282
|
+
tableName = ast.from[0].tableid;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (!affectedAttributes.get(columnSchema).has(tableName)) {
|
|
286
|
+
if (!tableLookup.has(tableName)) {
|
|
287
|
+
harperLogger.info(`table specified as ${tableName} not found.`);
|
|
288
|
+
return;
|
|
289
|
+
} else {
|
|
290
|
+
tableName = tableLookup.get(tableName);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (affectedAttributes.get(columnSchema).get(tableName).indexOf(node.columnid) < 0) {
|
|
295
|
+
affectedAttributes.get(columnSchema).get(tableName).push(node.columnid);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// It's important to iterate through the WHERE clause in case there are other columns that are not included in
|
|
301
|
+
// the SELECT clause
|
|
302
|
+
if (ast.where) {
|
|
303
|
+
const iterator = new RecursiveIterator(ast.where);
|
|
304
|
+
const fromTable = ast.from[0].tableid;
|
|
305
|
+
|
|
306
|
+
for (let { node } of iterator) {
|
|
307
|
+
if (node && node.columnid) {
|
|
308
|
+
let table = node.tableid ? node.tableid : fromTable;
|
|
309
|
+
|
|
310
|
+
if (!affectedAttributes.get(schema).has(table)) {
|
|
311
|
+
if (!tableLookup.has(table)) {
|
|
312
|
+
harperLogger.info(`table specified as ${table} not found.`);
|
|
313
|
+
continue;
|
|
314
|
+
} else {
|
|
315
|
+
table = tableLookup.get(table);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
//We need to check to ensure this columnid wasn't already set in the Map
|
|
319
|
+
if (affectedAttributes.get(schema).get(table).indexOf(node.columnid) < 0) {
|
|
320
|
+
affectedAttributes.get(schema).get(table).push(node.columnid);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// It's important to also iterate through the JOIN clause in case there are other columns that are not included in
|
|
327
|
+
// the SELECT clause
|
|
328
|
+
if (ast.joins) {
|
|
329
|
+
ast.joins.forEach((join) => {
|
|
330
|
+
const iterator = new RecursiveIterator(join.on);
|
|
331
|
+
|
|
332
|
+
for (let { node } of iterator) {
|
|
333
|
+
if (node && node.columnid) {
|
|
334
|
+
let table = node.tableid;
|
|
335
|
+
let schema = tableToSchemaLookup.get(table);
|
|
336
|
+
|
|
337
|
+
if (!affectedAttributes.get(schema).has(table)) {
|
|
338
|
+
if (!tableLookup.has(table)) {
|
|
339
|
+
harperLogger.info(`table specified as ${table} not found.`);
|
|
340
|
+
continue;
|
|
341
|
+
} else {
|
|
342
|
+
table = tableLookup.get(table);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
//We need to check to ensure this columnid wasn't already set in the Map
|
|
346
|
+
if (affectedAttributes.get(schema).get(table).indexOf(node.columnid) < 0) {
|
|
347
|
+
affectedAttributes.get(schema).get(table).push(node.columnid);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// It's important to iterate through the ORDER clause in case there are other columns that are not included in
|
|
355
|
+
// the SELECT clause with wildcard
|
|
356
|
+
if (ast.order) {
|
|
357
|
+
const orderIterator = new RecursiveIterator(ast.order);
|
|
358
|
+
for (let { node } of orderIterator) {
|
|
359
|
+
if (node && node.columnid) {
|
|
360
|
+
let tableName = node.tableid;
|
|
361
|
+
const orderSchema = schemaLookup.has(tableName) ? schemaLookup.get(tableName) : schema;
|
|
362
|
+
|
|
363
|
+
if (!tableName) {
|
|
364
|
+
tableName = ast.from[0].tableid;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
if (!affectedAttributes.get(orderSchema).has(tableName)) {
|
|
368
|
+
if (!tableLookup.has(tableName)) {
|
|
369
|
+
harperLogger.info(`table specified as ${tableName} not found.`);
|
|
370
|
+
return;
|
|
371
|
+
} else {
|
|
372
|
+
tableName = tableLookup.get(tableName);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (affectedAttributes.get(orderSchema).get(tableName).indexOf(node.columnid) < 0) {
|
|
377
|
+
affectedAttributes.get(orderSchema).get(tableName).push(node.columnid);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Retrieve the schemas, tables, and attributes from the source Update AST.
|
|
386
|
+
* @param ast - SQL command converted to an AST
|
|
387
|
+
* @param affectedAttributes - - A map containing attributes affected by the statement. Defined as [schema, Map[table, [attributesArray]]].
|
|
388
|
+
* @param tableLookup - A map that will be filled in. This map contains alias to table definitions as [alias, tableName].
|
|
389
|
+
*/
|
|
390
|
+
function getUpdateAttributes(ast, affectedAttributes, tableLookup) {
|
|
391
|
+
if (!ast) {
|
|
392
|
+
harperLogger.info(`getUpdateAttributes: invalid SQL syntax tree`);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
let iterator = new RecursiveIterator(ast.columns);
|
|
396
|
+
let schema = ast.table.databaseid;
|
|
397
|
+
|
|
398
|
+
addSchemaTableToMap(ast.table, affectedAttributes, tableLookup);
|
|
399
|
+
|
|
400
|
+
for (let { node } of iterator) {
|
|
401
|
+
if (node && node.columnid) {
|
|
402
|
+
pushAttribute(ast.table.tableid, schema, node.columnid, affectedAttributes, tableLookup);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Retrieve the schemas, tables, and attributes from the source Delete AST.
|
|
409
|
+
* @param ast - SQL command converted to an AST
|
|
410
|
+
* @param affectedAttributes - - A map containing attributes affected by the statement. Defined as [schema, Map[table, [attributesArray]]].
|
|
411
|
+
* @param tableLookup - A map that will be filled in. This map contains alias to table definitions as [alias, tableName].
|
|
412
|
+
*/
|
|
413
|
+
function getDeleteAttributes(ast, affectedAttributes, tableLookup) {
|
|
414
|
+
if (!ast) {
|
|
415
|
+
harperLogger.info(`getDeleteAttributes: invalid SQL syntax tree`);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
let iterator = new RecursiveIterator(ast.where);
|
|
419
|
+
let schema = ast.table.databaseid;
|
|
420
|
+
|
|
421
|
+
addSchemaTableToMap(ast.table, affectedAttributes, tableLookup);
|
|
422
|
+
|
|
423
|
+
for (let { node } of iterator) {
|
|
424
|
+
if (node && node.columnid) {
|
|
425
|
+
pushAttribute(ast.table.tableid, schema, node.columnid, affectedAttributes, tableLookup);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Retrieve the schemas, tables, and attributes from the source Insert AST.
|
|
432
|
+
* @param ast - SQL command converted to an AST
|
|
433
|
+
* @param affectedAttributes - A map containing attributes affected by the statement. Defined as [schema, Map[table, [attributesArray]]].
|
|
434
|
+
* @param tableLookup - A map that will be filled in. This map contains alias to table definitions as [alias, tableName].
|
|
435
|
+
*/
|
|
436
|
+
function getInsertAttributes(ast, affectedAttributes, tableLookup) {
|
|
437
|
+
if (!ast) {
|
|
438
|
+
harperLogger.info(`getInsertAttributes: invalid SQL syntax tree`);
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
let iterator = new RecursiveIterator(ast.columns);
|
|
442
|
+
let schema = ast.into.databaseid;
|
|
443
|
+
|
|
444
|
+
addSchemaTableToMap(ast.into, affectedAttributes, tableLookup);
|
|
445
|
+
|
|
446
|
+
for (let { node } of iterator) {
|
|
447
|
+
if (node && node.columnid) {
|
|
448
|
+
pushAttribute(ast.into.tableid, schema, node.columnid, affectedAttributes, tableLookup);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Helper function to add the specified column id to the attributes array of a table.
|
|
455
|
+
* @param schema - The schema to add the column into
|
|
456
|
+
* @param table - the table to add the column into
|
|
457
|
+
* @param columnid - the column name that should be stored
|
|
458
|
+
* @param affectedAttributes - A map containing attributes affected by the statement. Defined as [schema, Map[table, [attributesArray]]].
|
|
459
|
+
* @param tableLookup - A map that will be filled in. This map contains alias to table definitions as [alias, tableName].
|
|
460
|
+
*/
|
|
461
|
+
function pushAttribute(table, schema, columnid, affectedAttributes, tableLookup) {
|
|
462
|
+
if (!affectedAttributes.get(schema)) {
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
let tableId = table;
|
|
466
|
+
if (!affectedAttributes.get(schema).has(tableId)) {
|
|
467
|
+
tableId = tableLookup.get(tableId);
|
|
468
|
+
}
|
|
469
|
+
affectedAttributes.get(schema).get(tableId).push(columnid);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
module.exports = sqlStatementBucket;
|