X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fperformance%2Fstorage%2FMikroOrmStorage.ts;h=9746c6bd5f5a09b439129338fc1dde2a1a82a013;hb=789007bd09242370a9d3502da967deb414886504;hp=82bdd23419fde02c82419952c17b2597a5c7c75f;hpb=95b343745d755d2209f028f676c9d25527e7eb4b;p=e-mobility-charging-stations-simulator.git diff --git a/src/performance/storage/MikroOrmStorage.ts b/src/performance/storage/MikroOrmStorage.ts index 82bdd234..9746c6bd 100644 --- a/src/performance/storage/MikroOrmStorage.ts +++ b/src/performance/storage/MikroOrmStorage.ts @@ -1,78 +1,87 @@ -// Copyright Jerome Benoit. 2021. All Rights Reserved. +// Copyright Jerome Benoit. 2021-2024. All Rights Reserved. -import { Configuration, Connection, IDatabaseDriver, MikroORM, Options } from '@mikro-orm/core'; -import { MikroORMDBType, StorageType } from '../../types/Storage'; +import { MikroORM as MariaDbORM, type Options as MariaDbOptions } from '@mikro-orm/mariadb' +import { MikroORM as SqliteORM, type Options as SqliteOptions } from '@mikro-orm/sqlite' -import Constants from '../../utils/Constants'; -import { PerformanceData } from '../../types/orm/entities/PerformanceData'; -import { PerformanceRecord } from '../../types/orm/entities/PerformanceRecord'; -import Statistics from '../../types/Statistics'; -import { Storage } from './Storage'; -import { TsMorphMetadataProvider } from '@mikro-orm/reflection'; +import { Storage } from './Storage.js' +import { type PerformanceRecord, type Statistics, StorageType } from '../../types/index.js' +import { Constants } from '../../utils/index.js' export class MikroOrmStorage extends Storage { - private storageType: StorageType; - private orm: MikroORM | null; + private readonly storageType: StorageType + private orm?: SqliteORM | MariaDbORM - constructor(storageUri: string, logPrefix: string, storageType: StorageType) { - super(storageUri, logPrefix); - this.storageType = storageType; - this.dbName = this.getDBName(); + constructor (storageUri: string, logPrefix: string, storageType: StorageType) { + super(storageUri, logPrefix) + this.storageType = storageType + this.dbName = this.getDBName() } - public async storePerformanceStatistics(performanceStatistics: Statistics): Promise { + public async storePerformanceStatistics (performanceStatistics: Statistics): Promise { try { - const performanceRecord = new PerformanceRecord(); - await this.orm.em.persistAndFlush(performanceRecord); + await this.orm?.em.persistAndFlush({ + ...performanceStatistics, + statisticsData: Array.from(performanceStatistics.statisticsData, ([name, value]) => ({ + name, + ...value + })) + } satisfies PerformanceRecord) } catch (error) { - this.handleDBError(this.storageType, error as Error, Constants.PERFORMANCE_RECORDS_TABLE); + this.handleDBError(this.storageType, error as Error, Constants.PERFORMANCE_RECORDS_TABLE) } } - public async open(): Promise { + public async open (): Promise { try { - if (!this?.orm) { - this.orm = await MikroORM.init(this.getOptions(), true); + if (this.orm == null) { + switch (this.storageType) { + case StorageType.SQLITE: + this.orm = await SqliteORM.init(this.getOptions() as SqliteOptions) + break + case StorageType.MARIA_DB: + case StorageType.MYSQL: + this.orm = await MariaDbORM.init(this.getOptions() as MariaDbOptions) + break + } } } catch (error) { - this.handleDBError(this.storageType, error as Error); + this.handleDBError(this.storageType, error as Error) } } - public async close(): Promise { + public async close (): Promise { try { - if (this?.orm) { - await this.orm.close(); - this.orm = null; + if (this.orm != null) { + await this.orm.close() + delete this.orm } } catch (error) { - this.handleDBError(this.storageType, error as Error); + this.handleDBError(this.storageType, error as Error) } } - private getDBName(): string { + private getDBName (): string { if (this.storageType === StorageType.SQLITE) { - return `${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`; + return `${Constants.DEFAULT_PERFORMANCE_DIRECTORY}/${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db` } - return this.storageUri.pathname.replace(/(?:^\/)|(?:\/$)/g, '') ?? Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME; + return this.storageUri.pathname.replace(/(?:^\/)|(?:\/$)/g, '') } - private getOptions(): Configuration> | Options> { + private getOptions (): SqliteOptions | MariaDbOptions { return { - metadataProvider: TsMorphMetadataProvider, - entities: [PerformanceRecord, PerformanceData], - type: this.storageType as MikroORMDBType, + dbName: this.dbName, + entities: ['./dist/types/orm/entities/*.js'], + entitiesTs: ['./src/types/orm/entities/*.ts'], clientUrl: this.getClientUrl() - }; + } } - private getClientUrl(): string { + private getClientUrl (): string | undefined { switch (this.storageType) { case StorageType.SQLITE: case StorageType.MARIA_DB: case StorageType.MYSQL: - return this.storageUri.toString(); + return this.storageUri.toString() } } } -