From f76a8f14ec0ff6833c8592ad95e03d819aa0728f Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Wed, 17 Aug 2022 02:40:57 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20DbCreator=20=D0=B8=20WebWorker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/DbCreator.js | 15 +++++++ server/core/WebWorker.js | 92 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 101 insertions(+), 6 deletions(-) diff --git a/server/core/DbCreator.js b/server/core/DbCreator.js index e69de29..b31aa4c 100644 --- a/server/core/DbCreator.js +++ b/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; \ No newline at end of file diff --git a/server/core/WebWorker.js b/server/core/WebWorker.js index fd5b98c..fb09d5a 100644 --- a/server/core/WebWorker.js +++ b/server/core/WebWorker.js @@ -1,8 +1,22 @@ -const WorkerState = require('./WorkerState'); +const fs = require('fs-extra'); -//server states: +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 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); }