build(deps-dev): apply updates
[e-mobility-charging-stations-simulator.git] / src / performance / storage / Storage.ts
1 // Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
2
3 import { URL } from 'node:url'
4
5 import {
6 DBName,
7 type EmptyObject,
8 type HandleErrorParams,
9 type Statistics,
10 StorageType
11 } from '../../types/index.js'
12 import { logger, setDefaultErrorParams } from '../../utils/index.js'
13
14 export abstract class Storage {
15 protected readonly storageUri: URL
16 protected readonly logPrefix: string
17 protected dbName!: string
18 private static readonly performanceStatistics = new Map<string, Statistics>()
19
20 constructor (storageUri: string, logPrefix: string) {
21 this.storageUri = new URL(storageUri)
22 this.logPrefix = logPrefix
23 }
24
25 protected handleDBError (
26 type: StorageType,
27 error: Error,
28 table?: string,
29 params: HandleErrorParams<EmptyObject> = {
30 throwError: false,
31 consoleOut: false
32 }
33 ): void {
34 setDefaultErrorParams(params, { throwError: false, consoleOut: false })
35 const inTableOrCollectionStr = table != null && ` in table or collection '${table}'`
36 logger.error(
37 `${this.logPrefix} ${this.getDBNameFromStorageType(type)} error '${
38 error.message
39 }'${inTableOrCollectionStr}:`,
40 error
41 )
42 if (params.throwError === true) {
43 throw error
44 }
45 }
46
47 protected getDBNameFromStorageType (type: StorageType): DBName | undefined {
48 switch (type) {
49 case StorageType.SQLITE:
50 return DBName.SQLITE
51 case StorageType.MARIA_DB:
52 return DBName.MARIA_DB
53 case StorageType.MYSQL:
54 return DBName.MYSQL
55 case StorageType.MONGO_DB:
56 return DBName.MONGO_DB
57 }
58 }
59
60 public getPerformanceStatistics (): IterableIterator<Statistics> {
61 return Storage.performanceStatistics.values()
62 }
63
64 protected setPerformanceStatistics (performanceStatistics: Statistics): void {
65 Storage.performanceStatistics.set(performanceStatistics.id, performanceStatistics)
66 }
67
68 protected clearPerformanceStatistics (): void {
69 Storage.performanceStatistics.clear()
70 }
71
72 public abstract open (): void | Promise<void>
73 public abstract close (): void | Promise<void>
74 public abstract storePerformanceStatistics (
75 performanceStatistics: Statistics
76 ): void | Promise<void>
77 }