build(deps-dev): apply updates
[e-mobility-charging-stations-simulator.git] / src / performance / storage / Storage.ts
1 // Copyright Jerome Benoit. 2021-2023. 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';
12 import { isNullOrUndefined, logger, setDefaultErrorParams } from '../../utils';
13
14 export abstract class Storage {
15 protected readonly storageUri: URL;
16 protected readonly logPrefix: string;
17 protected dbName!: string;
18
19 constructor(storageUri: string, logPrefix: string) {
20 this.storageUri = new URL(storageUri);
21 this.logPrefix = logPrefix;
22 }
23
24 protected handleDBError(
25 type: StorageType,
26 error: Error,
27 table?: string,
28 params: HandleErrorParams<EmptyObject> = { throwError: false, consoleOut: false },
29 ): void {
30 setDefaultErrorParams(params, { throwError: false, consoleOut: false });
31 const inTableOrCollectionStr =
32 (!isNullOrUndefined(table) || !table) && ` in table or collection '${table}'`;
33 logger.error(
34 `${this.logPrefix} ${this.getDBNameFromStorageType(type)} error '${
35 error.message
36 }'${inTableOrCollectionStr}:`,
37 error,
38 );
39 if (params?.throwError) {
40 throw error;
41 }
42 }
43
44 protected getDBNameFromStorageType(type: StorageType): DBName | undefined {
45 switch (type) {
46 case StorageType.MARIA_DB:
47 return DBName.MARIA_DB;
48 case StorageType.MONGO_DB:
49 return DBName.MONGO_DB;
50 case StorageType.MYSQL:
51 return DBName.MYSQL;
52 case StorageType.SQLITE:
53 return DBName.SQLITE;
54 }
55 }
56
57 public abstract open(): void | Promise<void>;
58 public abstract close(): void | Promise<void>;
59 public abstract storePerformanceStatistics(
60 performanceStatistics: Statistics,
61 ): void | Promise<void>;
62 }