Skip to main content

Хост Postgres

ХНазначение: Обеспечивает работу с PostgreSQL через Oracle-совмест Postgres построен на базимые интерфреймворкасы. @morphcluster/core и пПредоставляет доступ к базе данных PostgreSQL в стиле, совместимом с Oracle (через адаптер). Он состоит из нескольких внутренних сервисов, каждый из которых выполняет свою роль: загрузкау метаданных функций, выполнение запросов, управление пуломы соединений, пкоддроткиержка и длинныхе транзакцийи, нотификации и утилиты генерации обёрток. Включает адаптеры, скрывающие различия между Oracle и PostgreSQL.

Пакет предназначен для работы в составед MorphCluster‑приломлжения (например, Supervisor) и использует общие сервисы: DbServices, RegistryHelper, GlobalServices и тестовые инструменты.

Точка входа (src/index.mjs)

export default {
  name: "Postgres",
  config,
  clients: {},
  services: {
    DbServices, PgFunctions, OraFunctions, PgPool, OraQueries,
    PgTransactions, PgTools, PgNotify, OraLongTransactions,
    OraQueriesPool, OLTTest, OraAdpTest
  }
}

Все сервисы наследуют ServiceRequire и регистрируются в ServiceHost с именем "Postgres". Конфигурация по умолчаОнию определенбща в src/config.mjs и можеют быть переопределенася через механизм зависимостей (CommonRegistryrequirements) и прямые вызовы методов друг друга.


СОсновные сервисы

1. PgFunctions

НФазначениейл: src/pg-queries/pg-functions/index.mjs

Загружает и хранит метаданные о всех функциях и /процедурах PostgreSQL из системногоых таблиц PostgreSQL и каталога (pg_proc). Пэширедоставляует мих. Используетося дыругими сервисами для поиска функций по имени и пространству имён.

НЗависледуимости: нет
Ключевые методы:

  • reload() – перечитывает функции из БД (вызывается при старте).
  • find({namespace, name}) – поиск функции по схеме и имени.
  • findByName({name}) – поиск только по имени (менее точно).

2. OraFunctions

Файл: ServiceRequiresrc/ora-adapter/ora-functions/index.mjs

Представляет функции PostgreSQL в «оракул-подобном» виде: пакеты и процедуры. Использует PgFunctions для получения сырых метаданных и конвертирует их в формат, привычный для Oracle-клиентов.

Зависимости (requirements): отсутстPgFunctions
Ключевуютые (использумет только config.common)

Конфигурацияды:

  • common.postgresUrilist()строка подключения к PostgreSQL
  • common.timeZone – часовой пояс (например, 'Europe/Moscow')

Методы (запросы):

  • getFunc({packageName, funcName})
    МетодПараметрыВозвращает Осписок всех схем (пание
    reload{}voidПерезагружакетов).
  • getPackage({packageName}) – список функций и типов изсхеме.
  • БД
    find {namespace, name}FuncRec | undefinedИщдет функцию по поальномуе опимесани (без учёта регистра)
    findByName{name}FuncRec | undefinedИщет функцию по имени (без учёта регистра, только по имени)

    Структура FuncRec:

    {
      oid: number;          // OID функции name:(параметры, string;типы, //направления).
    
  • reload() – обновляет данные, перезагружая PgFunctions.
  • 3. PgPool

    Файл: src/pg-queries/pg-pool/index.mjs

    Пул «коротких» соединений с PostgreSQL. Каждый запрос выполняется в отдельной транзакции (BEGIN → COMMIT/ROLLBACK). Используется сервисами OraQueries для быстрых запросов.

    Зависимости: PgFunctions, RegistryHelper
    Управление через CommonRegistry:

    • pgQueryPool.connectionCount – размер пула (по умолчанию 0 = отключен).

    Методы:

    • execSql({sql, values, session}) – выполнить SQL.
    • execFunc({namespace, funcName, params, session}) – выполнить функцию.
    • reconnectAll() – пересоздать все соединения.
    • state() – текущий статус соединений (для OraQueriesPool).
    • reload() – инициализация ссылок на служебные функции kind: string; // 'f' - функция(set_user_id, 'p' - процедура nsp: string; // Пространство имён (схемаwrite_error_log) result: string|null; // Тип возвращаемого значения args: Array<{ name: string; isOut: boolean; hasDefault: boolean; type: string | null; }>; }

    Жизненный цикл:

    • При старте автоматически вызывает reload().
    • При вызове reload() подключается к БД, запрашивает pg_type и список функций, разбирает аргументы с помощью ArgumentParser.

    Особенности:

    • ИУстанавливает контекст пользователя через accounts.set_user_id.
    • Логнорирует схемыошибки в таблицу pg_catalog и information_schemalogs.write_error_log.
    • Для разбора аргуменАвтовматически испереподкльзуючается встпроенный парсер ArgumentParser, которыйи обрабатываетх с(тандаймертный вывод pg_get_function_arguments).

    4.

    Сервис OraFunctions

    PgTransactions

    НФазначениейл: Пsrc/pg-queries/pg-transactions/index.mjs

    Упредоставляет длинфоными трмацию о фунзакцияхми. PostgreSQLВ в нотацличие Oracle (адаптируеот типыPgPool, соедимнение удержива, параметры). Используется отклирытым ментжду вызовами, поддержидвающется ручное управлениме (BEGIN, выполнение Oracle-нескольких запросовместимый, интерфейсCOMMIT/ROLLBACK).

    Зависимости: ["PgFunctions"]

    Конфигурация:
    disableAutoload – если trueRegistryHelper, не вызываетDbServices, reload()PgFunctions
    Упри старте (по умолчанию false).

    Методы (запросы):

    МетодПараметрыВозвращаетОписание
    reload{}voidДелегирует перезагрузку в PgFunctions.reload
    list{}string[]Список имён схем (пакетов) в верхнем регистре
    getPackage{packageName}{result: {id:-1, name, funcs[]}}Возвращает список функций пакета с именами в верхнем регистре
    getFunc{packageName, funcName}{result: {name, overload, descr, params[]}}Возвращает метаданные одной функции (Oracle-стиль)

    Структура параметра функции в ответе getFunc:

    {
      pos: number;        // Позиция параметра
      name: string|null;  // Имя
      type: string;       // Oracle-тип (VARCHAR2, NUMBER, CURSOR и т.д.)
      out: boolean;       // Является ли OUT-параметром
      IN_OUT: "IN"|"OUT";// Строковое представление направления
      required: boolean;  // Обязательность (нет значения по умолчанию)
    }
    

    Особенности:

    • Преобразует PG-типы в Oracle-типы с помощью oraUtils.convertType.
    • Игнорирует функции из служебных схем.
    • Все имена схем и функций приводятся к верхнему регистру.

    Сервис PgPool

    Назначение: Управляет пулом простых (не транзакционных) соединений с PostgreSQL. Выполняет SQL-запросы и вызовы функций/процедур. Поддерживает очередьз запросов с автоматическим переподключением и записью ошибок в лог.

    Зависимости: ["PgFunctions", "RegistryHelper"]

    Конфигурация:CommonRegistry:

    • common.postgresUriPgTransactions.idleTimeout строка подключения
    • common.timeZone – часовой пояс
    • pgQueryPool.connectionCount – количество соединений в пуле (из CommonRegistry, схема registrySchema)

    Методы (запросы):

    МетодПараметрыВозвращаетОписание
    reconnect{}voidПересоздаёт пул соединений (закрывает старые, открывает новые согласно connectionCount)
    execSql{sql, values, session?, noLog?}Promise<Array<{paramName, type, value}>>Выполняет сырой SQL-запрос
    execFunc{namespace, funcName, params, count?, offset?, session?, noLog?}Promise<Array<{paramName, type, value}>>Выполняет функцию/процедуру по метаданным из PgFunctions

    Дополнительно:

    • getState() – не запрос, а метод для получения состояния пула (возвращает массив объектов с id и status каждого соединения).

    Жизненный цикл:

    • При start() создаёт подписку на изменения реестра через RegistryHelper.onDataChanged, при изменении пересоздаёт пул.
    • При stop() отключает все соединения и очищает таймер переподключения.

    Внаутр беннздее устройство:

    • Пул состоит из объектов PgConnection.
    • Запросы помещаются в очередь queue и обрабатываются последовательно с помощью processQueue().
    • При ошибке соединение переподключается автоматически (до 3 попыток).
    • Для установки контекста пользователя вызывается carabimeta.set_user_id(userId) перед каждым запросом.
    • Ошибки запросов логируются в БД через функцию logs.write_error_log.

    Формат возвращаемых данных:

    • PgConnection возвращает результаты в виде массива {paramName, type, value}.
    • Типы данных преобразуются через PgFormats.formatValue().

    Сервис PgTransactions

    Назначение: Предоставляет механизм длинных транзакций (long transactions) с состоянием, возможностью выполнения нескольких запросов в одной транзакции, коммитом/откатом и фетчем курсоров.

    Зависимости: ["RegistryHelper", "DbServices", "PgFunctions"]

    Конфигурация (из CommonRegistryмс):

      .
    • PgTransactions.cleanTimeoutвремя в мс, через сколько очищатороеь закрытые транзакции (мс).

    Внудаляютсяренний из пукла (по умолчанию 600000)

  • сс PgTransactions.idleTimeoutPGTPool содержит макссимальноев врэкземпля простов PGTransaction. Каждая транзакция имеет в мс (0 – бежиз ограниченный ция,кл: поcreated умолчанию 60000)
  • connecting → ready → executing → executed → fetching → closing → closed.

    Методы (внешние черезапросы OraLongTransactions):

  • create({session})
  • .
  • execSql({trxId,
    Метод ПараметрыВозвращаетОписание
    create{noUser?, session?}{trxId: number}Создаёть новую транзакцию, возвращает еёtrxId. ID
    execSqlexecFunc({trxId?, sql, values, session?}{trxId}Выполняет SQL в новой (если trxId не указан) или существующей транзакции
    execFunc{trxId?,trxId, namespace, funcName, params, session?}session}) {trxId} Ввыполняеить функцию из PgFunctions в транзакции
    getExecResultsql, values, session}) {trxId}Array<Result>Ожидает завершения выполнениять SQL.
  • getExecResult({trxId}) – получи возвращаеть результаты последнего запроса в транзакции
  • fetch{trxId, count}{rows}Извлекает строки из курсора
    commit{trxId, keep?}voidФиксирует транзакцию; если keep=true, сразу начинает новую транзакцию
    rollback{trxId}voidОткатывает транзакцию
    poolStatus{}{lastOltId, connections[]}Возвращает состояние пула транзакций

    Внутреннее устройство:

    • Использует пул PGTPool, который управляет набором PGTransaction.
    • Каждая транзакция (PGTransaction) проходит через состояния: created → connecting → ready → executing → executed → (fetching) → closing → closed.
    • Транзакция начинается с BEGIN, выполняет запросы, и завершается COMMIT или ROLLBACK.
    • Поддерживается работа с курсорами (refcursor): после выполнения (блокирующий).
    • fetch({trxId, count}) – дочитать строки курсора.
    • commit({trxId}) / rollback({trxId}) – завершить транзакцию.
    • poolStatus() – состояние всех транзакций.

    5. PgTools

    Файл: src/pg-queries/pg-tools/index.mjs

    Вспомогательный сервис, создающий функциию, возвращающей курсор, можно вызыватью fetchTABLE(.

  • При возникновении ошибки в транзакции, она сохраняется в error, и может быть получена через getExecResult.
  • Ошибки логируются в logs.write_error_log аналогично PgPool.
  • Устаревшие (закрытые.) транзакции периодически удаляются из пула.
  • Формат результата getExecResult:

    [
      {
        paramName: string;
        type: string;       // PG-тип
        value: any;         // для скалярных
        columns?: [string, string][]; // для курсоров
      }
    ]
    

    Важно: Все методы, изменяющие состояние транзакции, являются асинхронными и не блокируют вызывающий поток (кроме getExecResult и fetch, которые ожидают готовности результата).


    Сервис PgTools

    Назначение: Утилита для генерации заготовки функции, возвращающей TABLE, на основе существующей функции, возвращающей refcursorREFCURSOR.

    ЗУпрощависимости: отсутствуюет (толькомиграцию config)с Oracle.

    Методы (запросы):

  • МетодПараметрыВозвращаетОписание
    funcTableFromRefcursorfuncTableFromRefcursor({funcFrom, funcTo}) Array<{name, type, modifier, size, tableID}>Агенализерирует сSQL-обёртруктуру курсора, возвращает метаданные колонок и создаёт новую функцию с RETURNS TABLE

    Параметры:

    • funcFrom – строкаё вида schema.func_name(args) (например, public.my_func(123))
    • funcTo – полное имя новой функции (по умолчанию schema.func_name_table)

    Пример использования:

    {
      "funcFrom": "public.my_cursor_func(42)",
      "funcTo": "public.my_table_func"
    }
    

    Создаст функцию public.my_table_func(...) RETURNS TABLE(...) на основе структуры курсора.

    Особенности:

    • Выполняет FETCH 0 для получения структуры курсора без перемещения.
    • Автоматически преобразует типы через pg_type.
    • Требует прав администратора (needAdmin: true)БД.

    Сервис

    6. PgNotify

    НФазначениейл: Обsrc/pg-queries/pg-notify/index.mjs

    Респечаливазует механизм подписки на асинхронныех уведомленияй PostgreSQL (LISTEN/NOTIFY). УПоддерживает подписку на каналы, перепомдключенияе и единоставляются через событие onNotify.

    Зависимости: []

    Конфигурация:
    common.postgresUri – строка подключения.

    Методы (запросы):

    МетодПараметрыВозвращаетОписание
    isConnected{}{result: boolean}Проверяет, установлено ли соединение с БД для нотификаций
    getSubscriptions{}{result: string[]}Возвращает список активных подписок (имен каналов)
    subscribe{channelName}voidПодписывается на канал уведомлений
    unsubscribe{channelName}voidОтписывается от канала

    События:

  • JSON).
    СобытиеПараметрыОписание
    onNotify {channel, payload}Вызывагенерируется при получении уведомления. payload(полезная нагружезка распарсенится из JSON.

    ЖизнМеннтодый цикл:

    • При старте подключается к PostgreSQL через PgNotifyConnectionsubscribe({channelName}) и/ восстанавливает все активные подпискиunsubscribe({channelName}).
    • При остановкеisConnected() корректно отключается.
    • Встроенный таймер (ReconnectTimer) каждые 5 секунд проверяетка соединениея.
    • getSubscriptions() – список переактивных подписоключается при обрыве.

    7. OraQueries

    Файл: src/ora-adapter/ora-queries/index.mjs

    Особенносвной адапти:

    • Идентификаторы каналов экранируются для безопасного исвыпользования в SQL.
    • Уведомления ав«коротоматических» парсятся из JSON (если возможно), иначе передаётся строка.

    Сервис OraQueries

    Назначение: ВыOracle-полдобняетых запросов. Принимает вызовы квида PostgreSQL вpackage.func с именованными параметрамиле, Oracle. Ппреобразует именованные параметры в позиционные, конвертирует типы результатов, валидирует вызовых через DbServices в реальные вызовы PostgreSQL и исполняет через PgPool.

    Зависимости: ["PgPool"PgPool, "DbServices"]DbServices


    Методы (запросы):

  • exec({queryName, лнение ов сброс
    Мparams, count, offset, session}) – универсальный вызов.
  • execFunc(...) – явное указание пакета и функции.
  • execSql({sql, params, session}) – выпод
  • ПSQL с заменой именованных параметрыВ:param на позвращаетОписационие
    exec{queryName, params?, count?, offset?}{results: [...]}Основной метод: парсит queryName в форматые package.funcName$1.
  • resetUser() и вызывает/ execFuncresetAllUsers()
  • execFunc{package, func, params?, count?, offset?, session?}{results: [...]}Выпсессиолняет функцию, предварительного пколучив SQL-нтекста через DbServices.getOraSql
    execFuncInner{package, func, params?, count?, offset?, session?}{results: [...]}Выполняет функцию напрямую через PgPool, без проверки через DbServices (требует needAdmin: true)
    execSql{sql, params?, session?}{results: [...]}Выполняет произвольный SQL (административный доступ)
    resetUser{}(не реализованы)Планируется сброс сессии текущего пользователя
    resetAllUsers{}(не реализован)Планируется сброс всех сессий

    Возвращаемое значение:

    {
      results: Array<{
        paramName: string;   // имя выходного параметра (в верхнем регистре)
        type: string;        // Oracle-тип: "VARCHAR2", "NUMBER", "CURSOR", "CLOB", "DATE"...
        value: any;          // значение, для курсоров - {columns, list}
      }>
    }
    

    Особенности:

    • Автоматически преобразует именованные параметры (:name) в позиционные ($1) с помощью oraUtils.convertNameToPos.
    • Конвертирует PG-типы в Oracle-типы (convertType).
    • Для курсоров преобразует структуру через convertColumns.
    • Логирует результат с ограничением размера (если задан limitLogger).
    • В случае отсутствия функции в PgFunctions, записывает информацию о недостающем вызове в logs.write_error_log и выбрасывает ComplexError.

    Сервис

    8. OraLongTransactions

    НФазначениейл: Предsrc/ora-adapter/ora-long-transactions/index.mjs

    Аналоставляетг Oracle-сOraQueries, новместимый интерфейс для длинных транзакций. ЯвИсполяьзуется обёрткой над PgTransactions, адаптируля удержания соединения. Поддерживает многошаговые сценарии: мсоздать транзакцию, выполнить нетскодлько запросов и, получить результаты, зафиксироваметрыь.

    Зависимости: ["PgTransactions"PgTransactions, "DbServices"]DbServices


    Методы:

    • create({session}) – создать транзакцию (возвращает oltId).
    • execFunc({oltId, package, func, params, session}) / execSql(...).
    • getExecResult({oltId}) – получить результат выполненного запроса.
    • fetch({oltId, count}) – получить строки из открытого курсора.
    • commit({oltId}) / rollback({oltId}).
    • poolStatus() – состояние пула длинных транзакций.

    9. OraQueriesPool

    Файл: src/ora-adapter/ora-queries-pool/index.mjs

    Административный интерфейс для просмотра состояния пула PgPool.

    Зависимости: PgPool, DbServices
    Методы:

    • state() – возвращает детализацию по соединениям (количество, статусы).

    Тестовые сервисы

    OLTTest (src/ora-adapter/ora-long-transactions/test/index.mjs)
    OraAdpTest (src/ora-adapter/test/index.mjs)

    Предназначены для ручного тестирования длинных транзакций и обычных SQL-запросов. Содержат примеры вызовов и могут быть удалены в продуктовой среде.


    Вспомогательные классы и утилиты

    ArgumentParser

    Распарсивает строку аргументов функции PostgreSQL (из pg_get_function_arguments) в структурированный вид: { name, type, isOut, hasDefault }.

    PgFormats

    Отвечает за:

    • Конвертацию типов полей при чтении из БД (числа, даты).
    • Формирование SQL-вызова функции с именованными параметрами ("arg" => $1).
    • Проверку кодов ошибок PostgreSQL (отделение логических ошибок от проблем соединения).

    PgConnection

    Управляет одним подключением для «коротких» запросов (PgPool). Выполняет SQL в транзакции (BEGIN → запрос → COMMIT/ROLLBACK). Обрабатывает refcursor, загружая данные из курсора.

    PGTransaction

    Класс одной длинной транзакции. Хранит состояние, управляет жизненным циклом, поддерживает выполнение SQL и функций, фетч курсора. Используется внутри PGTPool.

    PGTPool

    Менеджер пула PGTransaction. Создаёт транзакции по требованию, отслеживает таймауты, автоматически подчищает закрытые соединения, пишет ошибки в лог БД.

    PgNotifyConnection

    Подключение для LISTEN/NOTIFY. Инкапсулирует логику переподключения и подписки.


    Конфигурация

    Файл config.mjs содержит параметры по умолчанию:

    • NatsConnection.queue = "pgqueries", timeout = 60000
    • NatsPublisher.interval = 60000

    Остальные настройки берутся из config.common и CommonRegistry:

    Метод ПараметрыВозвращает Описание
    create{noUser?, session?}{oltId}common.postgresUri Создаёт новую транзакцию (аналог PgTransactions.create)
    execFunc{oltId?, package, func, params?, session?}{oltId}Выполняет функцию пакета (перед выполнением проверяет через DbServices)
    execSql{oltId?, SQL, rawParams?, session?}{oltId}Выполняет произвольный SQL с преобразованием именованных параметров
    getExecResult{oltId}Array<Result>Ожидает результат транзакции
    fetch{oltId, count}{rows}Извлекает строки из курсора
    commit{oltId, keep?}voidФиксирует транзакцию
    rollback{oltId}voidОткатывает транзакцию
    poolStatus{}(состояние пула)Делегирует в PgTransactions.getStatus

    Особенности:

    • Параметры execFunc принимают package и func вместо namespace/funcName.
    • При выполнении SQL через execSql, параметры могут быть переданы в нотации Oracle (:paramName), они автоматически конвертируются в позиционные через oraUtils.convertNameToPos.
    • Все выходные параметры и курсоры приводятся к Oracle-типам.

    Сервис OraQueriesPool

    Назначение: Управление пулом обычных (не транзакционных) сессий OraQueries. Предоставляет административные методы для мониторинга и управления.

    Зависимости: ["PgPool", "DbServices"]

    Методы (запросы):

    МетодПараметрыВозвращаетОписание
    state{}{result: [{name, pid, sessionsCount, workedSessions[], ...}]}Возвращает состояние пула (основано на PgPool.getState())
    recreate{}ошибкаПланируется пересоздание пула, в текущей версии не реализован
    brakeQuery{oraSid}ошибкаПланируется прерывание запроса по идентификатору сессии

    Формат state:

    {
      "result": [
        {
          "name": "main",
          "pid": 0,
          "sessionsCount": 4,
          "workedSessions": [{"id": "pool_0", "status": "exec"}, ...],
          "queryQueue": [],
          "killerSession": null,
          "usage": { ... }
        }
      ]
    }
    

    Особенности:

    • Фактически является административной панелью для PgPool.
    • Методы recreate и brakeQuery пока не реализованы (выбрасывают ошибку).

    Общая архитектура и зависимости

    graph TD
        subgraph "Внешние сервисы"
            DbServices[DbServices]
            CommonRegistry[CommonRegistry]
            RegistryHelper[RegistryHelper]
        end
    
        subgraph "Сервисы PostgreSQL"
            PgFunctions --> |загрузка метаданных| PostgreSQL
            OraFunctions --> PgFunctions
            PgPool --> PgFunctions
            PgPool --> RegistryHelper
            PgTransactions --> PgFunctions
            PgTransactions --> RegistryHelper
            PgTransactions --> DbServices
            PgTools --> PostgreSQL
            PgNotify --> PgNotifyConnection --> PostgreSQL
            OraQueries --> PgPool
            OraQueries --> DbServices
            OraLongTransactions --> PgTransactions
            OraLongTransactions --> DbServices
            OraQueriesPool --> PgPool
            OraQueriesPool --> DbServices
        end
    
        RegistryHelper --> CommonRegistry
    

    Все соединения с PostgreSQL используют строку подключения из конфигурации common.postgresUri. Настройки пулов и таймаутов управляются через CommonRegistry, изменения вступают в силу после перезагрузки пула (для PgPool — автоматически при изменении схемы).


    Конфигурация по умолчанию

    Файл config.mjs:

    {
      "NatsConnection": {
        "queue": "pgqueries",
        "timeout": 60000
      },
      "NatsPublisher": {
        "interval": 60000
      }
    }
    

    Дополнительные параметры (из config.common):

    • postgresUri – строка подключения к PostgreSQL.
    • PostgreSQL
    • common.timeZone – чЧасовой пояс для сессий БД pgQueryPool.connectionCount Размер пула коротких запросов (в CommonRegistry) PgTransactions.idleTimeout Таймаут простоя транзакции (мс) PgTransactions.cleanTimeout Интервал очистки закрытых транзакций (мс)

      Все сервисы получают конфигурацию через стандартный механизм Config и могут динамически обновляться через подписку на CommonRegistry.


      Схема взаимодействия

      1. Загрузка метаданных PgFunctions при старте загружает список всех функций PostgreSQL. OraFunctions на его основе строит «оракул-подобное» представление.

      2. Регистрация в DbServices Сер,вис 'Europe/Moscow'DbServices (из внешнего пакета) хранит каталог всех доступных вызовов (жёсткие и мягкие). OraQueries и OraLongTransactions используют DbServices.getOraSql() для генерации PL/SQL‑блока с подстановкой параметров.

      3. Выполнение запросов

        • Короткие запросы: OraQueries.exec → DbServices.getOraSql → формирование вызова → PgPool.execFunc → PgConnection.
        • Длинные транзакции: OraLongTransactions.create → PgTransactions.create (создаётся PGTransaction) → далее execFunc/execSql → по окончании getExecResult + commit/rollback.
      4. Нотификации PgNotify слушает каналы PostgreSQL и генерирует событие onNotify, на которое могут подписываться другие сервисы.

      5. Администрирование OraQueriesPool и метод poolStatus у длинных транзакций дают мониторинг соединений.


      Примечания по использованию

      • Большинство сервисов требуют наличия DbServices дДля проверки и выполнения хранимого кода. DbServices – это внешний сервис, который должен быть доступен в кластере (предктноставляет запросы getOraSql и др.).
      • Дляй работы с необходлинными транзакциями используйте OraLongTransactions, а неастройка PgTransactionscommon.postgresUri и напряличие в БД схемую, чтобы обеспечить совместимость с Oracle-клиентами.
      • Административные методы защищены флагом needAdmin: truecarabimeta, который требует аутентифицированной сессии с правоцедурами администратора.
      • Все ошибки базы данных логируются вset_user_id, logs.write_error_log (если функция доступна и не отключена флагом noLog).

      Данный хост является ключевым компонентом для миграции с Oracle на PostgreSQL, обеспечивая прозрачную работу приложений, написанных под Oracle.