From 7b44cfbe2b10757d3574655aec4a2c09b01775a2 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 7 Jan 2019 17:47:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=80=D0=BE=D1=87=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=D1=85=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BC=D0=B5=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/db_connector.js | 37 ++++++++++++++++++++++++++++++ db/PKG_EXS.pck | 21 +++++++++-------- models/intf_db_connector_module.js | 11 +++++++++ models/obj_service.js | 32 ++++++++++++++++++++++++++ models/prms_db_connector.js | 13 +++++++++++ modules/parus_oracle_db.js | 19 +++++++++++++++ 6 files changed, 123 insertions(+), 10 deletions(-) diff --git a/core/db_connector.js b/core/db_connector.js index 00fbc6e..7cb8265 100644 --- a/core/db_connector.js +++ b/core/db_connector.js @@ -368,6 +368,43 @@ class DBConnector extends EventEmitter { throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД"); } } + //Получить информацию о просроченных сообщениях обмена сервиса + async getServiceExpiredQueueInfo(prms) { + //Работаем только при наличии подключения + if (this.bConnected) { + //Проверяем структуру переданного объекта с параметрами получения информации о просроченных сообщения обмена + let sCheckResult = validateObject( + prms, + prmsDBConnectorSchema.getServiceExpiredQueueInfo, + "Параметры функции получения информации о просроченных сообщениях обмена сервиса" + ); + //Если структура объекта в норме + if (!sCheckResult) { + try { + //Подготовим параметры для передачи в БД + let getServiceExpiredQueueInfoData = _.cloneDeep(prms); + getServiceExpiredQueueInfoData.connection = this.connection; + //И выполним получение информации о просроченных сообщениях + let res = await this.connector.getServiceExpiredQueueInfo(getServiceExpiredQueueInfoData); + //Валидируем полученный ответ + sCheckResult = validateObject( + res, + objServiceSchema.ServiceExpiredQueueInfo, + "Сведения о просроченных сообщениях обмена сервиса" + ); + if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); + //Успешно - отдаём полученные сведения о просроченных сообщениях + return res; + } catch (e) { + throw new ServerError(SERR_DB_EXECUTE, e.message); + } + } else { + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); + } + } else { + throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД"); + } + } //Запись в журнал работы async putLog(prms) { //Работаем только при наличии подключения diff --git a/db/PKG_EXS.pck b/db/PKG_EXS.pck index 72e9bd4..0ea7d33 100644 --- a/db/PKG_EXS.pck +++ b/db/PKG_EXS.pck @@ -293,10 +293,10 @@ create or replace package PKG_EXS as ); /* */ - procedure SERVICE_QUEUE_EXPIRED_GET + procedure SERVICE_QUEUE_EXPIRED_INFO_GET ( - NEXSSERVICE in number, -- . - RCSERVICE_QUEUE_EXPIRED out sys_refcursor -- + NEXSSERVICE in number, -- . + RCSERVICE_QUEUE_EXPIRED_INFO out sys_refcursor -- ); /* */ @@ -1244,11 +1244,11 @@ create or replace package body PKG_EXS as RNLIST_BASE_CLEAR(NIDENT => NIDENT); end SERVICE_GET; -/* */ - procedure SERVICE_QUEUE_EXPIRED_GET + /* */ + procedure SERVICE_QUEUE_EXPIRED_INFO_GET ( - NEXSSERVICE in number, -- . - RCSERVICE_QUEUE_EXPIRED out sys_refcursor -- + NEXSSERVICE in number, -- . + RCSERVICE_QUEUE_EXPIRED_INFO out sys_refcursor -- ) is /* */ @@ -1298,11 +1298,12 @@ create or replace package body PKG_EXS as end if; end loop; /* */ - open RCSERVICE_QUEUE_EXPIRED for - select NCNT "nCnt", + open RCSERVICE_QUEUE_EXPIRED_INFO for + select REXSSERVICE.RN "nId", + NCNT "nCnt", DECODE(NCNT, 0, null, SPREF || SINFO_LIST) "sInfoList" from DUAL; - end SERVICE_QUEUE_EXPIRED_GET; + end SERVICE_QUEUE_EXPIRED_INFO_GET; /* */ procedure SERVICE_CTX_GET diff --git a/models/intf_db_connector_module.js b/models/intf_db_connector_module.js index b16a0d2..d76c3b3 100644 --- a/models/intf_db_connector_module.js +++ b/models/intf_db_connector_module.js @@ -115,6 +115,17 @@ exports.dbConnectorModule = new Schema({ "Не реализована функция постановки в очередь задания на аутентификацию сервиса (putServiceAuthInQueue)" } }, + //Получение информации о просроченных сообщениях обмена сервиса + getServiceExpiredQueueInfo: { + use: { validateAsyncFunctionType }, + required: true, + message: { + validateAsyncFunctionType: + "Функция получения информации о просроченных сообщениях обмена сервиса (getServiceExpiredQueueInfo) имеет неверный формат (ожидалось - AsyncFunction)", + required: + "Не реализована функция получения информации о просроченных сообщениях обмена сервиса (getServiceExpiredQueueInfo)" + } + }, //Протоколирование работы сервиса log: { use: { validateAsyncFunctionType }, diff --git a/models/obj_service.js b/models/obj_service.js index cdb500e..fb9b500 100644 --- a/models/obj_service.js +++ b/models/obj_service.js @@ -256,3 +256,35 @@ exports.ServiceCtx = new Schema({ } } }); + +//Схема валидации сведений о просроченных сообщениях обмена сервиса +exports.ServiceExpiredQueueInfo = new Schema({ + //Идентификатор сервиса + nId: { + type: Number, + required: true, + message: { + type: "Идентификатор сервиса (nId) имеет некорректный тип данных (ожидалось - Number)", + required: "Не указан идентификатор сервиса (nId)" + } + }, + //Количество просроченных сообщений обмена + nCnt: { + type: Number, + required: true, + message: { + type: "Количество просроченных сообщений обмена (nCnt) имеет некорректный тип данных (ожидалось - Number)", + required: "Не указано количество просроченных сообщений обмена (nCnt)" + } + }, + //Информация о просроченных сообщениях обмена + sInfoList: { + type: String, + required: true, + message: { + type: + "Информация о просроченных сообщениях обмена (sInfoList) имеет некорректный тип данных (ожидалось - String)", + required: "Не указана информация о просроченных сообщениях обмена (sInfoList)" + } + } +}).validator({ required: val => val === null || val === 0 || val }); diff --git a/models/prms_db_connector.js b/models/prms_db_connector.js index 4040a17..b9d89bd 100644 --- a/models/prms_db_connector.js +++ b/models/prms_db_connector.js @@ -163,6 +163,19 @@ exports.putServiceAuthInQueue = new Schema({ } }); +//Схема валидации параметров функции получения информации о просроченных сообщениях обмена сервиса +exports.getServiceExpiredQueueInfo = new Schema({ + //Идентификатор сервиса + nServiceId: { + type: Number, + required: true, + message: { + type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - Number)`, + required: path => `Не указан идентификатор сервиса (${path})` + } + } +}); + //Схема валидации параметров функции записи в журнал работы сервиса exports.putLog = new Schema({ //Тип сообщения журнала работы сервиса diff --git a/modules/parus_oracle_db.js b/modules/parus_oracle_db.js index 74e8b2a..150d6e1 100644 --- a/modules/parus_oracle_db.js +++ b/modules/parus_oracle_db.js @@ -152,6 +152,24 @@ const putServiceAuthInQueue = async prms => { } }; +//Получение информации о просроченных сообщениях обмена сервиса +const getServiceExpiredQueueInfo = async prms => { + try { + let res = await prms.connection.execute( + "BEGIN PKG_EXS.SERVICE_QUEUE_EXPIRED_INFO_GET(NEXSSERVICE => :NEXSSERVICE, RCSERVICE_QUEUE_EXPIRED_INFO => :RCSERVICE_QUEUE_EXPIRED_INFO); END;", + { + NEXSSERVICE: prms.nServiceId, + RCSERVICE_QUEUE_EXPIRED_INFO: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } + }, + { outFormat: oracledb.OBJECT } + ); + let rows = await readCursorData(res.outBinds.RCSERVICE_QUEUE_EXPIRED_INFO); + return rows[0]; + } catch (e) { + throw new Error(e.message); + } +}; + //Запись в протокол работы const log = async prms => { try { @@ -369,6 +387,7 @@ exports.setServiceContext = setServiceContext; exports.clearServiceContext = clearServiceContext; exports.isServiceAuth = isServiceAuth; exports.putServiceAuthInQueue = putServiceAuthInQueue; +exports.getServiceExpiredQueueInfo = getServiceExpiredQueueInfo; exports.log = log; exports.getQueue = getQueue; exports.putQueue = putQueue;