"EhLib.Com"
https://forum.ehlib.com/ru/

Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD
https://forum.ehlib.com/ru/viewtopic.php?f=4&t=3246
Страница 1 из 1

Автор:  edgen [ 11 авг 2022, 15:14 ]
Заголовок сообщения:  Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Здравствуйте!

При миграции с ZeosDBO 7.2 на ZeosDBO 8 столкнулся с проблемой: если в запросе есть поле numeric, то в связке TZQuery -> TDataSource -> TMemTableEh возникает исключение (SIGSEGV).
Исключение возникает в методе TCustomMemTableEh.SetFieldData. То же исключение выбрасывается при попытке обратиться к такому полю (Field.Value или Field.As%something%).

Небольшое исследование показало, что восьмая версия ZEOSDBO для таких полей устанавливает тип ftFMTBCD, который, видимо, неправильно обрабатывается в процедуре BufferToVar внутри метода TCustomMemTableEh.SetFieldData. После замены соответствующего блока в case на
Код:
      ftFMTBcd:
      {$IFDEF FPC}
        Data := VarFMTBcdCreate(TBcd(Buffer^));
      {$ELSE}
        if NativeFormat
          then DataConvert(Field, Buffer, @Data, False)
          else Data := VarFMTBcdCreate(TBcd(Buffer^));
      {$ENDIF}

всё заработало как надо. В принципе, изменения аналогичны обработке полей ftBCD в той же процедуре.
Если я правильно определил причину, можно ли добавить это в код библиотеки, чтобы не "лечить" исходник при каждом обновлении EhLib?

С уважением
Евгений.

Автор:  edgen [ 16 авг 2022, 20:13 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Дополнение.

Технические подробности: Windows10, PostgreSQL 12, Lazarus trunk (с 2.2.2 такая же ситуация), ZeosDBO 8 trunk, EhLib 10.2.029

К сожалению, как надо не заработало. Скомпилировалось, данные добавляет без исключений, но вот не работает дальше.
Почти любая попытка обращения к такому полю, если значение не нулевое, приводит к исключению. Чаще всего это EOutOfRange, иногда бывает переполнение BCD, иногда eBCDNotImplementedException, которое вызывается в единственном случае, если TVarData.VType неизвестен модулю FmtBCD. Если исключения не возникает, то значения случайные, не те, которые в запись заносились. Складывается впечатление, что в структуре данных MemTableEh лежит указатель на некую область памяти, в которой находится мусор.

Точно установлено, что данные портятся за пределами метода
Код:
procedure TCustomMemTableEh.SetFieldData(Field: TField;  Buffer: Pointer; NativeFormat: Boolean);

(там из RecBuf во время отладки можно достать правильные данные).

В принципе, "родной" MemTable из Zeos работает корректно, но с ним будет невозможна локальная сортировка и фильтрация в DBGridEh. Откат обратно на Zeos 7.2 также нежелателен, потому что, кроме важных вещей, не относящихся к этой теме, поля типа numeric транслировались в поля TFloatField с соответствующей потерей точности (значения вроде 0,39999999999 вместо точного 0,4).

Вопрос: можно исправить работу с полями типа ftFMTBCD?

С уважением
Евгений.

Автор:  EhLibSupport [ 17 авг 2022, 03:52 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Добрый день.

Вы можете кратко описать что такое ZeosDBO?
БД или библиотека для работы с какими-то БД?
Можете написать инструкцию, где и как скачивать и устанавливать нужные библиотеки чтобы протестировать данную проблему?
Есть ли у вас возможность создать тестовый проект, в котором бы присутствовал доступ к ZeosDBO через MemTable и через какой-то работающий DataSet?

Автор:  edgen [ 17 авг 2022, 16:44 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Здравствуйте!

Цитата:
Вы можете кратко описать что такое ZeosDBO?

Это библиотека доступа к данным, работает с несколькими серверами (mysql, postgresql, interbase, oracle и т.д.), на уровне компонентов предоставляет объекты-наследники TDataSet и необходимые объекты для взаимодействия с сервером (соединение, последовательности, слушатели событий и т.п.)

Цитата:
Можете написать инструкцию, где и как скачивать и устанавливать нужные библиотеки чтобы протестировать данную проблему?

Загружается с http://www.sourceforge.net/projects/zeoslib (subversion->branches->8.0 patches). Устанавливается пакет packages\lazarus\zcomponentdesign.lpk (он "потащит" за собой все остальные пакеты библиотеки). Сейчас проверил на "чистом" Lazarus 2.3.0, устанавливается без проблем.

Тестовый проект прикладываю. Объявление таблицы в файле data_stuctures.sql.

Вложения:
fmtbcd_ehlib.zip [6.06 KiB]
Скачиваний: 101

Автор:  edgen [ 17 авг 2022, 17:26 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Сейчас короткий эксперимент показал, что Zeos вообще ни при чём. Просто MemTableEh неправильно работает с полями ftFMTBCD в Lazarus (как минимум):
1. На форме лежит кнопка, MemTableEh, DataSource и DBGridEh (все свойства по-умолчанию, просто набросили компоненты, DataSource смотрит в MemTable, грид показывает то, что отдаёт DataSource).
2. По нажатию на кнопку выполняем:
Код:
  MemTableEh2.FieldDefs.Add('id',ftInteger, 4);
  MemTableEh2.FieldDefs.Add('bcd', ftFMTBcd, 14, 6, false, false, 1, CP_UTF8);
  MemTableEh2.CreateDataSet;
3. Пробуем вносить данные, получаем ошибку.

Автор:  edgen [ 29 авг 2022, 14:06 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Добрый день!

Уважаемые разработчики, подскажите, есть ли какой-то прогноз по исправлению?
Спасибо.

С уважением
Евгений.

Автор:  EhLibSupport [ 01 сен 2022, 23:50 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Добрый день.

Ошибку исправим в следующей сборке.
Спасибо за информацию.

Автор:  edgen [ 07 сен 2022, 16:04 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Добрый день.

Проверено, сборка 10.2.031. Поля типа ftFmtBCD обрабатываются корректно.

С уважением
Евгений.

Автор:  Python [ 10 фев 2023, 14:33 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

edgen писал(а):
... Сейчас проверил на "чистом" Lazarus 2.3.0 ...

Камрад стесняюсь спросить... а где Вы взяли Лазарь 2.3 ? - на официальном сайте пока только 2.2.4...
Да, еще один момент. В Лазаре в Online Package Manager есть репозиторий ZeosDBO, но мне показалось, что там библиотека (при всём сходстве в именах пакетов) несколько отличается от ZeosLib, который скачивается с Sourceforge... по крайней мере в прошлом году у меня была какая-то проблема, когда я при переустановке Лазаря решил поставить именно "встроенный" пакет - и потом попытался открыть существующий проект. Разбираться не стал, просто переустановил библиотеку. Ничего по этому поводу не знаете?

Автор:  edgen [ 16 фев 2023, 15:44 ]
Заголовок сообщения:  Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD

Python писал(а):
edgen писал(а):
... Сейчас проверил на "чистом" Lazarus 2.3.0 ...

Камрад стесняюсь спросить... а где Вы взяли Лазарь 2.3 ? - на официальном сайте пока только 2.2.4...

Да, это моя опечатка. На самом деле я пользуюсь одновременно транком Lazarus и Codetyphon (он в некоторых моментах мне удобнее), для проверок иногда ставлю готовую сборку с оф.сайта. В данном случае как раз 2.2.4 была.

Python писал(а):
Да, еще один момент. В Лазаре в Online Package Manager есть репозиторий ZeosDBO, но мне показалось, что там библиотека (при всём сходстве в именах пакетов) несколько отличается от ZeosLib, который скачивается с Sourceforge... по крайней мере в прошлом году у меня была какая-то проблема, когда я при переустановке Лазаря решил поставить именно "встроенный" пакет - и потом попытался открыть существующий проект. Разбираться не стал, просто переустановил библиотеку. Ничего по этому поводу не знаете?

Я не люблю менеджер пакетов Лазаря именно по причине того, что неизвестно какая именно версия или из какого коммита пакет собран. Но, наверно, не стоит откровенно оффтопить, предлагаю в личку перейти.

Страница 1 из 1 Часовой пояс: UTC
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/