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); }