Pārlūkot izejas kodu

Работа над DbCreator и WebWorker

Book Pauk 2 gadi atpakaļ
vecāks
revīzija
f76a8f14ec
2 mainītis faili ar 100 papildinājumiem un 5 dzēšanām
  1. 15 0
      server/core/DbCreator.js
  2. 85 5
      server/core/WebWorker.js

+ 15 - 0
server/core/DbCreator.js

@@ -0,0 +1,15 @@
+const InpxParser = 
+
+class DbCreator {
+    constructor(config) {
+        this.config = config;
+    }
+
+    async run(db, callback) {
+        const config = this.config;
+
+        
+    }
+}
+
+module.exports = DbCreator;

+ 85 - 5
server/core/WebWorker.js

@@ -1,8 +1,22 @@
+const fs = require('fs-extra');
+
 const WorkerState = require('./WorkerState');
+const { JembaDbThread } = require('jembadb');
+const DbCreator = require('./DbCreator');
+
+const ayncExit = new (require('./AsyncExit'))();
+const log = new (require('./AppLogger'))().log;//singleton
 
-//server states:
+//server states
 const ssNormal = 'normal';
 const ssDbLoading = 'db_loading';
+const ssDbCreating = 'db_creating';
+
+const stateToText = {
+    [ssNormal]: '',
+    [ssDbLoading]: 'Загрузка поисковой базы',
+    [ssDbCreating]: 'Создание поисковой базы',
+};
 
 //singleton
 let instance = null;
@@ -15,6 +29,9 @@ class WebWorker {
             
             this.wState = this.workerState.getControl('server_state');
             this.myState = '';
+            this.db = null;
+
+            ayncExit.add(this.closeDb.bind(this));
 
             this.loadOrCreateDb();//no await
 
@@ -29,18 +46,81 @@ class WebWorker {
             throw new Error('server_busy');
     }
 
-    setMyState(newState) {
+    setMyState(newState, workerState = {}) {
         this.myState = newState;
-        this.wState.set({state: newState});
+        this.wState.set(Object.assign({}, workerState, {
+            state: newState,
+            serverMessage: stateToText[newState]
+        }));
+    }
+
+    async closeDb() {
+        if (this.db) {
+            await this.db.unlock();
+            this.db = null;
+        }
+    }
+
+    async createDb(dbPath) {
+        this.setMyState(ssDbCreating);
+
+        const config = this.config;
+
+        if (await fs.pathExists(dbPath))
+            throw new Error(`createDb.pathExists: ${dbPath}`);
+
+        const db = new JembaDbThread();
+        await db.lock({
+            dbPath,
+            create: true,
+            softLock: true,
+
+            tableDefaults: {
+                cacheSize: 5,
+            },
+        });
+
+        try {
+            const dbCreator = new DbCreator(config);        
+            await dbCreator.run(db, (state) => this.setMyState(ssDbCreating, state));
+        } finally {
+            await db.unlock();
+        }
     }
 
     async loadOrCreateDb() {
         this.setMyState(ssDbLoading);
 
         try {
-            //
+            const config = this.config;
+            const dbPath = `${config.dataDir}/db`;
+
+            //пересоздаем БД из INPX если нужно
+            if (config.recreateDb)
+                await fs.remove(dbPath);
+
+            if (!await fs.pathExists(dbPath)) {
+                await this.createDb(dbPath);
+            }
+
+            //загружаем БД
+            this.setMyState(ssDbLoading);
+
+            this.db = new JembaDbThread();
+            await this.db.lock({
+                dbPath,
+                softLock: true,
+
+                tableDefaults: {
+                    cacheSize: 5,
+                },
+            });
+
+            //открываем все таблицы
+            await this.db.openAll();
         } catch (e) {
-            //
+            log(LM_FATAL, e.message);            
+            ayncExit.exit(1);
         } finally {
             this.setMyState(ssNormal);
         }