diff --git a/server/config/base.js b/server/config/base.js index 4789cdc1..668131dd 100644 --- a/server/config/base.js +++ b/server/config/base.js @@ -14,7 +14,6 @@ module.exports = { logDir: `${dataDir}/log`, publicDir: `${execDir}/public`, uploadDir: `${execDir}/public/upload`, - dbFileName: 'db.sqlite', loggingEnabled: true, maxUploadFileSize: 50*1024*1024,//50Мб @@ -23,6 +22,19 @@ module.exports = { useExternalBookConverter: false, + db: [ + { + poolName: 'app', + connCount: 20, + fileName: 'app.sqlite', + }, + { + poolName: 'readerStorage', + connCount: 20, + fileName: 'reader-storage.sqlite', + } + ], + servers: [ { serverName: '1', diff --git a/server/controllers/BaseController.js b/server/controllers/BaseController.js index 70cfecc9..f89c0e13 100644 --- a/server/controllers/BaseController.js +++ b/server/controllers/BaseController.js @@ -1,6 +1,5 @@ class BaseController { - constructor(connPool, config) { - this.connPool = connPool; + constructor(config) { this.config = config; } } diff --git a/server/controllers/ReaderController.js b/server/controllers/ReaderController.js index deea1591..6e58e2fa 100644 --- a/server/controllers/ReaderController.js +++ b/server/controllers/ReaderController.js @@ -5,8 +5,8 @@ const workerState = require('../core/workerState'); //const _ = require('lodash'); class ReaderController extends BaseController { - constructor(connPool, config) { - super(connPool, config); + constructor(config) { + super(config); this.readerWorker = new ReaderWorker(config); } diff --git a/server/core/SqliteConnectionPool.js b/server/core/SqliteConnectionPool.js index 054aee91..162b80bd 100644 --- a/server/core/SqliteConnectionPool.js +++ b/server/core/SqliteConnectionPool.js @@ -4,20 +4,18 @@ const sqlite = require('sqlite'); const waitingDelay = 100; //ms class SqliteConnectionPool { - constructor(connCount, config) { - this.connCount = connCount; - this.config = config; + constructor() { + this.closed = true; } - async init() { - const dbFileName = this.config.dataDir + '/' + this.config.dbFileName; - + async open(connCount, dbFileName) { + if (!Number.isInteger(connCount) || connCount <= 0) + return; this.connections = []; this.taken = new Set(); this.freed = new Set(); - for (let i = 0; i < this.connCount; i++) { - + for (let i = 0; i < connCount; i++) { let client = await sqlite.open(dbFileName); client.configure('busyTimeout', 10000); //ms @@ -29,6 +27,7 @@ class SqliteConnectionPool { this.freed.add(i); this.connections[i] = client; } + this.closed = false; } _setImmediate() { diff --git a/server/core/connManager.js b/server/core/connManager.js new file mode 100644 index 00000000..43eab563 --- /dev/null +++ b/server/core/connManager.js @@ -0,0 +1,26 @@ +const SqliteConnectionPool = require('./SqliteConnectionPool'); + +class ConnManager { + constructor() { + this._pool = {}; + } + + async init(config) { + this.config = config; + for (const poolConfig of this.config.db) { + const dbFileName = this.config.dataDir + '/' + poolConfig.fileName; + const connPool = new SqliteConnectionPool(); + await connPool.open(poolConfig.connCount, dbFileName); + + this._pool[poolConfig.poolName] = connPool; + } + } + + get pool() { + return this._pool; + } +} + +const connManager = new ConnManager(); + +module.exports = connManager; \ No newline at end of file diff --git a/server/index.js b/server/index.js index e2cdd9bf..f62d9179 100644 --- a/server/index.js +++ b/server/index.js @@ -11,7 +11,7 @@ const path = require('path'); const express = require('express'); const compression = require('compression'); -const SqliteConnectionPool = require('./core/SqliteConnectionPool'); +const connManager = require('./core/connManager'); async function init() { await fs.ensureDir(config.dataDir); @@ -35,9 +35,9 @@ async function main() { log('Initializing'); await init(); - log('Opening database'); - const connPool = new SqliteConnectionPool(20, config); - await connPool.init(); + log('Opening databases'); + await connManager.init(config); + log(`Opened databases: ${Object.keys(connManager.pool).join(', ')}`); //servers for (let server of config.servers) { @@ -67,7 +67,7 @@ async function main() { } })); - require('./routes').initRoutes(app, connPool, serverConfig); + require('./routes').initRoutes(app, serverConfig); if (devModule) { devModule.logErrors(app); diff --git a/server/routes.js b/server/routes.js index 0b57da60..8fb0fc67 100644 --- a/server/routes.js +++ b/server/routes.js @@ -2,10 +2,10 @@ const c = require('./controllers'); const utils = require('./core/utils'); const multer = require('multer'); -function initRoutes(app, connPool, config) { - const misc = new c.MiscController(connPool, config); - const reader = new c.ReaderController(connPool, config); - const worker = new c.WorkerController(connPool, config); +function initRoutes(app, config) { + const misc = new c.MiscController(config); + const reader = new c.ReaderController(config); + const worker = new c.WorkerController(config); //access const [aAll, aNormal, aSite, aReader, aOmnireader] = // eslint-disable-line no-unused-vars @@ -60,7 +60,7 @@ function initRoutes(app, connPool, config) { }; } callbacks.push(callback); - + switch (httpMethod) { case 'GET' : app.get(path, ...callbacks);