diff --git a/modules/parus_oracle_db.js b/modules/parus_oracle_db.js index a8c4f44..76f6c89 100644 --- a/modules/parus_oracle_db.js +++ b/modules/parus_oracle_db.js @@ -57,41 +57,6 @@ const SQUEUE_EXEC_STATE_ERR = "ERR"; //Обработано с ошибками // Тело модуля //------------ -//Подключение к БД -const connect = async prms => { - try { - if (prms && prms.sUser && prms.sPassword && prms.sConnectString) { - const conn = await oracledb.getConnection({ - user: prms.sUser, - password: prms.sPassword, - connectString: prms.sConnectString - }); - if (prms.sSessionAppName) conn.module = prms.sSessionAppName; - return conn; - } else { - throw new Error( - "Не указаны параметры подключения (отсутствует одно из полей: sUser, sPassword, sConnectString)" - ); - } - } catch (e) { - throw new Error(e.message); - } -}; - -//Отключение от БД -const disconnect = async prms => { - if (prms && prms.connection) { - try { - const conn = await prms.connection.close(); - return; - } catch (e) { - throw new Error(e.message); - } - } else { - throw new Error("Не указано подключение (отсутствует поле: connection)"); - } -}; - //Чтение данных из курсора const readCursorData = cursor => { return new Promise((resolve, reject) => { @@ -109,163 +74,107 @@ const readCursorData = cursor => { }); }; +//Подключение к БД +const connect = async prms => { + try { + const conn = await oracledb.getConnection({ + user: prms.sUser, + password: prms.sPassword, + connectString: prms.sConnectString + }); + if (prms.sSessionAppName) conn.module = prms.sSessionAppName; + return conn; + } catch (e) { + throw new Error(e.message); + } +}; + +//Отключение от БД +const disconnect = async prms => { + try { + await prms.connection.close(); + return; + } catch (e) { + throw new Error(e.message); + } +}; + //Получение списка сервисов -const getServices = prms => { - return new Promise((resolve, reject) => { - if (prms && prms.connection) { - prms.connection.execute( - "BEGIN PKG_EXS.SERVICE_GET(RCSERVICES => :RCSERVICES); END;", - { RCSERVICES: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } }, - { outFormat: oracledb.OBJECT }, - (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); - }); - } - } - ); - } else { - reject(new Error("Не указано подключение (отсутствует поле: connection)")); - } - }); +const getServices = async prms => { + try { + let res = await prms.connection.execute( + "BEGIN PKG_EXS.SERVICES_GET(RCSERVICES => :RCSERVICES); END;", + { RCSERVICES: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } }, + { outFormat: oracledb.OBJECT } + ); + let rows = await readCursorData(res.outBinds.RCSERVICES); + return rows; + } catch (e) { + throw new Error(e.message); + } }; //Получение списка функций сервиса -const getServiceFunctions = prms => { - return new Promise((resolve, reject) => { - if (prms && prms.connection) { - if (prms.nServiceId) { - prms.connection.execute( - "BEGIN PKG_EXS.SERVICEFN_GET(NSERVICE => :NSERVICE, RCSERVICEFNS => :RCSERVICEFNS); END;", - { NSERVICE: prms.nServiceId, RCSERVICEFNS: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } }, - { outFormat: oracledb.OBJECT }, - (err, result) => { - if (err) { - reject(new Error(err.message)); - } 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 { - reject(new Error("Не указан идентификатор сервиса (отсутствует поле: nServiceId)")); - } - } else { - reject(new Error("Не указано подключение (отсутствует поле: connection)")); - } - }); +const getServiceFunctions = async prms => { + try { + let res = await prms.connection.execute( + "BEGIN PKG_EXS.SERVICEFN_GET(NSERVICE => :NSERVICE, RCSERVICEFNS => :RCSERVICEFNS); END;", + { NSERVICE: prms.nServiceId, RCSERVICEFNS: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } }, + { outFormat: oracledb.OBJECT } + ); + let rows = await readCursorData(res.outBinds.RCSERVICEFNS); + return rows; + } catch (e) { + throw new Error(e.message); + } }; //Запись в протокол работы -const log = prms => { - return new Promise((resolve, reject) => { - if (prms && prms.connection) { - if (!(prms.nLogState === "undefined")) { - prms.connection.execute( - "BEGIN PKG_EXS.LOG_PUT(NLOG_STATE => :NLOG_STATE, SMSG => :SMSG, NEXSSERVICE => :NEXSSERVICE, NEXSSERVICEFN => :NEXSSERVICEFN, NEXSQUEUE => :NEXSQUEUE, RCLOG => :RCLOG); END;", - { - NLOG_STATE: prms.nLogState, - SMSG: prms.sMsg, - NEXSSERVICE: prms.nServiceId, - NEXSSERVICEFN: prms.nServiceFnId, - NEXSQUEUE: prms.nQueueId, - RCLOG: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } - }, - { outFormat: oracledb.OBJECT, autoCommit: true }, - (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]); - }); - } - } - ); - } else { - reject(new Error("Не указан тип сообщения журнала (отсутствует поле: nLogState)")); - } - } else { - reject(new Error("Не указано подключение (отсутствует поле: connection)")); - } - }); +const log = async prms => { + try { + let res = await prms.connection.execute( + "BEGIN PKG_EXS.LOG_PUT(NLOG_STATE => :NLOG_STATE, SMSG => :SMSG, NEXSSERVICE => :NEXSSERVICE, NEXSSERVICEFN => :NEXSSERVICEFN, NEXSQUEUE => :NEXSQUEUE, RCLOG => :RCLOG); END;", + { + NLOG_STATE: prms.nLogState, + SMSG: prms.sMsg, + NEXSSERVICE: prms.nServiceId, + NEXSSERVICEFN: prms.nServiceFnId, + NEXSQUEUE: prms.nQueueId, + RCLOG: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } + }, + { outFormat: oracledb.OBJECT, autoCommit: true } + ); + let rows = await readCursorData(res.outBinds.RCLOG); + return rows[0]; + } catch (e) { + throw new Error(e.message); + } }; //Считывание очередной порции исходящих сообщений из очереди -const getQueueOutgoing = prms => { - return new Promise((resolve, reject) => { - if (prms && prms.connection) { - if (prms.nPortionSize) { - prms.connection.execute( - "BEGIN PKG_EXS.QUEUE_NEXT_GET(NPORTION_SIZE => :NPORTION_SIZE, NSRV_TYPE => :NSRV_TYPE, RCQUEUES => :RCQUEUES); END;", - { - NPORTION_SIZE: prms.nPortionSize, - NSRV_TYPE: NSRV_TYPE_SEND, - RCQUEUES: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } - }, - { outFormat: oracledb.OBJECT, autoCommit: true, fetchInfo: { bMsg: { type: oracledb.BUFFER } } }, - (err, result) => { - if (err) { - reject(new Error(err.message)); - } else { - let cursor = result.outBinds.RCQUEUES; - 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 { - reject(new Error("Не указан размер извлекаемой порции сообщений (отсутствует поле: nPortionSize)")); +const getQueueOutgoing = async prms => { + try { + let res = await prms.connection.execute( + "BEGIN PKG_EXS.QUEUE_NEXT_GET(NPORTION_SIZE => :NPORTION_SIZE, NSRV_TYPE => :NSRV_TYPE, RCQUEUES => :RCQUEUES); END;", + { + NPORTION_SIZE: prms.nPortionSize, + NSRV_TYPE: NSRV_TYPE_SEND, + RCQUEUES: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } + }, + { + outFormat: oracledb.OBJECT, + fetchInfo: { blMsg: { type: oracledb.BUFFER }, blResp: { type: oracledb.BUFFER } } } - } else { - reject(new Error("Не указано подключение (отсутствует поле: connection)")); - } - }); + ); + let rows = await readCursorData(res.outBinds.RCQUEUES); + return rows; + } catch (e) { + throw new Error(e.message); + } }; //Помещение очередного входящего сообщения в очередь -const putQueueIncoming = prms => {}; +const putQueueIncoming = async prms => {}; //Установка значения в сообщении очереди const setQueueState = async prms => { @@ -278,10 +187,14 @@ const setQueueState = async prms => { SEXEC_MSG: prms.sExecMsg, RCQUEUE: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } }, - { outFormat: oracledb.OBJECT, autoCommit: true, fetchInfo: { bMsg: { type: oracledb.BUFFER } } } + { + outFormat: oracledb.OBJECT, + autoCommit: true, + fetchInfo: { blMsg: { type: oracledb.BUFFER }, blResp: { type: oracledb.BUFFER } } + } ); let rows = await readCursorData(res.outBinds.RCQUEUE); - return rows; + return rows[0]; } catch (e) { throw new Error(e.message); }