@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,89 @@
1
+ 'use strict';
2
+
3
+ const hdbUtils = require('../../../../utility/common_utils.js');
4
+ const deleteUtility = require('../../../../utility/lmdb/deleteUtility.js');
5
+ const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
6
+ const { getSchemaPath } = require('../lmdbUtility/initializePaths.js');
7
+ const writeTransaction = require('../lmdbUtility/lmdbWriteTransaction.js');
8
+ const logger = require('../../../../utility/logging/harper_logger.js');
9
+
10
+ module.exports = lmdbDeleteRecords;
11
+
12
+ /**
13
+ * Deletes a full table row at a certain hash.
14
+ * @param deleteObj
15
+ * @param writeToTxnLog {boolean}
16
+ */
17
+ async function lmdbDeleteRecords(deleteObj, writeToTxnLog = true) {
18
+ let schemaTable = global.hdb_schema[deleteObj.schema][deleteObj.table];
19
+ let hash_attribute = schemaTable.hash_attribute;
20
+ if (hdbUtils.isEmpty(hash_attribute)) {
21
+ throw new Error(`could not retrieve hash attribute for schema:${deleteObj.schema} and table ${deleteObj.table}`);
22
+ }
23
+
24
+ //this would happen for SQL delete
25
+ if (hdbUtils.isEmptyOrZeroLength(deleteObj.hash_values) && !hdbUtils.isEmptyOrZeroLength(deleteObj.records)) {
26
+ //reintitialize hash_values since it is empty we are not sure if the variable has been set to empty array yet
27
+ deleteObj.hash_values = [];
28
+ for (let k = 0; k < deleteObj.records.length; k++) {
29
+ let hashValue = deleteObj.records[k][hash_attribute];
30
+ if (!hdbUtils.isEmpty(hashValue)) {
31
+ deleteObj.hash_values.push(hashValue);
32
+ }
33
+ }
34
+ }
35
+
36
+ if (hdbUtils.isEmptyOrZeroLength(deleteObj.hash_values)) {
37
+ return createDeleteResponse([], []);
38
+ } else if (!Array.isArray(deleteObj.hash_values)) {
39
+ throw new Error('hash_values must be an array');
40
+ }
41
+
42
+ //this is needed for clustering, right now clustering expects delete to have a records array and use that to get the hash_values.
43
+ if (hdbUtils.isEmptyOrZeroLength(deleteObj.records)) {
44
+ deleteObj.records = [];
45
+ for (let x = 0; x < deleteObj.hash_values.length; x++) {
46
+ deleteObj.records[x] = {
47
+ [hash_attribute]: deleteObj.hash_values[x],
48
+ };
49
+ }
50
+ }
51
+ let envBasePath = getSchemaPath(deleteObj.schema, deleteObj.table);
52
+ let environment = await environmentUtility.openEnvironment(envBasePath, deleteObj.table);
53
+
54
+ let response = await deleteUtility.deleteRecords(
55
+ environment,
56
+ hash_attribute,
57
+ deleteObj.hash_values,
58
+ deleteObj.__origin?.timestamp
59
+ );
60
+
61
+ try {
62
+ if (writeToTxnLog === true) {
63
+ await writeTransaction(deleteObj, response);
64
+ }
65
+ } catch (e) {
66
+ logger.error(`unable to write transaction due to ${e.message}`);
67
+ }
68
+
69
+ return createDeleteResponse(response.deleted, response.skipped, response.txn_time);
70
+ }
71
+
72
+ /**
73
+ * creates the response object for deletes based on the deleted & skipped hashes
74
+ * @param {[]} deleted - list of hash values successfully deleted
75
+ * @param {[]} skipped - list of hash values which did not get deleted
76
+ * @param {number} txnTime - the transaction timestamp
77
+ * @returns {{skipped_hashes: [], deleted_hashes: [], message: string}}
78
+ */
79
+ function createDeleteResponse(deleted, skipped, txnTime) {
80
+ let total = deleted.length + skipped.length;
81
+ let plural = total === 1 ? 'record' : 'records';
82
+
83
+ return {
84
+ message: `${deleted.length} of ${total} ${plural} successfully deleted`,
85
+ deleted_hashes: deleted,
86
+ skipped_hashes: skipped,
87
+ txn_time: txnTime,
88
+ };
89
+ }
@@ -0,0 +1,109 @@
1
+ 'use strict';
2
+
3
+ const SearchObject = require('../../../SearchObject.js');
4
+ const DeleteObject = require('../../../DeleteObject.js');
5
+ // eslint-disable-next-line no-unused-vars
6
+ const DropAttributeObject = require('../../../DropAttributeObject.js');
7
+ const hdbTerms = require('../../../../utility/hdbTerms.ts');
8
+ const commonUtils = require('../../../../utility/common_utils.js');
9
+ const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
10
+ const systemSchema = require('../../../../json/systemSchema.json');
11
+ const searchByValue = require('./lmdbSearchByValue.js');
12
+ const deleteRecords = require('./lmdbDeleteRecords.js');
13
+ const { getSchemaPath } = require('../lmdbUtility/initializePaths.js');
14
+
15
+ module.exports = lmdbDropAttribute;
16
+
17
+ /**
18
+ * First deletes the attribute/dbi from lmdb then removes its record from system table
19
+ * @param {DropAttributeObject} dropAttributeObj
20
+ * @param {Boolean} [removeData] - optional, defaults to false
21
+ * @returns {undefined}
22
+ */
23
+ async function lmdbDropAttribute(dropAttributeObj, removeData = true) {
24
+ let tableInfo;
25
+ if (dropAttributeObj.schema === hdbTerms.SYSTEM_SCHEMA_NAME) {
26
+ tableInfo = systemSchema[dropAttributeObj.table];
27
+ } else {
28
+ tableInfo = global.hdb_schema[dropAttributeObj.schema][dropAttributeObj.table];
29
+ }
30
+
31
+ //remove meta data
32
+ let deleteResults = await dropAttributeFromSystem(dropAttributeObj);
33
+ //drop dbi
34
+ let schemaPath = getSchemaPath(dropAttributeObj.schema, dropAttributeObj.table);
35
+ let env = await environmentUtility.openEnvironment(schemaPath, dropAttributeObj.table);
36
+
37
+ //in the scenario of drop table / schema we don't need to remove individual elements since we are removing entire environments
38
+ if (removeData === true) {
39
+ await removeAttributeFromAllObjects(dropAttributeObj, env, tableInfo.hash_attribute);
40
+ }
41
+
42
+ environmentUtility.dropDBI(env, dropAttributeObj.attribute);
43
+
44
+ return deleteResults;
45
+ }
46
+
47
+ /**
48
+ * iterates the hash attribute dbi and removes the attribute dropped
49
+ * @param {DropAttributeObject} dropAttributeObj
50
+ * @param {lmdb.RootDatabase} env
51
+ * @param {String} hash_attribute
52
+ */
53
+ async function removeAttributeFromAllObjects(dropAttributeObj, env, hash_attribute) {
54
+ //get reference to hash attribute index (dbi)
55
+ let dbi = environmentUtility.openDBI(env, hash_attribute);
56
+
57
+ //declare just one promise for the bulk write, read the await below
58
+ let promise;
59
+ let attributeToDelete = dropAttributeObj.attribute;
60
+ //iterate the entire hash attribute index to remove the dropped attribute and update the entry
61
+ for (let { key, value, version } of dbi.getRange({ start: false, versions: true })) {
62
+ //delete the attribute being dropped from the record
63
+ let updatedValue = {};
64
+ for (let property in value) {
65
+ if (property !== attributeToDelete) updatedValue[property] = value[property];
66
+ }
67
+ // maintain the same version number as we re-save the data with the
68
+ // property dropped
69
+ promise = env.dbis[hash_attribute].put(key, updatedValue, version);
70
+ }
71
+ //since lmdb processes all promised writes in order we only need to wait for the last promise to execute to know all the previous ones have also finished
72
+ await promise;
73
+ }
74
+
75
+ /**
76
+ * Searches the system attributes table for attribute record then sends record to delete to be removed from system table.
77
+ * @param {DropAttributeObject} dropAttributeObj
78
+ * @returns {undefined}
79
+ */
80
+ async function dropAttributeFromSystem(dropAttributeObj) {
81
+ let searchObj = new SearchObject(
82
+ hdbTerms.SYSTEM_SCHEMA_NAME,
83
+ hdbTerms.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,
84
+ hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,
85
+ `${dropAttributeObj.schema}.${dropAttributeObj.table}`,
86
+ undefined,
87
+ [hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY, hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY]
88
+ );
89
+
90
+ let tableAttributes = Array.from(await searchByValue(searchObj));
91
+ let attribute = tableAttributes.filter(
92
+ (attr) => attr[hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ATTRIBUTE_KEY] === dropAttributeObj.attribute
93
+ );
94
+ if (commonUtils.isEmptyOrZeroLength(attribute)) {
95
+ throw new Error(
96
+ `Attribute '${dropAttributeObj.attribute}' was not found in '${dropAttributeObj.schema}.${dropAttributeObj.table}'`
97
+ );
98
+ }
99
+
100
+ let id = attribute.map((attr) => attr[hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]);
101
+
102
+ let deleteTableObj = new DeleteObject(
103
+ hdbTerms.SYSTEM_SCHEMA_NAME,
104
+ hdbTerms.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,
105
+ id
106
+ );
107
+
108
+ return deleteRecords(deleteTableObj);
109
+ }
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs-extra');
4
+ const SearchObject = require('../../../SearchObject.js');
5
+ const SearchByHashObject = require('../../../SearchByHashObject.js');
6
+ const DeleteObject = require('../../../DeleteObject.js');
7
+ const dropTable = require('./lmdbDropTable.js');
8
+ const deleteRecords = require('./lmdbDeleteRecords.js');
9
+ const getDataByHash = require('./lmdbGetDataByHash.js');
10
+ const searchDataByValue = require('./lmdbSearchByValue.js');
11
+ const hdbTerms = require('../../../../utility/hdbTerms.ts');
12
+ const { getSchemaPath } = require('../lmdbUtility/initializePaths.js');
13
+ const { handleHDBError, hdbErrors } = require('../../../../utility/errors/hdbError.js');
14
+ const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
15
+
16
+ module.exports = lmdbDropSchema;
17
+
18
+ /**
19
+ * deletes all environment files under the schema folder, deletes all schema/table/attribute meta data from system
20
+ * @param dropSchemaObj
21
+ */
22
+ async function lmdbDropSchema(dropSchemaObj) {
23
+ let deleteSchema;
24
+
25
+ try {
26
+ deleteSchema = await validateDropSchema(dropSchemaObj.schema);
27
+
28
+ //We search in system > hdbTable for tables with the schema to ensure we are deleting all schema datastores
29
+ const tableSearchObj = new SearchObject(
30
+ hdbTerms.SYSTEM_SCHEMA_NAME,
31
+ hdbTerms.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,
32
+ hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,
33
+ deleteSchema,
34
+ undefined,
35
+ [hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]
36
+ );
37
+
38
+ let tables = Array.from(await searchDataByValue(tableSearchObj));
39
+
40
+ for (let x = 0; x < tables.length; x++) {
41
+ const deleteTableObj = {
42
+ schema: deleteSchema,
43
+ table: tables[x].name,
44
+ };
45
+ try {
46
+ await dropTable(deleteTableObj);
47
+ } catch (e) {
48
+ //this message would get thrown for an environment that doesn't exist
49
+ if (e.message !== 'invalid environment') {
50
+ throw e;
51
+ }
52
+ }
53
+ }
54
+
55
+ //After all tables for schema are deleted, we can delete the schema
56
+ const deleteSchemaObj = new DeleteObject(
57
+ hdbTerms.SYSTEM_SCHEMA_NAME,
58
+ hdbTerms.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,
59
+ [deleteSchema]
60
+ );
61
+
62
+ // Delete the schema from the system > hdbSchema datastore
63
+ await deleteRecords(deleteSchemaObj);
64
+ let schemaPath = getSchemaPath(deleteSchema);
65
+ await fs.remove(schemaPath);
66
+ } catch (err) {
67
+ throw err;
68
+ }
69
+ }
70
+
71
+ async function validateDropSchema(dropSchema) {
72
+ let searchObj = new SearchByHashObject(
73
+ hdbTerms.SYSTEM_SCHEMA_NAME,
74
+ hdbTerms.SYSTEM_TABLE_NAMES.SCHEMA_TABLE_NAME,
75
+ [dropSchema],
76
+ [hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY]
77
+ );
78
+
79
+ let searchResult;
80
+ let deleteSchema;
81
+
82
+ try {
83
+ searchResult = Array.from(await getDataByHash(searchObj));
84
+ } catch (err) {
85
+ throw err;
86
+ }
87
+
88
+ // Data found by the search function should match the dropSchema
89
+ for (let [, schema] of searchResult) {
90
+ if (schema.name === dropSchema) {
91
+ deleteSchema = dropSchema;
92
+ }
93
+ }
94
+
95
+ if (!deleteSchema) {
96
+ throw handleHDBError(
97
+ new Error(),
98
+ HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(dropSchema),
99
+ HTTP_STATUS_CODES.NOT_FOUND,
100
+ undefined,
101
+ undefined,
102
+ true
103
+ );
104
+ }
105
+
106
+ return deleteSchema;
107
+ }
@@ -0,0 +1,137 @@
1
+ 'use strict';
2
+
3
+ const SearchObject = require('../../../SearchObject.js');
4
+ const DeleteObject = require('../../../DeleteObject.js');
5
+ const searchByValue = require('./lmdbSearchByValue.js');
6
+ const deleteRecords = require('./lmdbDeleteRecords.js');
7
+ const hdbTerms = require('../../../../utility/hdbTerms.ts');
8
+ const hdbUtils = require('../../../../utility/common_utils.js');
9
+ const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
10
+ const { getTransactionAuditStorePath, getSchemaPath } = require('../lmdbUtility/initializePaths.js');
11
+ const log = require('../../../../utility/logging/harper_logger.js');
12
+
13
+ module.exports = lmdbDropTable;
14
+
15
+ /**
16
+ * Calls drops the table, all of it's attribute & deletes the environment
17
+ * @param dropTableObj
18
+ */
19
+ async function lmdbDropTable(dropTableObj) {
20
+ try {
21
+ if (
22
+ hdbUtils.isEmpty(global.hdb_schema[dropTableObj.schema]) ||
23
+ hdbUtils.isEmpty(global.hdb_schema[dropTableObj.schema][dropTableObj.table])
24
+ ) {
25
+ throw new Error(`unknown schema:${dropTableObj.schema} and table ${dropTableObj.table}`);
26
+ }
27
+ await deleteAttributesFromSystem(dropTableObj);
28
+ await dropTableFromSystem(dropTableObj);
29
+
30
+ let schemaPath = getSchemaPath(dropTableObj.schema, dropTableObj.table);
31
+ try {
32
+ await environmentUtility.deleteEnvironment(schemaPath, dropTableObj.table);
33
+ } catch (e) {
34
+ if (e.message === 'invalid environment') {
35
+ log.warn(`cannot delete environment for ${dropTableObj.schema}.${dropTableObj.table}, environment not found`);
36
+ } else {
37
+ throw e;
38
+ }
39
+ }
40
+
41
+ try {
42
+ let transactionPath = getTransactionAuditStorePath(dropTableObj.schema, dropTableObj.table);
43
+ await environmentUtility.deleteEnvironment(transactionPath, dropTableObj.table, true);
44
+ } catch (e) {
45
+ if (e.message === 'invalid environment') {
46
+ log.warn(`cannot delete environment for ${dropTableObj.schema}.${dropTableObj.table}, environment not found`);
47
+ } else {
48
+ throw e;
49
+ }
50
+ }
51
+ } catch (err) {
52
+ throw err;
53
+ }
54
+ }
55
+
56
+ /**
57
+ *
58
+ * @param dropTableObj
59
+ * @returns {Promise<void>}
60
+ */
61
+ async function deleteAttributesFromSystem(dropTableObj) {
62
+ let searchObj = new SearchObject(
63
+ hdbTerms.SYSTEM_SCHEMA_NAME,
64
+ hdbTerms.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,
65
+ hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_TABLE_KEY,
66
+ `${dropTableObj.schema}.${dropTableObj.table}`,
67
+ undefined,
68
+ [hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY]
69
+ );
70
+
71
+ let searchResult = Array.from(await searchByValue(searchObj));
72
+
73
+ let deleteIds = [];
74
+ for (let x = 0; x < searchResult.length; x++) {
75
+ let entry = searchResult[x];
76
+ deleteIds.push(entry.id);
77
+ }
78
+
79
+ if (deleteIds.length === 0) {
80
+ return;
81
+ }
82
+
83
+ let deleteTableObj = new DeleteObject(
84
+ hdbTerms.SYSTEM_SCHEMA_NAME,
85
+ hdbTerms.SYSTEM_TABLE_NAMES.ATTRIBUTE_TABLE_NAME,
86
+ deleteIds
87
+ );
88
+
89
+ await deleteRecords(deleteTableObj);
90
+ }
91
+
92
+ /**
93
+ * Searches the system table for the table hash, then uses hash to delete table from system.
94
+ * @param dropTableObj
95
+ */
96
+ async function dropTableFromSystem(dropTableObj) {
97
+ let searchObj = new SearchObject(
98
+ hdbTerms.SYSTEM_SCHEMA_NAME,
99
+ hdbTerms.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME,
100
+ hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,
101
+ dropTableObj.table,
102
+ undefined,
103
+ [
104
+ hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_NAME_KEY,
105
+ hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_SCHEMA_KEY,
106
+ hdbTerms.SYSTEM_DEFAULT_ATTRIBUTE_NAMES.ATTR_ID_KEY,
107
+ ]
108
+ );
109
+ let searchResult;
110
+ let deleteTable;
111
+ try {
112
+ searchResult = Array.from(await searchByValue(searchObj));
113
+ } catch (err) {
114
+ throw err;
115
+ }
116
+
117
+ // Data found by the search function should match the dropTableObject
118
+ for (let x = 0; x < searchResult.length; x++) {
119
+ let item = searchResult[x];
120
+ if (item.name === dropTableObj.table && item.schema === dropTableObj.schema) {
121
+ deleteTable = item;
122
+ }
123
+ }
124
+
125
+ if (!deleteTable) {
126
+ throw new Error(`${dropTableObj.schema}.${dropTableObj.table} was not found`);
127
+ }
128
+
129
+ let deleteTableObj = new DeleteObject(hdbTerms.SYSTEM_SCHEMA_NAME, hdbTerms.SYSTEM_TABLE_NAMES.TABLE_TABLE_NAME, [
130
+ deleteTable.id,
131
+ ]);
132
+ try {
133
+ await deleteRecords(deleteTableObj);
134
+ } catch (err) {
135
+ throw err;
136
+ }
137
+ }
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ const { getSchemaPath } = require('../lmdbUtility/initializePaths.js');
4
+ const environmentUtility = require('../../../../utility/lmdb/environmentUtility.js');
5
+
6
+ module.exports = {
7
+ flush,
8
+ resetReadTxn,
9
+ };
10
+
11
+ /**
12
+ * This is wrapper for sync/flush to disk
13
+ * @param schema
14
+ * @param table
15
+ * @returns {Promise<any>}
16
+ */
17
+ async function flush(schema, table) {
18
+ let environment = await environmentUtility.openEnvironment(getSchemaPath(schema, table), table.toString());
19
+ return environment.flushed;
20
+ }
21
+
22
+ /**
23
+ * This is wrapper for resetting the current read transaction to ensure it is the very latest
24
+ * @param schema
25
+ * @param table
26
+ * @returns {void}
27
+ */
28
+ async function resetReadTxn(schema, table) {
29
+ try {
30
+ let environment = await environmentUtility.openEnvironment(getSchemaPath(schema, table), table.toString());
31
+ environment.resetReadTxn();
32
+ } catch {
33
+ // if no environment, then the read txn can't be out of date!
34
+ }
35
+ }
@@ -0,0 +1,111 @@
1
+ 'use strict';
2
+
3
+ const { Readable } = require('stream');
4
+ const { getDatabases } = require('../../../../resources/databases.ts');
5
+ const { readSync, openSync, createReadStream } = require('fs');
6
+ const { open } = require('lmdb');
7
+ const { OpenDBIObject } = require('../../../../utility/lmdb/OpenDBIObject.js');
8
+ const OpenEnvironmentObject = require('../../../../utility/lmdb/OpenEnvironmentObject.js');
9
+ const { AUDIT_STORE_OPTIONS } = require('../../../../resources/auditStore.ts');
10
+ const { INTERNAL_DBIS_NAME, AUDIT_STORE_NAME } = require('../../../../utility/lmdb/terms.js');
11
+
12
+ module.exports = getBackup;
13
+ const META_SIZE = 32768;
14
+ const DELAY_ITERATIONS = 100;
15
+ /**
16
+ * function execute the readTransactionLog operation
17
+ * @param {GetBackupObject} getBackupObj
18
+ * @returns {Promise<[]>}
19
+ */
20
+ async function getBackup(getBackupObj) {
21
+ const databaseName = getBackupObj.database || getBackupObj.schema || 'data';
22
+ const database = getDatabases()[databaseName];
23
+ const backupDate = new Date().toISOString();
24
+ let tables = getBackupObj.tables || (getBackupObj.table && [getBackupObj.table]);
25
+ if (tables) {
26
+ // if tables are specified, we have to copy the database with just the specified tables and then stream that
27
+ let tableClass = database[tables[0]];
28
+ if (!tableClass) throw new Error(`Can not find table ${tables[0]}`);
29
+ // we use the attribute store to drive this process, finding the right stores to duplicate
30
+ let attributeStore = tableClass.dbisDB;
31
+ let backupRoot = open({ noSync: true, maxDbs: OpenEnvironmentObject.MAX_DBS }); // open a temporary database (this
32
+ // will also cause it to
33
+ // close on completion)
34
+ let resolution;
35
+ let backupAttributeStore = backupRoot.openDB(INTERNAL_DBIS_NAME, new OpenDBIObject(false));
36
+ let readTxn = attributeStore.useReadTransaction();
37
+ let i = 0;
38
+ const copyDatabase = async function (storeName, options) {
39
+ options.encoding = 'binary'; // directly copy bytes
40
+ options.encoder = undefined;
41
+ let backupStore = backupRoot.openDB(storeName, options);
42
+ let sourceStore = attributeStore.openDB(storeName, options);
43
+ for (let { key, version, value } of sourceStore.getRange({
44
+ start: null,
45
+ transaction: readTxn,
46
+ versions: sourceStore.useVersions,
47
+ })) {
48
+ resolution = backupStore.put(key, value, version);
49
+ if (i++ % DELAY_ITERATIONS === 0) {
50
+ await new Promise((resolve) => setTimeout(resolve, 20));
51
+ if (readTxn.openTimer) readTxn.openTimer = 0; // reset any timer monitoring this
52
+ }
53
+ }
54
+ };
55
+ for (let { key, value: attributeInfo } of attributeStore.getRange({ transaction: readTxn, start: false })) {
56
+ if (tables.some((table) => key.startsWith?.(table + '/'))) {
57
+ // it is a store we need to copy
58
+ backupAttributeStore.put(key, attributeInfo);
59
+ const [, attribute] = key.split('/');
60
+ let isPrimaryKey = !attribute;
61
+ let options = new OpenDBIObject(!isPrimaryKey, isPrimaryKey);
62
+ await copyDatabase(key, options);
63
+ }
64
+ }
65
+ if (getBackupObj.include_audit) {
66
+ await copyDatabase(AUDIT_STORE_NAME, { ...AUDIT_STORE_OPTIONS });
67
+ }
68
+ await resolution;
69
+ let stream = createReadStream(backupRoot.path);
70
+ stream.headers = getHeaders();
71
+ stream.on('close', () => {
72
+ readTxn.done();
73
+ backupRoot.close(); // this should delete it
74
+ });
75
+ return stream;
76
+ }
77
+ const firstTable = database[Object.keys(database)[0]];
78
+ const store = firstTable.primaryStore;
79
+
80
+ let fd = openSync(store.path);
81
+ return store.transaction(() => {
82
+ let metaBuffers = Buffer.alloc(META_SIZE);
83
+ readSync(fd, metaBuffers, 0, META_SIZE); // sync, need to do this as fast as possible since we are in a write txn
84
+ store.resetReadTxn(); // make sure we are not using a cached read transaction, force a fresh one
85
+ let readTxn = store.useReadTransaction(); // this guarantees the current transaction is preserved in the backup
86
+ // renew is necessary because normally renew is actually lazily called on the next db operation, but
87
+ // we are not performing any db operations
88
+ readTxn.renew();
89
+ // create a file stream that starts after the meta area
90
+ let fileStream = createReadStream(null, { fd, start: META_SIZE });
91
+ let stream = new Readable.from(
92
+ (async function* () {
93
+ yield metaBuffers; // return the meta area that was frozen inside the write transaction
94
+ for await (const chunk of fileStream) {
95
+ if (readTxn.openTimer) readTxn.openTimer = 0; // reset any timer monitoring this
96
+ yield chunk;
97
+ }
98
+ readTxn.done(); // done with the read txn
99
+ })()
100
+ );
101
+ stream.headers = getHeaders();
102
+ return stream;
103
+ });
104
+ function getHeaders() {
105
+ const headers = new Map();
106
+ headers.set('content-type', 'application/octet-stream');
107
+ headers.set('content-disposition', `attachment; filename="${databaseName}"`);
108
+ headers.set('date', backupDate);
109
+ return headers;
110
+ }
111
+ }
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ const searchUtility = require('../../../../utility/lmdb/searchUtility.js');
4
+ const hashSearchInit = require('../lmdbUtility/initializeHashSearch.js');
5
+
6
+ module.exports = lmdbGetDataByHash;
7
+
8
+ /**
9
+ * fetches records by their hash values and returns a map of the results
10
+ * @param {SearchByHashObject} searchObject
11
+ */
12
+ async function lmdbGetDataByHash(searchObject) {
13
+ let environment = await hashSearchInit(searchObject);
14
+ let transaction = environment.useReadTransaction();
15
+ transaction.database = environment;
16
+
17
+ const tableInfo = global.hdb_schema[searchObject.schema][searchObject.table];
18
+ try {
19
+ return searchUtility.batchSearchByHashToMap(
20
+ transaction,
21
+ tableInfo.hash_attribute,
22
+ searchObject.get_attributes,
23
+ searchObject.hash_values
24
+ );
25
+ } finally {
26
+ transaction.done();
27
+ }
28
+ }
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ const searchValidator = require('../../../../validation/searchValidator.js');
4
+ const commonUtils = require('../../../../utility/common_utils.js');
5
+ const hdbTerms = require('../../../../utility/hdbTerms.ts');
6
+ const lmdbSearch = require('../lmdbUtility/lmdbSearch.js');
7
+
8
+ module.exports = lmdbGetDataByValue;
9
+
10
+ /**
11
+ * gets records by value returns a map of objects
12
+ * @param {SearchObject} searchObject
13
+ * @param {hdbTerms.VALUE_SEARCH_COMPARATORS} [comparator]
14
+ * @returns {{String|Number, Object}}
15
+ */
16
+ function lmdbGetDataByValue(searchObject, comparator) {
17
+ let comparatorSearch = !commonUtils.isEmpty(comparator);
18
+ if (comparatorSearch && hdbTerms.VALUE_SEARCH_COMPARATORS_REVERSE_LOOKUP[comparator] === undefined) {
19
+ throw new Error(`Value search comparator - ${comparator} - is not valid`);
20
+ }
21
+
22
+ let validationError = searchValidator(searchObject, 'value');
23
+ if (validationError) {
24
+ throw validationError;
25
+ }
26
+
27
+ let returnMap = true;
28
+ return lmdbSearch.prepSearch(searchObject, comparator, returnMap);
29
+ }