Add error handling in one performance storage class
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 12 Sep 2021 12:01:42 +0000 (14:01 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 12 Sep 2021 12:01:42 +0000 (14:01 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/performance/storage/JSONFileStorage.ts
src/performance/storage/MikroORMStorage.ts
src/performance/storage/MongoDBStorage.ts

index cc7920a0a4aadfe40ffb6710dddf0e012f1ea9ed..25ba236703f4b60393b963fa0f349b7c01ea9b9d 100644 (file)
@@ -33,7 +33,9 @@ export class JSONFileStorage extends Storage {
 
   public open(): void {
     try {
-      this.fd = fs.openSync(this.dbName, 'a+');
+      if (!this?.fd) {
+        this.fd = fs.openSync(this.dbName, 'a+');
+      }
     } catch (error) {
       FileUtils.handleFileException(this.logPrefix, Constants.PERFORMANCE_RECORDS_FILETYPE, this.dbName, error);
     }
@@ -41,7 +43,7 @@ export class JSONFileStorage extends Storage {
 
   public close(): void {
     try {
-      if (this.fd) {
+      if (this?.fd) {
         fs.closeSync(this.fd);
         this.fd = null;
       }
index 96740a8f4564204d2180bebb4b228c7313404861..c06617f6253683f17065e90c9b7cba8cfa45eb20 100644 (file)
@@ -12,7 +12,7 @@ import { TsMorphMetadataProvider } from '@mikro-orm/reflection';
 
 export class MikroORMStorage extends Storage {
   private storageType: StorageType;
-  private orm: MikroORM;
+  private orm: MikroORM | null;
 
   constructor(storageURI: string, logPrefix: string, storageType: StorageType) {
     super(storageURI, logPrefix);
@@ -30,11 +30,24 @@ export class MikroORMStorage extends Storage {
   }
 
   public async open(): Promise<void> {
-    this.orm = await MikroORM.init(this.getOptions(), true);
+    try {
+      if (!this?.orm) {
+        this.orm = await MikroORM.init(this.getOptions(), true);
+      }
+    } catch (error) {
+      this.handleDBError(this.storageType, error);
+    }
   }
 
   public async close(): Promise<void> {
-    await this.orm.close();
+    try {
+      if (this?.orm) {
+        await this.orm.close();
+        this.orm = null;
+      }
+    } catch (error) {
+      this.handleDBError(this.storageType, error);
+    }
   }
 
   private getDBName(): string {
index 851df0a1ba8248a582153056ce1bad688fd37d92..5a3783818cba77bcb16bf25e622ae81015f77fe8 100644 (file)
@@ -7,7 +7,7 @@ import { Storage } from './Storage';
 import { StorageType } from '../../types/Storage';
 
 export class MongoDBStorage extends Storage {
-  private client: MongoClient;
+  private client: MongoClient | null;
   private connected: boolean;
 
   constructor(storageURI: string, logPrefix: string) {
@@ -28,7 +28,7 @@ export class MongoDBStorage extends Storage {
 
   public async open(): Promise<void> {
     try {
-      if (!this.connected) {
+      if (!this.connected && this?.client) {
         await this.client.connect();
         this.connected = true;
       }
@@ -39,7 +39,7 @@ export class MongoDBStorage extends Storage {
 
   public async close(): Promise<void> {
     try {
-      if (this.connected) {
+      if (this.connected && this?.client) {
         await this.client.close();
         this.connected = false;
       }
@@ -49,6 +49,9 @@ export class MongoDBStorage extends Storage {
   }
 
   private checkDBConnection() {
+    if (!this?.client) {
+      throw new Error(`${this.logPrefix} ${this.getDBNameFromStorageType(StorageType.MONGO_DB)} client initialization failed while trying to issue a request`);
+    }
     if (!this.connected) {
       throw new Error(`${this.logPrefix} ${this.getDBNameFromStorageType(StorageType.MONGO_DB)} connection not opened while trying to issue a request`);
     }