From a39626f86769124386e13020ba035781f470ea46 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Fri, 8 Mar 2019 16:50:44 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20connManager=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=83=D0=BB?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BA=20=D0=B1=D0=B0=D0=B7=D0=B0=D0=BC=20?= =?UTF-8?q?Sqlite,=20=D0=BF=D0=BE=D0=BF=D1=83=D1=82=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/config/base.js | 14 +++++++++++++- server/controllers/BaseController.js | 3 +-- server/controllers/ReaderController.js | 4 ++-- server/core/SqliteConnectionPool.js | 15 +++++++-------- server/core/connManager.js | 26 ++++++++++++++++++++++++++ server/index.js | 10 +++++----- server/routes.js | 10 +++++----- 7 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 server/core/connManager.js 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);