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

This commit is contained in:
Book Pauk
2022-08-17 02:40:57 +07:00
parent d00cb200a3
commit f76a8f14ec
2 changed files with 101 additions and 6 deletions

View File

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

View File

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