@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.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. 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;