From 6debe248806064816c42482d474176770fe85c45 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Fri, 3 Dec 2021 14:30:57 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=20=D0=B1?= =?UTF-8?q?=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/Reader/ReaderStorage.js | 126 ---------------------------- 1 file changed, 126 deletions(-) delete mode 100644 server/core/Reader/ReaderStorage.js diff --git a/server/core/Reader/ReaderStorage.js b/server/core/Reader/ReaderStorage.js deleted file mode 100644 index d3828102..00000000 --- a/server/core/Reader/ReaderStorage.js +++ /dev/null @@ -1,126 +0,0 @@ -const SQL = require('sql-template-strings'); -const _ = require('lodash'); - -const ConnManager = require('../../db/ConnManager');//singleton - -let instance = null; - -//singleton -class ReaderStorage { - constructor() { - if (!instance) { - this.connManager = new ConnManager(); - this.storagePool = this.connManager.pool.readerStorage; - this.periodicCleanCache(3*3600*1000);//1 раз в 3 часа - - instance = this; - } - - return instance; - } - - async doAction(act) { - if (!_.isObject(act.items)) - throw new Error('items is not an object'); - - let result = {}; - switch (act.action) { - case 'check': - result = await this.checkItems(act.items); - break; - case 'get': - result = await this.getItems(act.items); - break; - case 'set': - result = await this.setItems(act.items, act.force); - break; - default: - throw new Error('Unknown action'); - } - - return result; - } - - async checkItems(items) { - let result = {state: 'success', items: {}}; - - const dbh = await this.storagePool.get(); - try { - for (const id of Object.keys(items)) { - if (this.cache[id]) { - result.items[id] = this.cache[id]; - } else { - const rows = await dbh.all(SQL`SELECT rev FROM storage WHERE id = ${id}`); - const rev = (rows.length && rows[0].rev ? rows[0].rev : 0); - result.items[id] = {rev}; - this.cache[id] = result.items[id]; - } - } - } finally { - dbh.ret(); - } - - return result; - } - - async getItems(items) { - let result = {state: 'success', items: {}}; - - const dbh = await this.storagePool.get(); - try { - for (const id of Object.keys(items)) { - const rows = await dbh.all(SQL`SELECT rev, data FROM storage WHERE id = ${id}`); - const rev = (rows.length && rows[0].rev ? rows[0].rev : 0); - const data = (rows.length && rows[0].data ? rows[0].data : ''); - result.items[id] = {rev, data}; - } - } finally { - dbh.ret(); - } - - return result; - } - - async setItems(items, force) { - let check = await this.checkItems(items); - - //сначала проверим совпадение ревизий - for (const id of Object.keys(items)) { - if (!_.isString(items[id].data)) - throw new Error('items.data is not a string'); - - if (!force && check.items[id].rev + 1 !== items[id].rev) - return {state: 'reject', items: check.items}; - } - - const dbh = await this.storagePool.get(); - await dbh.run('BEGIN'); - try { - const newRev = {}; - for (const id of Object.keys(items)) { - await dbh.run(SQL`INSERT OR REPLACE INTO storage (id, rev, time, data) VALUES (${id}, ${items[id].rev}, strftime('%s','now'), ${items[id].data})`); - newRev[id] = {rev: items[id].rev}; - } - await dbh.run('COMMIT'); - - Object.assign(this.cache, newRev); - } catch (e) { - await dbh.run('ROLLBACK'); - throw e; - } finally { - dbh.ret(); - } - - return {state: 'success'}; - } - - periodicCleanCache(timeout) { - this.cache = {}; - - setTimeout(() => { - this.periodicCleanCache(timeout); - }, timeout); - } -} - -module.exports = ReaderStorage; \ No newline at end of file