Как исправить регрессию драйвера psqlODB C, чтобы получить подробности сообщения об ошибке - PullRequest
0 голосов
/ 23 февраля 2020

Я ищу способ исправить регрессию драйвера psqlODB C.

Начиная с psqlODB C 09.05.0100, когда драйвер psqlODB C использует libpq для всех операций (более ранние версии использовали libpg только для аутентификации) Клиент ODB C не показывает подробности сообщения об ошибке.

Например, пользователи получили только общее сообщение об ошибке c, например

Connectivity error: ERROR: insert or update on table "mytable" violates
foreign key constraint  "mytable_myfield_fkey

Детали сообщения об ошибке, например

Key (myfield)=(mykeyvalue) is not present in table "mymastertable".;

больше не возвращаются.

Как получить подробное сообщение об ошибке или хотя бы только неверное значение ключа "mykeyvalue", которое возвращается в деталях сообщения об ошибке?

Некоторые идеи:

  1. Первые версии драйверов ODB на основе libpq C возвращали одно и то же сообщение об ошибке "ресурс не найден" для всех ошибок. Хироши исправил это в более поздних версиях. Возможно, исправлен код psqlODB C для восстановления поведения перед libpq.

  2. Может быть, анализ журналов odb c от до и после драйверов 09.05.0100 может обеспечить решение. Я могу предоставить ODB C файлы журнала.

  3. psqlODB C позволяет передавать параметры в libpq из строки подключения. Может быть, какой-то параметр libpq может это исправить.

  4. Может быть, какой-то Postgres запрос, postgres расширение или прямой odb c, или вызов libpq может использоваться для возврата деталей последнего сообщения об ошибке, например Windows API GetLastError () или Unix global errno.

  5. Возможно, можно создать метод, который возвращает детальные сообщения об ошибках из файла журнала postgres.

В pg sql odb c соединение с исходным кодом. c: строка 866

содержит:

errprimary = PQresultErrorField(pgres, PG_DIAG_MESSAGE_PRIMARY);

, который вероятно, получает только основное сообщение об ошибке.

Чтобы получить подробное сообщение об ошибке, следует использовать PG_DIAG_MESSAGE_DETAIL в соответствии с https://www.postgresql.org/docs/current/libpq-exec.html. Это не используется в исходном коде pg sql -odb c.

Postgres 12.2 и последняя версия драйвера psqlODB C 12.01.0000. psqlODB C вызывается из Visual FoxPro

...