From b9296d627c02899c502ec3c0f0dfc77c970ab851 Mon Sep 17 00:00:00 2001
From: Benoit Lavenier <benoit.lavenier@e-is.pro>
Date: Mon, 5 Jun 2023 11:17:46 +0200
Subject: [PATCH] fix(dal) Remove unused triggerInit(), and small code
 refactoring

---
 app/lib/dal/drivers/SQLiteDriver.ts           |  4 +-
 app/lib/dal/fileDAL.ts                        | 45 ++++++++++---------
 app/lib/dal/indexDAL/abstract/GenericDAO.ts   |  4 --
 app/lib/dal/indexDAL/abstract/PeerDAO.ts      |  4 --
 app/lib/dal/indexDAL/abstract/TxsDAO.ts       |  5 +++
 app/lib/dal/indexDAL/abstract/WalletDAO.ts    |  4 --
 .../dal/indexDAL/leveldb/LevelDBDividend.ts   |  3 --
 app/lib/dal/indexDAL/leveldb/LevelDBTable.ts  |  1 -
 app/lib/dal/indexDAL/sqlite/SqliteDividend.ts |  2 -
 app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts   |  2 -
 app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts   |  2 -
 app/lib/dal/indexDAL/sqlite/SqlitePeers.ts    |  2 -
 app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts   |  2 -
 app/lib/dal/indexDAL/sqlite/SqliteTable.ts    | 14 ++++--
 .../dal/indexDAL/sqlite/SqliteTransactions.ts |  2 -
 app/lib/dal/indexDAL/sqlite/SqliteWallet.ts   |  2 -
 app/modules/crawler/lib/sync.ts               |  6 +++
 .../crawler/lib/sync/v2/GlobalIndexStream.ts  |  6 ---
 app/modules/prover/lib/proof.ts               |  2 +-
 app/modules/upnp-provider.ts                  |  2 +-
 server.ts                                     | 12 +++--
 test/dal/basic-dal-tests.ts                   |  4 ++
 22 files changed, 62 insertions(+), 68 deletions(-)

diff --git a/app/lib/dal/drivers/SQLiteDriver.ts b/app/lib/dal/drivers/SQLiteDriver.ts
index 404371634..15a437ef5 100644
--- a/app/lib/dal/drivers/SQLiteDriver.ts
+++ b/app/lib/dal/drivers/SQLiteDriver.ts
@@ -103,8 +103,8 @@ export class SQLiteDriver {
     this.logger.debug('Database "%s" removed', this.path);
   }
 
-  get closed() {
-    return this.dbPromise;
+  isClosed() {
+    return !this.dbPromise;
   }
 
   async closeConnection(): Promise<void> {
diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts
index 2d7915db8..b680bf9f4 100644
--- a/app/lib/dal/fileDAL.ts
+++ b/app/lib/dal/fileDAL.ts
@@ -129,8 +129,7 @@ export class FileDAL implements ServerDAO {
   sindexDAL: SIndexDAO;
   cindexDAL: CIndexDAO;
   dividendDAL: DividendDAO;
-  newDals: { [k: string]: Initiable };
-  private dals: (PeerDAO | WalletDAO | GenericDAO<any>)[];
+  dals: { [k: string]: Initiable };
 
   loadConfHook: (conf: ConfDTO) => Promise<void>;
   saveConfHook: (conf: ConfDTO) => Promise<ConfDTO>;
@@ -174,7 +173,7 @@ export class FileDAL implements ServerDAO {
     this.cindexDAL = new LevelDBCindex(getLevelDB);
     this.dividendDAL = new LevelDBDividend(getLevelDB);
 
-    this.newDals = {
+    this.dals = {
       powDAL: this.powDAL,
       metaDAL: this.metaDAL,
       blockDAL: this.blockDAL,
@@ -196,24 +195,9 @@ export class FileDAL implements ServerDAO {
 
   async init(conf: ConfDTO) {
     this.wotb = this.params.wotbf();
-    this.dals = [
-      this.blockDAL,
-      this.txsDAL,
-      this.peerDAL,
-      this.walletDAL,
-      this.bindexDAL,
-      this.mindexDAL,
-      this.iindexDAL,
-      this.sindexDAL,
-      this.cindexDAL,
-      this.dividendDAL,
-    ];
-    for (const indexDAL of this.dals) {
-      indexDAL.triggerInit();
-    }
-    const dalNames = Underscore.keys(this.newDals);
+    const dalNames = Underscore.keys(this.dals);
     for (const dalName of dalNames) {
-      const dal = this.newDals[dalName];
+      const dal = this.dals[dalName];
       await dal.init();
     }
     logger.debug("Upgrade database...");
@@ -229,6 +213,23 @@ export class FileDAL implements ServerDAO {
     }
   }
 
+  generateUpgradeSql() {
+    // Make sure to always renable constraints (a.g. if the last sync failed, it can be still disabled)
+    return "PRAGMA ignore_check_constraints = true;";
+  }
+
+  async disableCheckConstraints() {
+    logger.info("Disabling database check constraints...");
+    await this.metaDAL.exec("PRAGMA ignore_check_constraints = true;");
+    await this.txsDAL.disableCheckConstraints();
+  }
+
+  async enableCheckConstraints() {
+    logger.info("Enabling database check constraints...");
+    await this.metaDAL.exec("PRAGMA ignore_check_constraints = false;");
+    await this.txsDAL.enableCheckConstraints();
+  }
+
   getDBVersion() {
     return this.metaDAL.getVersion();
   }
@@ -1583,14 +1584,14 @@ export class FileDAL implements ServerDAO {
   }
 
   async cleanCaches() {
-    await Underscore.values(this.newDals).map(
+    await Underscore.values(this.dals).map(
       (dal: Initiable) => dal.cleanCache && dal.cleanCache()
     );
   }
 
   async close() {
     await Promise.all(
-      Underscore.values(this.newDals).map(async (dal: Initiable) => {
+      Underscore.values(this.dals).map(async (dal: Initiable) => {
         dal.cleanCache();
         await dal.close();
       })
diff --git a/app/lib/dal/indexDAL/abstract/GenericDAO.ts b/app/lib/dal/indexDAL/abstract/GenericDAO.ts
index b7df7ad28..e9057917c 100644
--- a/app/lib/dal/indexDAL/abstract/GenericDAO.ts
+++ b/app/lib/dal/indexDAL/abstract/GenericDAO.ts
@@ -1,10 +1,6 @@
 import { Initiable } from "../../sqliteDAL/Initiable";
 
 export interface GenericDAO<T> extends Initiable {
-  /**
-   * Trigger the initialization of the DAO. Called when the underlying DB is ready.
-   */
-  triggerInit(): void;
 
   /**
    * Make a generic find with some ordering.
diff --git a/app/lib/dal/indexDAL/abstract/PeerDAO.ts b/app/lib/dal/indexDAL/abstract/PeerDAO.ts
index 0432e2c15..a3f6e3f23 100644
--- a/app/lib/dal/indexDAL/abstract/PeerDAO.ts
+++ b/app/lib/dal/indexDAL/abstract/PeerDAO.ts
@@ -2,10 +2,6 @@ import { DBPeer } from "../../../db/DBPeer";
 import { Initiable } from "../../sqliteDAL/Initiable";
 
 export interface PeerDAO extends Initiable {
-  /**
-   * Trigger the initialization of the DAO. Called when the underlying DB is ready.
-   */
-  triggerInit(): void;
 
   listAll(): Promise<DBPeer[]>;
 
diff --git a/app/lib/dal/indexDAL/abstract/TxsDAO.ts b/app/lib/dal/indexDAL/abstract/TxsDAO.ts
index 93854de3e..fc91a739d 100644
--- a/app/lib/dal/indexDAL/abstract/TxsDAO.ts
+++ b/app/lib/dal/indexDAL/abstract/TxsDAO.ts
@@ -4,6 +4,11 @@ import { SandBox } from "../../sqliteDAL/SandBox";
 import { DBTx } from "../../../db/DBTx";
 
 export interface TxsDAO extends GenericDAO<DBTx> {
+
+  disableCheckConstraints(): Promise<void>;
+
+  enableCheckConstraints(): Promise<void>;
+
   trimExpiredNonWrittenTxs(limitTime: number): Promise<void>;
 
   getAllPending(versionMin: number): Promise<DBTx[]>;
diff --git a/app/lib/dal/indexDAL/abstract/WalletDAO.ts b/app/lib/dal/indexDAL/abstract/WalletDAO.ts
index 3e076f2eb..4b9f7e96b 100644
--- a/app/lib/dal/indexDAL/abstract/WalletDAO.ts
+++ b/app/lib/dal/indexDAL/abstract/WalletDAO.ts
@@ -2,10 +2,6 @@ import { Initiable } from "../../sqliteDAL/Initiable";
 import { DBWallet } from "../../../db/DBWallet";
 
 export interface WalletDAO extends Initiable {
-  /**
-   * Trigger the initialization of the DAO. Called when the underlying DB is ready.
-   */
-  triggerInit(): void;
 
   /**
    * Saves a wallet.
diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts
index 4d1afc8e8..161ddca38 100644
--- a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts
+++ b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts
@@ -32,9 +32,6 @@ export class LevelDBDividend extends LevelDBTable<DividendEntry>
    */
 
   cleanCache(): void {}
-
-  triggerInit(): void {}
-
   async init(): Promise<void> {
     await super.init();
     this.indexForTrimming = new LevelDBTable<string[]>(
diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts
index c6b1f6de2..9b23982b1 100644
--- a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts
+++ b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts
@@ -12,7 +12,6 @@ export class LevelDBTable<T> {
 
   cleanCache(): void {}
 
-  triggerInit(): void {}
 
   async close() {
     await this.db.close();
diff --git a/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts b/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts
index 3152d1174..d64cc48b3 100644
--- a/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts
@@ -35,8 +35,6 @@ export class SqliteDividend extends SqliteTable<DividendEntry>
 
   cleanCache(): void {}
 
-  triggerInit(): void {}
-
   /**
    * INSERT
    */
diff --git a/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts
index d31696ed6..a50fdb041 100644
--- a/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts
@@ -44,8 +44,6 @@ export class SqliteIIndex extends SqliteTable<IindexEntry>
 
   cleanCache(): void {}
 
-  triggerInit(): void {}
-
   /**
    * INSERT
    */
diff --git a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts
index 6fe3b6230..0d8b60d2b 100644
--- a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts
@@ -74,8 +74,6 @@ export class SqliteMIndex extends SqliteTable<MindexEntry>
     `);
   }
 
-  triggerInit(): void {}
-
   /**
    * INSERT
    */
diff --git a/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts b/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts
index 3b67bd9fe..50ce41093 100644
--- a/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts
@@ -95,8 +95,6 @@ export class SqlitePeers extends SqliteTable<DBPeer> implements PeerDAO {
     return peer;
   }
 
-  triggerInit(): void {}
-
   withUPStatus(): Promise<DBPeer[]> {
     return this.findEntities("SELECT * FROM peers WHERE status = ?", ["UP"]);
   }
diff --git a/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts
index c208fa380..fd27cead1 100644
--- a/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts
@@ -46,8 +46,6 @@ export class SqliteSIndex extends SqliteTable<SindexEntry>
 
   cleanCache(): void {}
 
-  triggerInit(): void {}
-
   /**
    * INSERT
    */
diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts
index 756d367c5..d2c39b33b 100644
--- a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts
@@ -4,7 +4,7 @@ import { SqliteNodeIOManager } from "./SqliteNodeIOManager";
 import { SQLiteDriver } from "../../drivers/SQLiteDriver";
 
 export class SqliteTable<T> {
-  private readonly pdriver: Promise<SQLiteDriver>;
+  private readonly _driverPromise: Promise<SQLiteDriver>;
   protected driver: SqliteNodeIOManager<T>;
 
   protected constructor(
@@ -14,11 +14,11 @@ export class SqliteTable<T> {
     },
     getSqliteDB: (dbName: string) => Promise<SQLiteDriver>
   ) {
-    this.pdriver = getSqliteDB(`${name}.db`);
+    this._driverPromise = getSqliteDB(`${name}.db`);
   }
 
   async init(): Promise<void> {
-    this.driver = new SqliteNodeIOManager(await this.pdriver, "sindex");
+    this.driver = new SqliteNodeIOManager(await this._driverPromise, this.name);
     await this.driver.sqlExec(`
     BEGIN;
     ${this.generateCreateTable()};
@@ -32,6 +32,14 @@ export class SqliteTable<T> {
     await this.driver.close();
   }
 
+  async disableCheckConstraints(): Promise<void> {
+    await this.driver.sqlExec("PRAGMA ignore_check_constraints = true;");
+  }
+
+  async enableCheckConstraints(): Promise<void> {
+    await this.driver.sqlExec("PRAGMA ignore_check_constraints = false;");
+  }
+
   generateCreateTable() {
     let sql = `CREATE TABLE IF NOT EXISTS ${this.name} (`;
     const fields = this.keys()
diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts
index c7a90a92f..f739136e5 100644
--- a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts
@@ -368,8 +368,6 @@ export class SqliteTransactions extends SqliteTable<DBTx> implements TxsDAO {
     return this.driver.sqlWrite("DELETE FROM txs WHERE hash = ?", [hash]);
   }
 
-  triggerInit(): void {}
-
   trimExpiredNonWrittenTxs(limitTime: number): Promise<void> {
     return this.driver.sqlWrite(
       "DELETE FROM txs WHERE NOT written AND blockstampTime <= ?",
diff --git a/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts b/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts
index 3b70811fe..a9f8fb031 100644
--- a/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts
+++ b/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts
@@ -23,8 +23,6 @@ export class SqliteWallet extends SqliteTable<DBWallet> implements WalletDAO {
 
   cleanCache(): void {}
 
-  triggerInit(): void {}
-
   /**
    * INSERT
    */
diff --git a/app/modules/crawler/lib/sync.ts b/app/modules/crawler/lib/sync.ts
index 69d073a23..de68f7920 100644
--- a/app/modules/crawler/lib/sync.ts
+++ b/app/modules/crawler/lib/sync.ts
@@ -183,6 +183,9 @@ export class Synchroniser extends stream.Duplex {
       // We use cautious mode if it is asked, or not particulary asked but blockchain has been started
       const cautious = askedCautious === true || localNumber >= 0;
 
+      // Disable constraints
+      if (!cautious) await this.server.dal.disableCheckConstraints();
+
       const milestonesStream = new ValidatorStream(
         localNumber,
         to,
@@ -241,6 +244,9 @@ export class Synchroniser extends stream.Duplex {
         await this.syncStrategy.syncPeers(fullSync, to);
       }
 
+      // Enable constraints
+      if (!cautious) await this.server.dal.enableCheckConstraints();
+
       const syncDuration = Date.now() - syncStartTime;
       this.watcher.end(syncDuration);
       this.push({ sync: true });
diff --git a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts
index 242ecf2b1..120578daa 100644
--- a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts
+++ b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts
@@ -124,12 +124,6 @@ export class GlobalIndexStream extends Duplex {
     })();
   }
 
-  private async injectLoki<T, K extends keyof T>(dal: T, f: K, obj: T[K]) {
-    // this.mapInjection[f] = dal[f]
-    // dal[f] = obj
-    // await (obj as any).triggerInit()
-  }
-
   readChunk(i: number) {}
 
   _read(size: number) {
diff --git a/app/modules/prover/lib/proof.ts b/app/modules/prover/lib/proof.ts
index f24d30571..2ce2942c5 100644
--- a/app/modules/prover/lib/proof.ts
+++ b/app/modules/prover/lib/proof.ts
@@ -53,7 +53,7 @@ export function createPowWorker() {
     process.exit(ExitCodes.OK);
   });
 
-  process.on("message", async (message) => {
+  process.on("message", async (message: any) => {
     switch (message.command) {
       case "newPoW":
         (async () => {
diff --git a/app/modules/upnp-provider.ts b/app/modules/upnp-provider.ts
index 776453de1..7631e3196 100644
--- a/app/modules/upnp-provider.ts
+++ b/app/modules/upnp-provider.ts
@@ -200,7 +200,7 @@ export class UpnpProvider {
     let keys = Underscore.keys(netInterfaces);
     let res = [];
     for (const name of keys) {
-      let addresses = netInterfaces[name];
+      let addresses = netInterfaces[name] || [];
       for (const addr of addresses) {
         if (!family || addr.family == family) {
           res.push({
diff --git a/server.ts b/server.ts
index d5c4b7e5d..97f067ffa 100644
--- a/server.ts
+++ b/server.ts
@@ -167,9 +167,9 @@ export class Server extends stream.Duplex implements HookableServer {
   async getSQLiteDB(dbName: string, home: string) {
     // Check in cach (useful to avoid migration task to create a new driver on the same DB file)
     let driver: SQLiteDriver = this.sqliteDBs[dbName];
-    if (!driver || driver.closed) {
+    if (!driver || driver.isClosed()) {
       driver = await Directory.getHomeDB(this.memoryOnly, dbName, home);
-      this.sqliteDBs[dbName] = driver;
+      if (!this.memoryOnly) this.sqliteDBs[dbName] = driver;
     }
     return driver;
   }
@@ -179,7 +179,7 @@ export class Server extends stream.Duplex implements HookableServer {
     let driver: LevelUp = this.levelDBs[dbName];
     if (!driver || driver.isClosed()) {
       driver = await Directory.getHomeLevelDB(this.memoryOnly, dbName, home);
-      this.levelDBs[dbName] = driver;
+      if (!this.memoryOnly) this.levelDBs[dbName] = driver;
     }
     return driver;
   }
@@ -514,6 +514,12 @@ export class Server extends stream.Duplex implements HookableServer {
     if (this.dal) {
       await this.dal.close()
     }
+    await Promise.all(Object.values(this.sqliteDBs)
+        .filter(db => db && !db.isClosed())
+        .map(db => db.closeConnection()));
+    await Promise.all(Object.values(this.levelDBs)
+        .filter(db => db && !db.isClosed())
+        .map(db => db.close()));
   }
 
   revert() {
diff --git a/test/dal/basic-dal-tests.ts b/test/dal/basic-dal-tests.ts
index ccc4ffd26..6696c74c3 100644
--- a/test/dal/basic-dal-tests.ts
+++ b/test/dal/basic-dal-tests.ts
@@ -113,6 +113,10 @@ describe("DAL", function(){
     return fileDAL.saveConf({ currency: "meta_brouzouf" } as any);
   })
 
+  after(() => {
+    return fileDAL.close();
+  })
+
   it('should have last DB version', async () => {
     let version = await fileDAL.getDBVersion();
     should.exist(version);
-- 
GitLab