@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,73 @@
|
|
|
1
|
+
import { logger } from '../utility/logging/logger.ts';
|
|
2
|
+
const MAX_EVENT_DELAY_TIME = 3000;
|
|
3
|
+
const DEFAULT_MAX_QUEUE_TIME = 20_000; // 20 seconds
|
|
4
|
+
let lastWarning = 0;
|
|
5
|
+
const WARNING_INTERVAL = 30000;
|
|
6
|
+
const EVENT_QUEUE_MONITORING_INTERVAL = 3000;
|
|
7
|
+
let lastEventQueueCheck = performance.now() + EVENT_QUEUE_MONITORING_INTERVAL;
|
|
8
|
+
let averageEventCycleTime = 0;
|
|
9
|
+
/**
|
|
10
|
+
* Throttle function to limit the number of calls to a function so that the event queue doesn't get overwhelmed.
|
|
11
|
+
* @param fn
|
|
12
|
+
* @param onLimitExceeded
|
|
13
|
+
* @param maxQueueTimeLimit
|
|
14
|
+
*/
|
|
15
|
+
export function throttle(
|
|
16
|
+
fn: (...args: any) => any,
|
|
17
|
+
onLimitExceeded?: (...args: any) => any,
|
|
18
|
+
maxQueueTimeLimit = DEFAULT_MAX_QUEUE_TIME
|
|
19
|
+
) {
|
|
20
|
+
let queuedCalls: any[];
|
|
21
|
+
return function (...args: any[]) {
|
|
22
|
+
if (queuedCalls) {
|
|
23
|
+
// this is an estimate of the time an event will take to process, based on the average event cycle time and the queue depth
|
|
24
|
+
if (queuedCalls.length * averageEventCycleTime > maxQueueTimeLimit) {
|
|
25
|
+
return onLimitExceeded(...args);
|
|
26
|
+
}
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
queuedCalls.push({
|
|
29
|
+
args,
|
|
30
|
+
fn() {
|
|
31
|
+
try {
|
|
32
|
+
const result = fn(...args);
|
|
33
|
+
resolve(result);
|
|
34
|
+
} catch (e) {
|
|
35
|
+
reject(e);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
queuedCalls = [];
|
|
42
|
+
waitForNextCycle(performance.now());
|
|
43
|
+
return fn(...args);
|
|
44
|
+
};
|
|
45
|
+
function waitForNextCycle(startTime: number) {
|
|
46
|
+
setImmediate(() => {
|
|
47
|
+
const now = performance.now();
|
|
48
|
+
// get the decaying/running average of the event cycle time
|
|
49
|
+
averageEventCycleTime = (averageEventCycleTime * 4 + now - startTime) / 5;
|
|
50
|
+
const nextCall = queuedCalls.shift();
|
|
51
|
+
if (nextCall) {
|
|
52
|
+
const { fn: nextFunction } = nextCall;
|
|
53
|
+
nextFunction();
|
|
54
|
+
waitForNextCycle(now);
|
|
55
|
+
} else {
|
|
56
|
+
queuedCalls = null;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
setInterval(() => {
|
|
62
|
+
const now = performance.now();
|
|
63
|
+
if (
|
|
64
|
+
now - lastEventQueueCheck - EVENT_QUEUE_MONITORING_INTERVAL > MAX_EVENT_DELAY_TIME &&
|
|
65
|
+
lastWarning + WARNING_INTERVAL < now
|
|
66
|
+
) {
|
|
67
|
+
logger.warn?.(
|
|
68
|
+
`JavaScript execution has taken too long and is not allowing proper event queue cycling, consider using 'await new Promise(setImmediate)' in code that will execute for a long duration`
|
|
69
|
+
);
|
|
70
|
+
lastWarning = now;
|
|
71
|
+
}
|
|
72
|
+
lastEventQueueCheck = now;
|
|
73
|
+
}, EVENT_QUEUE_MONITORING_INTERVAL).unref();
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const RecursiveIterator = require('recursive-iterator');
|
|
4
|
+
const alasql = require('alasql');
|
|
5
|
+
const clone = require('clone');
|
|
6
|
+
const commonUtils = require('../utility/common_utils.js');
|
|
7
|
+
const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
8
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
9
|
+
const { getDatabases } = require('../resources/databases.ts');
|
|
10
|
+
|
|
11
|
+
//exclusion list for validation on group bys
|
|
12
|
+
const customAggregators = ['DISTINCT_ARRAY'];
|
|
13
|
+
|
|
14
|
+
const validateTables = Symbol('validateTables'),
|
|
15
|
+
validateTable = Symbol('validateTable'),
|
|
16
|
+
validateAllColumns = Symbol('validateAllColumns'),
|
|
17
|
+
findColumn = Symbol('findColumn'),
|
|
18
|
+
validateOrderBy = Symbol('validateOrderBy'),
|
|
19
|
+
validateSegment = Symbol('validateSegment'),
|
|
20
|
+
validateColumn = Symbol('validateColumn'),
|
|
21
|
+
setColumnsForTable = Symbol('setColumnsForTable'),
|
|
22
|
+
checkColumnsForAsterisk = Symbol('checkColumnsForAsterisk'),
|
|
23
|
+
validateGroupBy = Symbol('validateGroupBy'),
|
|
24
|
+
hasColumns = Symbol('hasColumns');
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Validates the tables and attributes against the actual schema
|
|
28
|
+
* Validates general SQL rules
|
|
29
|
+
*/
|
|
30
|
+
class SelectValidator {
|
|
31
|
+
constructor(statement) {
|
|
32
|
+
this.statement = statement;
|
|
33
|
+
this.attributes = [];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* entry point for validation
|
|
38
|
+
* @returns {*}
|
|
39
|
+
*/
|
|
40
|
+
validate() {
|
|
41
|
+
if (!this.statement) {
|
|
42
|
+
throw new Error('invalid sql statement');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this[validateTables]();
|
|
46
|
+
this[checkColumnsForAsterisk]();
|
|
47
|
+
this[validateAllColumns]();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* if the statement has columns in it:
|
|
52
|
+
* loops thru the from and join arrays of the AST and passes individual entries into validateTable
|
|
53
|
+
*/
|
|
54
|
+
[validateTables]() {
|
|
55
|
+
if (this[hasColumns]()) {
|
|
56
|
+
if (!this.statement.from || this.statement.from.length === 0) {
|
|
57
|
+
throw `no from clause`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
this.statement.from.forEach((table) => {
|
|
61
|
+
this[validateTable](table);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
if (this.statement.joins) {
|
|
65
|
+
this.statement.joins.forEach((join) => {
|
|
66
|
+
join.table.as = join.as;
|
|
67
|
+
this[validateTable](join.table);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* check to see if there are columns in any part of the select
|
|
75
|
+
* @returns {boolean}
|
|
76
|
+
*/
|
|
77
|
+
[hasColumns]() {
|
|
78
|
+
let hasColumns = false;
|
|
79
|
+
let iterator = new RecursiveIterator(this.statement);
|
|
80
|
+
for (let { node } of iterator) {
|
|
81
|
+
if (node && node.columnid) {
|
|
82
|
+
hasColumns = true;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return hasColumns;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Checks that the table exists in the schema, adds all of it's attributes to the class level collection this.attributes
|
|
91
|
+
* @param table
|
|
92
|
+
*/
|
|
93
|
+
[validateTable](table) {
|
|
94
|
+
if (!table.databaseid) {
|
|
95
|
+
throw `schema not defined for table ${table.tableid}`;
|
|
96
|
+
}
|
|
97
|
+
let databases = getDatabases();
|
|
98
|
+
if (!databases[table.databaseid]) {
|
|
99
|
+
throw handleHDBError(new Error(), HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(table.databaseid), HTTP_STATUS_CODES.NOT_FOUND);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (!databases[table.databaseid][table.tableid]) {
|
|
103
|
+
throw handleHDBError(
|
|
104
|
+
new Error(),
|
|
105
|
+
HDB_ERROR_MSGS.TABLE_NOT_FOUND(table.databaseid, table.tableid),
|
|
106
|
+
HTTP_STATUS_CODES.NOT_FOUND
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//let theTable = clone(table);
|
|
111
|
+
let schemaTable = databases[table.databaseid][table.tableid];
|
|
112
|
+
/*TODO rather than putting every attribute in an array we will create a Map there will be a map element for every table and every table alias
|
|
113
|
+
(this will create duplicate map elements) this will have downstream effects in comparison functions like findColumn*/
|
|
114
|
+
schemaTable.attributes.forEach((attribute) => {
|
|
115
|
+
let attributeClone = clone(attribute);
|
|
116
|
+
attributeClone.table = clone(table);
|
|
117
|
+
this.attributes.push(attributeClone);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* validates the column against the schema
|
|
123
|
+
* @param column
|
|
124
|
+
* @returns {*[]}
|
|
125
|
+
*/
|
|
126
|
+
[findColumn](column) {
|
|
127
|
+
//look to see if this attribute exists on one of the tables we are selecting from
|
|
128
|
+
return this.attributes.filter((attribute) => {
|
|
129
|
+
if (column.tableid) {
|
|
130
|
+
return (
|
|
131
|
+
(attribute.table.as === column.tableid || attribute.table.tableid === column.tableid) &&
|
|
132
|
+
attribute.attribute === column.columnid
|
|
133
|
+
);
|
|
134
|
+
} else {
|
|
135
|
+
return attribute.attribute === column.columnid;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* detects * in the select, if found adds all columns to the select
|
|
142
|
+
*/
|
|
143
|
+
[checkColumnsForAsterisk]() {
|
|
144
|
+
let iterator = new RecursiveIterator(this.statement.columns);
|
|
145
|
+
|
|
146
|
+
for (let { node, path } of iterator) {
|
|
147
|
+
//we check the path to make sure the '*' is not wrapped in some form of expression like count(*)
|
|
148
|
+
if (node && node.columnid === '*' && path.indexOf('expression') < 0) {
|
|
149
|
+
this[setColumnsForTable](node.tableid);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* takes a table and adds all of it's columns to the select. if no table it adds every column from every table in the select
|
|
156
|
+
* @param tableName
|
|
157
|
+
*/
|
|
158
|
+
[setColumnsForTable](tableName) {
|
|
159
|
+
this.attributes.forEach((attribute) => {
|
|
160
|
+
if (
|
|
161
|
+
(!tableName || (tableName && (attribute.table.tableid === tableName || attribute.table.as === tableName))) &&
|
|
162
|
+
!attribute.relation
|
|
163
|
+
) {
|
|
164
|
+
this.statement.columns.push(
|
|
165
|
+
new alasql.yy.Column({
|
|
166
|
+
columnid: attribute.attribute,
|
|
167
|
+
tableid: attribute.table.as ? attribute.table.as : attribute.table.tableid,
|
|
168
|
+
})
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* passes segments to ValidateSegment for validation
|
|
176
|
+
*/
|
|
177
|
+
[validateAllColumns]() {
|
|
178
|
+
this[validateSegment](this.statement.columns, false);
|
|
179
|
+
this[validateSegment](this.statement.joins, false);
|
|
180
|
+
this[validateSegment](this.statement.where, false);
|
|
181
|
+
this[validateGroupBy](this.statement.group, false);
|
|
182
|
+
this[validateSegment](this.statement.order, true);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* iterates the attributes in a segment and validates them against the schema
|
|
187
|
+
* @param segment
|
|
188
|
+
* @param isOrderBy
|
|
189
|
+
* @returns {*}
|
|
190
|
+
*/
|
|
191
|
+
[validateSegment](segment, isOrderBy) {
|
|
192
|
+
if (!segment) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
let iterator = new RecursiveIterator(segment);
|
|
197
|
+
let attributes = [];
|
|
198
|
+
for (let { node } of iterator) {
|
|
199
|
+
if (!commonUtils.isEmpty(node) && !commonUtils.isEmpty(node.columnid) && node.columnid !== '*') {
|
|
200
|
+
if (isOrderBy) {
|
|
201
|
+
this[validateOrderBy](node);
|
|
202
|
+
} else {
|
|
203
|
+
attributes.push(this[validateColumn](node));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return attributes;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* validation specific for GROUP BY
|
|
213
|
+
* makes sure that the non-aggregate functions and columns from the select are represented in the group by and the columns match the schema
|
|
214
|
+
* @param segment
|
|
215
|
+
*/
|
|
216
|
+
[validateGroupBy](segment) {
|
|
217
|
+
if (!segment) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
//check select for aggregates and non-aggregates, if it has both non-aggregates need to be in group by
|
|
221
|
+
let selectColumns = [];
|
|
222
|
+
//here we are pulling out all non-aggregate functions into an array for comparison to the group by
|
|
223
|
+
this.statement.columns.forEach((column) => {
|
|
224
|
+
//this keeps white listed custom functions from being validated
|
|
225
|
+
if (column.funcid && customAggregators.indexOf(column.funcid.toUpperCase()) >= 0) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (!column.aggregatorid && !column.columnid) {
|
|
230
|
+
//this is to make sure functions or any type of evaluation statement is being compared to the select.
|
|
231
|
+
//i.e. "GROUP BY UPPER(name)" needs to have UPPER(name) in the select
|
|
232
|
+
let columnClone = clone(column);
|
|
233
|
+
delete columnClone.as;
|
|
234
|
+
selectColumns.push(columnClone);
|
|
235
|
+
} else if (column.columnid) {
|
|
236
|
+
let found = this[findColumn](column)[0];
|
|
237
|
+
if (found) {
|
|
238
|
+
selectColumns.push(found);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
//here we iterate the group by and compare to what is in the select and make sure they match appropriately
|
|
244
|
+
this.statement.group.forEach((groupColumn) => {
|
|
245
|
+
let foundColumn = null;
|
|
246
|
+
|
|
247
|
+
if (!groupColumn.columnid) {
|
|
248
|
+
//TODO can use for of to break out of the loop rather than this janky way
|
|
249
|
+
selectColumns.forEach((column, x) => {
|
|
250
|
+
if (column.toString() === groupColumn.toString()) {
|
|
251
|
+
foundColumn = column;
|
|
252
|
+
selectColumns.splice(x, 1);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
} else {
|
|
257
|
+
let foundGroupColumn = this[findColumn](groupColumn);
|
|
258
|
+
|
|
259
|
+
if (!foundGroupColumn || foundGroupColumn.length === 0) {
|
|
260
|
+
throw `unknown column '${groupColumn.toString()}' in group by`;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (foundGroupColumn.length > 1) {
|
|
264
|
+
throw `ambiguously defined column '${groupColumn.toString()}' in group by`;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
//TODO can use for of to break out of the loop rather than this janky way
|
|
268
|
+
selectColumns.forEach((column, x) => {
|
|
269
|
+
if (
|
|
270
|
+
column.attribute === foundGroupColumn[0].attribute &&
|
|
271
|
+
column.table.tableid === foundGroupColumn[0].table.tableid
|
|
272
|
+
) {
|
|
273
|
+
foundColumn = column;
|
|
274
|
+
selectColumns.splice(x, 1);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!foundColumn) {
|
|
281
|
+
throw `group by column '${groupColumn.toString()}' must be in select`;
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
if (selectColumns.length > 0) {
|
|
286
|
+
throw `select column '${
|
|
287
|
+
selectColumns[0].attribute ? selectColumns[0].attribute : selectColumns[0].toString()
|
|
288
|
+
}' must be in group by`;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Order BY specific validation
|
|
294
|
+
*
|
|
295
|
+
* @param column
|
|
296
|
+
*/
|
|
297
|
+
[validateOrderBy](column) {
|
|
298
|
+
let foundColumns = this.statement.columns.filter((col) => col.as === column.columnid);
|
|
299
|
+
|
|
300
|
+
if (foundColumns.length > 1) {
|
|
301
|
+
let columnName = (column.tableid ? column.tableid + '.' : '') + column.columnid;
|
|
302
|
+
throw `ambiguous column reference ${columnName} in order by`;
|
|
303
|
+
} else if (foundColumns.length === 0) {
|
|
304
|
+
this[validateColumn](column);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* validates a column to the schema
|
|
310
|
+
* @param column
|
|
311
|
+
* @returns {*}
|
|
312
|
+
*/
|
|
313
|
+
[validateColumn](column) {
|
|
314
|
+
let foundColumns = this[findColumn](column);
|
|
315
|
+
|
|
316
|
+
let columnName = (column.tableid ? column.tableid + '.' : '') + column.columnid;
|
|
317
|
+
|
|
318
|
+
if (foundColumns.length === 0) {
|
|
319
|
+
throw `unknown column ${columnName}`;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (foundColumns.length > 1) {
|
|
323
|
+
throw `ambiguous column reference ${columnName}`;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return foundColumns[0];
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
module.exports = SelectValidator;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/***
|
|
2
|
+
* alasqlFunctionImporter.js
|
|
3
|
+
*
|
|
4
|
+
* PUrpose of this is to set up a central module to define and import custom functions into alasql
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const alasqlExtension = require('../utility/functions/sql/alaSQLExtension.js'),
|
|
8
|
+
dateFunctions = require('../utility/functions/date/dateFunctions.js'),
|
|
9
|
+
geo = require('../utility/functions/geo.js');
|
|
10
|
+
|
|
11
|
+
//import the custom function, need to define an upper and lower case version of the function so it is parsed properly in alasql
|
|
12
|
+
module.exports = (alasql) => {
|
|
13
|
+
/*
|
|
14
|
+
AGGREGATE FUNCTIONS
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
alasql.aggr.mad = alasql.aggr.MAD = alasqlExtension.mad;
|
|
18
|
+
alasql.aggr.mean = alasql.aggr.MEAN = alasqlExtension.mean;
|
|
19
|
+
alasql.aggr.mode = alasql.aggr.MODE = alasqlExtension.mode;
|
|
20
|
+
alasql.aggr.prod = alasql.aggr.PROD = alasqlExtension.prod;
|
|
21
|
+
//we are overriding alasql's median function as their algorithm is incorrect
|
|
22
|
+
alasql.aggr.median = alasql.aggr.MEDIAN = alasqlExtension.median;
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
CUSTOM FUNCTIONS
|
|
26
|
+
*/
|
|
27
|
+
alasql.fn.distinct_array = alasql.fn.DISTINCT_ARRAY = alasqlExtension.distinct_array;
|
|
28
|
+
alasql.fn.search_json = alasql.fn.SEARCH_JSON = alasqlExtension.searchJSON;
|
|
29
|
+
alasql.fn.__ala__ = alasql;
|
|
30
|
+
|
|
31
|
+
//Date Functions...
|
|
32
|
+
|
|
33
|
+
alasql.fn.current_date = alasql.fn.CURRENT_DATE = dateFunctions.current_date;
|
|
34
|
+
alasql.fn.current_time = alasql.fn.CURRENT_TIME = dateFunctions.current_time;
|
|
35
|
+
alasql.fn.extract = alasql.fn.EXTRACT = dateFunctions.extract;
|
|
36
|
+
alasql.fn.date = alasql.fn.DATE = dateFunctions.date;
|
|
37
|
+
alasql.fn.date_format = alasql.fn.DATE_FORMAT = dateFunctions.date_format;
|
|
38
|
+
alasql.fn.date_add = alasql.fn.DATE_ADD = dateFunctions.date_add;
|
|
39
|
+
alasql.fn.date_sub = alasql.fn.DATE_SUB = dateFunctions.date_sub;
|
|
40
|
+
alasql.fn.date_diff = alasql.fn.DATE_DIFF = alasql.fn.datediff = alasql.fn.DATEDIFF = dateFunctions.date_diff;
|
|
41
|
+
alasql.fn.now = alasql.fn.NOW = dateFunctions.now;
|
|
42
|
+
alasql.fn.offset_utc = alasql.fn.OFFSET_UTC = dateFunctions.offset_utc;
|
|
43
|
+
alasql.fn.get_server_time = alasql.fn.GET_SERVER_TIME = dateFunctions.get_server_time;
|
|
44
|
+
//GETDATE() and CURRENT_TIMESTAMP reference the date/time value from NOW() in alasql but we need to monkey patch
|
|
45
|
+
// them here as well with the new now logic
|
|
46
|
+
alasql.fn.getdate = alasql.fn.GETDATE = dateFunctions.now;
|
|
47
|
+
alasql.fn.current_timestamp = alasql.fn.CURRENT_TIMESTAMP = dateFunctions.now;
|
|
48
|
+
|
|
49
|
+
/*
|
|
50
|
+
CUSTOM GEO FUNCTIONS
|
|
51
|
+
*/
|
|
52
|
+
alasql.fn.geoarea = alasql.fn.GEOAREA = alasql.fn.geoArea = geo.geoArea;
|
|
53
|
+
alasql.fn.geocircle = alasql.fn.GEOCIRCLE = alasql.fn.geoCircle = geo.geoCircle;
|
|
54
|
+
alasql.fn.geocontains = alasql.fn.GEOCONTAINS = alasql.fn.geoContains = geo.geoContains;
|
|
55
|
+
alasql.fn.geoconvert = alasql.fn.GEOCONVERT = alasql.fn.geoConvert = geo.geoConvert;
|
|
56
|
+
alasql.fn.geocrosses = alasql.fn.GEOCROSSES = alasql.fn.geoCrosses = geo.geoCrosses;
|
|
57
|
+
alasql.fn.geodifference = alasql.fn.GEODIFFERENCE = alasql.fn.geoDifference = geo.geoDifference;
|
|
58
|
+
alasql.fn.geodistance = alasql.fn.GEODISTANCE = alasql.fn.geoDistance = geo.geoDistance;
|
|
59
|
+
alasql.fn.geoequal = alasql.fn.GEOEQUAL = alasql.fn.geoEqual = geo.geoEqual;
|
|
60
|
+
alasql.fn.geolength = alasql.fn.GEOLENGTH = alasql.fn.geoLength = geo.geoLength;
|
|
61
|
+
alasql.fn.geonear = alasql.fn.GEONEAR = alasql.fn.geoNear = geo.geoNear;
|
|
62
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const alasql = require('alasql');
|
|
2
|
+
const search = require('../dataLayer/search.js');
|
|
3
|
+
const log = require('../utility/logging/harper_logger.js');
|
|
4
|
+
const harperBridge = require('../dataLayer/harperBridge/harperBridge.js');
|
|
5
|
+
const util = require('util');
|
|
6
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
7
|
+
const terms = require('../utility/hdbTerms.ts');
|
|
8
|
+
const globalSchema = require('../utility/globalSchema.js');
|
|
9
|
+
|
|
10
|
+
const RECORD = 'record';
|
|
11
|
+
const SUCCESS = 'successfully deleted';
|
|
12
|
+
|
|
13
|
+
const cbConvertDelete = util.callbackify(convertDelete);
|
|
14
|
+
const pSearchSearch = util.promisify(search.search);
|
|
15
|
+
const pGetTableSchema = util.promisify(globalSchema.getTableSchema);
|
|
16
|
+
|
|
17
|
+
module.exports = {
|
|
18
|
+
convertDelete: cbConvertDelete,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
function generateReturnMessage(deleteResultsObject) {
|
|
22
|
+
return `${deleteResultsObject.deleted_hashes.length} ${RECORD}${
|
|
23
|
+
deleteResultsObject.deleted_hashes.length === 1 ? `` : `s`
|
|
24
|
+
} ${SUCCESS}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function convertDelete({ statement, hdb_user }) {
|
|
28
|
+
//convert this update statement to a search capable statement
|
|
29
|
+
let tableInfo = await pGetTableSchema(statement.table.databaseid, statement.table.tableid);
|
|
30
|
+
|
|
31
|
+
//convert this delete statement to a SQL search capable statement
|
|
32
|
+
hdbUtils.backtickASTSchemaItems(statement);
|
|
33
|
+
let { table: from, where } = statement;
|
|
34
|
+
|
|
35
|
+
let whereString = hdbUtils.isEmpty(where) ? '' : ` WHERE ${where.toString()}`;
|
|
36
|
+
let selectString = `SELECT ${tableInfo.hash_attribute} FROM ${from.toString()} ${whereString}`;
|
|
37
|
+
let searchStatement = alasql.parse(selectString).statements[0];
|
|
38
|
+
|
|
39
|
+
let deleteObj = {
|
|
40
|
+
operation: terms.OPERATIONS_ENUM.DELETE,
|
|
41
|
+
schema: from.databaseid_orig,
|
|
42
|
+
table: from.tableid_orig,
|
|
43
|
+
hdb_user,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
//let result = await transaction.writeTransaction(tableInfo.schema, tableInfo.name, async () => {
|
|
48
|
+
deleteObj.records = await pSearchSearch(searchStatement);
|
|
49
|
+
let result = await harperBridge.deleteRecords(deleteObj);
|
|
50
|
+
//});
|
|
51
|
+
//await write.flush({ schema: tableInfo.schema, table: tableInfo.name });
|
|
52
|
+
|
|
53
|
+
if (hdbUtils.isEmptyOrZeroLength(result.message)) {
|
|
54
|
+
result.message = generateReturnMessage(result);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
delete result.txn_time;
|
|
58
|
+
|
|
59
|
+
return result;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
log.error(err);
|
|
62
|
+
if (err.hdb_code) {
|
|
63
|
+
throw err.message;
|
|
64
|
+
}
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
}
|