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