From 73c414010f1509b6667e9512dd4e11c440eee731 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 9 Nov 2018 21:56:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2=20=D1=81=20?= =?UTF-8?q?=D0=B8=D1=85=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/db_connector.js | 29 +++++++- index.js | 93 ++++++++++++------------ modules/parus_db.js | 163 ++++++++++++++++++++++++++++--------------- 3 files changed, 182 insertions(+), 103 deletions(-) diff --git a/core/db_connector.js b/core/db_connector.js index 9f808c8..a7dff4c 100644 --- a/core/db_connector.js +++ b/core/db_connector.js @@ -12,6 +12,15 @@ const glConst = require("@core/constants.js"); //Глобальные конст const { checkModuleInterface, makeModuleFullPath, checkObject } = require("@core/utils.js"); //Вспомогательные функции const { ServerError } = require("@core/server_errors.js"); //Типовая ошибка +//---------- +// Константы +//---------- + +//Состояния записей журнала работы сервиса +const NLOG_STATE_INF = 0; //Информация +const NLOG_STATE_WRN = 1; //Предупреждение +const NLOG_STATE_ERR = 2; //Ошибка + //------------ // Тело модуля //------------ @@ -41,6 +50,7 @@ class DBConnector { "connect", "disconnect", "getServices", + "getServiceFunctions", "log", "getQueueOutgoing", "putQueueIncoming", @@ -93,16 +103,26 @@ class DBConnector { //Получить список сервисов async getServices() { try { - let res = await this.connector.getServices(this.connection); + let srvs = await this.connector.getServices(this.connection); + let srvsFuncs = srvs.map(async srv => { + const response = await this.connector.getServiceFunctions(this.connection, srv.NRN); + let tmp = {}; + _.extend(tmp, srv, { FN: [] }); + response.map(f => { + tmp.FN.push(f); + }); + return tmp; + }); + let res = await Promise.all(srvsFuncs); return res; } catch (e) { throw new ServerError(glConst.ERR_DB_EXECUTE, e.message); } } //Запись в журнал работы - async putLog(msg, queueID) { + async putLog(msgType, msg, queueID) { try { - let res = await this.connector.log(this.connection, msg, queueID); + let res = await this.connector.log(this.connection, msgType, msg, queueID); return res; } catch (e) { throw new ServerError(glConst.ERR_DB_EXECUTE, e.message); @@ -114,4 +134,7 @@ class DBConnector { // Интерфейс модуля //----------------- +exports.NLOG_STATE_INF = NLOG_STATE_INF; +exports.NLOG_STATE_WRN = NLOG_STATE_WRN; +exports.NLOG_STATE_ERR = NLOG_STATE_ERR; exports.DBConnector = DBConnector; diff --git a/index.js b/index.js index 013d9aa..d3e7c9d 100644 --- a/index.js +++ b/index.js @@ -12,56 +12,61 @@ const cfg = require("./config.js"); const { Logger } = require("@core/logger.js"); const db = require("@core/db_connector.js"); const { ServerError } = require("@core/server_errors.js"); -const parus = require("@modules/parus_db.js"); const utls = require("@core/utils.js"); //------------ // Тело модуля //------------ -let a = new db.DBConnector(cfg.dbConnect); -a.connect() - .then(res => { - console.log("CONNECTED"); - a.getServices() - .then(res => { - console.log(res); - a.putLog("Сервер приложений подключен") - .then(res => { - console.log(res); - a.disconnect() - .then(res => { - console.log("DISCONNECTED"); - }) - .catch(e => { - console.log(e.code + ": " + e.message); - }); - }) - .catch(e => { - console.log(e.code + ": " + e.message); - a.disconnect() - .then(res => { - console.log("DISCONNECTED"); - }) - .catch(e => { - console.log(e.code + ": " + e.message); - }); - }); - }) - .catch(e => { - console.log(e.code + ": " + e.message); - a.disconnect() - .then(res => { - console.log("DISCONNECTED"); - }) - .catch(e => { - console.log(e.code + ": " + e.message); - }); - }); - }) - .catch(e => { - console.log(e.code + ": " + e.message); - }); +try { + let a = new db.DBConnector(cfg.dbConnect); + a.connect() + .then(res => { + console.log("CONNECTED"); + a.getServices() + .then(res => { + console.log(res); + a.putLog(db.NLOG_STATE_WRN, "Сервер приложений подключен") + .then(res => { + console.log(res); + a.disconnect() + .then(res => { + console.log("DISCONNECTED"); + }) + .catch(e => { + console.log(e.code + ": " + e.message); + }); + }) + .catch(e => { + console.log(e.code + ": " + e.message); + setTimeout(() => { + a.disconnect() + .then(res => { + console.log("DISCONNECTED"); + }) + .catch(e => { + console.log(e.code + ": " + e.message); + }); + }, 10000); + }); + }) + .catch(e => { + console.log(e.code + ": " + e.message); + a.disconnect() + .then(res => { + console.log("DISCONNECTED"); + }) + .catch(e => { + console.log(e.code + ": " + e.message); + }); + }); + }) + .catch(e => { + console.log(e.code + ": " + e.message); + }); +} catch (e) { + console.log(e.code + ": " + e.message); +} /* diff --git a/modules/parus_db.js b/modules/parus_db.js index 8f07cb8..a5851ba 100644 --- a/modules/parus_db.js +++ b/modules/parus_db.js @@ -9,49 +9,64 @@ const oracledb = require("oracledb"); //Работа с СУБД Oracle +//---------- +// Константы +//---------- + +//Типы сервисов +const NSRV_TYPE_SEND = 0; //Отправка сообщений +const NSRV_TYPE_RECIVE = 1; //Получение сообщений +const SSRV_TYPE_SEND = "SEND"; //Отправка сообщений (строковый код) +const SSRV_TYPE_RECIVE = "RECIVE"; //Получение сообщений (строковый код) + +//Признак оповещения о простое удаленного сервиса +const NUNAVLBL_NTF_SIGN_NO = 0; //Не оповещать о простое +const NUNAVLBL_NTF_SIGN_YES = 1; //Оповещать о простое +const SUNAVLBL_NTF_SIGN_NO = "UNAVLBL_NTF_NO"; //Не оповещать о простое (строковый код) +const SUNAVLBL_NTF_SIGN_YES = "UNAVLBL_NTF_YES"; //Оповещать о простое (строковый код) + +//Состояния записей журнала работы сервиса +const NLOG_STATE_INF = 0; //Информация +const NLOG_STATE_WRN = 1; //Предупреждение +const NLOG_STATE_ERR = 2; //Ошибка +const SLOG_STATE_INF = "INF"; //Информация (строковый код) +const SLOG_STATE_WRN = "WRN"; //Предупреждение (строковые коды) +const SLOG_STATE_ERR = "ERR"; //Ошибка (строковый код) + //------------ // Тело модуля //------------ //Подключение к БД -const connect = prms => { - return new Promise((resolve, reject) => { - oracledb.getConnection( - { - user: prms.user, - password: prms.password, - connectString: prms.connectString - }, - (err, connection) => { - if (err) { - reject(new Error(err.message)); - } else { - resolve(connection); - } - } - ); - }); +const connect = async prms => { + try { + const conn = await oracledb.getConnection({ + user: prms.user, + password: prms.password, + connectString: prms.connectString + }); + return conn; + } catch (e) { + throw new Error(e.message); + } }; //Отключение от БД -const disconnect = connection => { - return new Promise((resolve, reject) => { - if (connection) { - connection.close(err => { - if (err) { - reject(new Error(err.message)); - } else { - resolve(); - } - }); - } else { - reject(new Error("Не указано подключение")); +const disconnect = async connection => { + if (connection) { + try { + const conn = await connection.close(); + return; + } catch (e) { + throw new Error(e.message); } - }); + } else { + throw new Error("Не указано подключение"); + } }; //Получение списка сервисов -const getServices = connection => { +const getServices = async connection => { return new Promise((resolve, reject) => { if (connection) { connection.execute( @@ -61,19 +76,53 @@ const getServices = connection => { (err, result) => { if (err) { reject(new Error(err.message)); + } else { + let cursor = result.outBinds.RCSERVICES; + let queryStream = cursor.toQueryStream(); + let rows = []; + queryStream.on("data", row => { + rows.push(row); + }); + queryStream.on("error", err => { + reject(new Error(err.message)); + }); + queryStream.on("close", () => { + resolve(rows); + }); } - let cursor = result.outBinds.RCSERVICES; - let queryStream = cursor.toQueryStream(); - let rows = []; - queryStream.on("data", row => { - rows.push(row); - }); - queryStream.on("error", err => { + } + ); + } else { + reject(new Error("Не указано подключение")); + } + }); +}; + +//Получение списка функций сервиса +const getServiceFunctions = (connection, serviceID) => { + return new Promise((resolve, reject) => { + if (connection) { + connection.execute( + "BEGIN PKG_EXS.SERVICEFN_GET(NSERVICE => :NSERVICE, RCSERVICEFNS => :RCSERVICEFNS); END;", + { NSERVICE: serviceID, RCSERVICEFNS: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } }, + { outFormat: oracledb.OBJECT }, + (err, result) => { + if (err) { reject(new Error(err.message)); - }); - queryStream.on("close", () => { - resolve(rows); - }); + } else { + let cursor = result.outBinds.RCSERVICEFNS; + let queryStream = cursor.toQueryStream(); + let rows = []; + queryStream.on("data", row => { + rows.push(row); + }); + queryStream.on("error", err => { + reject(new Error(err.message)); + }); + queryStream.on("close", () => { + resolve(rows); + }); + } } ); } else { @@ -83,13 +132,13 @@ const getServices = connection => { }; //Запись в протокол работы -const log = (connection, msg, queueID) => { +const log = (connection, logState, msg, queueID) => { return new Promise((resolve, reject) => { if (connection) { connection.execute( "BEGIN PKG_EXS.LOG_PUT(NLOG_STATE => :NLOG_STATE, SMSG => :SMSG, NEXSQUEUE => :NEXSQUEUE, RCLOG => :RCLOG); END;", { - NLOG_STATE: 0, + NLOG_STATE: logState, SMSG: msg, NEXSQUEUE: queueID, RCLOG: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } @@ -98,19 +147,20 @@ const log = (connection, msg, queueID) => { (err, result) => { if (err) { reject(new Error(err.message)); + } else { + let cursor = result.outBinds.RCLOG; + let queryStream = cursor.toQueryStream(); + let rows = []; + queryStream.on("data", row => { + rows.push(row); + }); + queryStream.on("error", err => { + reject(new Error(err.message)); + }); + queryStream.on("close", () => { + resolve(rows[0]); + }); } - let cursor = result.outBinds.RCLOG; - let queryStream = cursor.toQueryStream(); - let rows = []; - queryStream.on("data", row => { - rows.push(row); - }); - queryStream.on("error", err => { - reject(new Error(err.message)); - }); - queryStream.on("close", () => { - resolve(rows[0]); - }); } ); } else { @@ -135,6 +185,7 @@ const setQueueValue = prms => {}; exports.connect = connect; exports.disconnect = disconnect; exports.getServices = getServices; +exports.getServiceFunctions = getServiceFunctions; exports.log = log; exports.getQueueOutgoing = getQueueOutgoing; exports.putQueueIncoming = putQueueIncoming;