1 // Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
3 import { MikroORM
as MariaDbORM
, type Options
as MariaDbOptions
} from
'@mikro-orm/mariadb'
4 import { MikroORM
as SqliteORM
, type Options
as SqliteOptions
} from
'@mikro-orm/sqlite'
6 import { type PerformanceRecord
, type Statistics
, StorageType
} from
'../../types/index.js'
7 import { Constants
} from
'../../utils/index.js'
8 import { Storage
} from
'./Storage.js'
10 export class MikroOrmStorage
extends Storage
{
11 private readonly storageType
: StorageType
12 private orm
?: SqliteORM
| MariaDbORM
14 constructor (storageUri
: string, logPrefix
: string, storageType
: StorageType
) {
15 super(storageUri
, logPrefix
)
16 this.storageType
= storageType
17 this.dbName
= this.getDBName()
20 public async storePerformanceStatistics (performanceStatistics
: Statistics
): Promise
<void> {
22 this.setPerformanceStatistics(performanceStatistics
)
23 await this.orm
?.em
.upsert({
24 ...performanceStatistics
,
25 statisticsData
: Array.from(performanceStatistics
.statisticsData
, ([name
, value
]) => ({
29 } satisfies PerformanceRecord
)
31 this.handleDBError(this.storageType
, error
as Error, Constants
.PERFORMANCE_RECORDS_TABLE
)
35 public async open (): Promise
<void> {
37 if (this.orm
== null) {
38 switch (this.storageType
) {
39 case StorageType
.SQLITE
:
40 this.orm
= await SqliteORM
.init(this.getOptions() as SqliteOptions
)
42 case StorageType
.MARIA_DB
:
43 case StorageType
.MYSQL
:
44 this.orm
= await MariaDbORM
.init(this.getOptions() as MariaDbOptions
)
49 this.handleDBError(this.storageType
, error
as Error)
53 public async close (): Promise
<void> {
54 this.clearPerformanceStatistics()
56 if (this.orm
!= null) {
57 await this.orm
.close()
61 this.handleDBError(this.storageType
, error
as Error)
65 private getDBName (): string {
66 if (this.storageType
=== StorageType
.SQLITE
) {
67 return `${Constants.DEFAULT_PERFORMANCE_DIRECTORY}/${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`
69 return this.storageUri
.pathname
.replace(/(?:^\
/)|(?:\
/$
)/g
, '')
72 private getOptions (): SqliteOptions
| MariaDbOptions
{
75 entities
: ['./dist/types/orm/entities/*.js'],
76 entitiesTs
: ['./src/types/orm/entities/*.ts'],
77 clientUrl
: this.getClientUrl()
81 private getClientUrl (): string | undefined {
82 switch (this.storageType
) {
83 case StorageType
.SQLITE
:
84 case StorageType
.MARIA_DB
:
85 case StorageType
.MYSQL
:
86 return this.storageUri
.toString()