From ddec55932c721c0604025cd76b155da18b8a35a5 Mon Sep 17 00:00:00 2001
From: cgeek <cem.moreau@gmail.com>
Date: Sat, 21 Apr 2018 16:38:25 +0200
Subject: [PATCH] Begin Loki storage

---
 app/lib/dal/fileDAL.ts                      | 21 +++++++++++++++++++--
 app/lib/dal/indexDAL/abstract/GenericDAO.ts |  5 +++++
 app/lib/dal/indexDAL/loki/LokiIndex.ts      | 15 ++++++++++++---
 app/lib/system/directory.ts                 |  1 +
 server.ts                                   |  6 +++---
 5 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts
index 0db816687..ed49de19c 100644
--- a/app/lib/dal/fileDAL.ts
+++ b/app/lib/dal/fileDAL.ts
@@ -37,7 +37,7 @@ import {MetaDAL} from "./sqliteDAL/MetaDAL"
 import {DataErrors} from "../common-libs/errors"
 import {BasicRevocableIdentity, IdentityDTO} from "../dto/IdentityDTO"
 import {BlockDAL} from "./sqliteDAL/BlockDAL"
-import {FileSystem} from "../system/directory"
+import {Directory, FileSystem} from "../system/directory"
 import {WoTBInstance} from "../wot"
 import {IIndexDAO} from "./indexDAL/abstract/IIndexDAO"
 import {LokiIIndex} from "./indexDAL/loki/LokiIIndex"
@@ -102,7 +102,24 @@ export class FileDAL {
     this.sqliteDriver = params.dbf()
     this.wotb = params.wotb
     this.profile = 'DAL'
-    this.loki = new loki('index.db')
+    const that = this
+    this.loki = new loki(path.join(this.rootPath, Directory.INDEX_DB_FILE), {
+      autoload: true,
+      autoloadCallback : () => {
+        const dals = [
+          that.bindexDAL,
+          that.mindexDAL,
+          that.iindexDAL,
+          that.sindexDAL,
+          that.cindexDAL,
+        ]
+        for (const indexDAL of dals) {
+          indexDAL.triggerInit()
+        }
+      },
+      autosave: true,
+      autosaveInterval: 4000
+    })
 
     // DALs
     this.powDAL = new PowDAL(this.rootPath, params.fs)
diff --git a/app/lib/dal/indexDAL/abstract/GenericDAO.ts b/app/lib/dal/indexDAL/abstract/GenericDAO.ts
index d224e207e..64382b3f0 100644
--- a/app/lib/dal/indexDAL/abstract/GenericDAO.ts
+++ b/app/lib/dal/indexDAL/abstract/GenericDAO.ts
@@ -2,6 +2,11 @@ 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.
    * @param criterion Criterion object, LokiJS's find object format.
diff --git a/app/lib/dal/indexDAL/loki/LokiIndex.ts b/app/lib/dal/indexDAL/loki/LokiIndex.ts
index 86d4de77d..d80f630d5 100644
--- a/app/lib/dal/indexDAL/loki/LokiIndex.ts
+++ b/app/lib/dal/indexDAL/loki/LokiIndex.ts
@@ -17,16 +17,25 @@ export interface IndexData {
 export abstract class LokiIndex<T extends IndexData> implements GenericDAO<T> {
 
   protected collection:LokiCollection<T>
+  protected collectionIsInitialized: Promise<void>
+  private resolveCollection: () => void
 
   public constructor(
     protected loki:any,
     protected collectionName:'iindex'|'mindex'|'cindex'|'sindex'|'bindex',
-    indices: (keyof T)[]) {
-    const coll = loki.addCollection(collectionName, { indices })
-    this.collection = new LokiProxyCollection(coll, collectionName)
+    protected indices: (keyof T)[]) {
+    this.collectionIsInitialized = new Promise<void>(res => this.resolveCollection = res)
+  }
+
+  public triggerInit() {
+    const coll = this.loki.addCollection(this.collectionName, { indices: this.indices })
+    this.collection = new LokiProxyCollection(coll, this.collectionName)
+    this.resolveCollection()
   }
 
   async init(): Promise<void> {
+    await this.collectionIsInitialized
+    logger.info('Collection %s ready', this.collectionName)
   }
 
   cleanCache(): void {
diff --git a/app/lib/system/directory.ts b/app/lib/system/directory.ts
index 8e1dc9af3..01bac4ded 100644
--- a/app/lib/system/directory.ts
+++ b/app/lib/system/directory.ts
@@ -88,6 +88,7 @@ export const Directory = {
   INSTANCE_NAME: getDomain(opts.mdb),
   INSTANCE_HOME: getHomePath(opts.mdb, opts.home),
   INSTANCE_HOMELOG_FILE: getLogsPath(opts.mdb, opts.home),
+  INDEX_DB_FILE: 'index.db',
   DUNITER_DB_NAME: 'duniter',
   WOTB_FILE: 'wotb.bin',
 
diff --git a/server.ts b/server.ts
index c37248f88..23856c0bd 100644
--- a/server.ts
+++ b/server.ts
@@ -375,14 +375,14 @@ export class Server extends stream.Duplex implements HookableServer {
   async resetAll(done:any = null) {
     await this.resetDataHook()
     await this.resetConfigHook()
-    const files = ['stats', 'cores', 'current', Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE, 'export.zip', 'import.zip', 'conf'];
+    const files = ['stats', 'cores', 'current', Directory.INDEX_DB_FILE, Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE, 'export.zip', 'import.zip', 'conf'];
     const dirs  = ['blocks', 'blockchain', 'ud_history', 'branches', 'certs', 'txs', 'cores', 'sources', 'links', 'ms', 'identities', 'peers', 'indicators', 'leveldb'];
     return this.resetFiles(files, dirs, done);
   }
 
   async resetData(done:any = null) {
     await this.resetDataHook()
-    const files = ['stats', 'cores', 'current', Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE];
+    const files = ['stats', 'cores', 'current', Directory.INDEX_DB_FILE, Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE];
     const dirs  = ['blocks', 'ud_history', 'branches', 'certs', 'txs', 'cores', 'sources', 'links', 'ms', 'identities', 'peers', 'indicators', 'leveldb'];
     await this.resetFiles(files, dirs, done);
   }
@@ -436,7 +436,7 @@ export class Server extends stream.Duplex implements HookableServer {
   async cleanDBData() {
     await this.dal.cleanCaches();
     this.dal.wotb.resetWoT();
-    const files = ['stats', 'cores', 'current', Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log'];
+    const files = ['stats', 'cores', 'current', Directory.INDEX_DB_FILE, Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log'];
     const dirs  = ['blocks', 'ud_history', 'branches', 'certs', 'txs', 'cores', 'sources', 'links', 'ms', 'identities', 'peers', 'indicators', 'leveldb'];
     return this.resetFiles(files, dirs);
   }
-- 
GitLab