Приветствую!
Python писал(а):
Судя по симптомам и месту, где вылетает ошибка, это в буферах MemTableEh некорректно выделяется память для значений строковых полей, и при копировании туда данных происходит выход за пределы выделенного сегмента. При этом если в датасете тип поля не StringField, а WideStringField, то ошибки не возникает: там используется другой механизм копирования данных (насколько я успел глянуть исходники).
Я так понимаю, что беда именно в UTF8 - переменное число байт на символ (от 1 до 4), откуда вытекает необходимость в исходнике ставить проверки на компиляцию под Linux и использовать специальные функции для работы с UTF8-строками (они есть).
Насколько я понимаю, само хранение записи в памяти осуществляется как массив вариантов, по крайней мере, именно так определён TRecDataValues. Сильно в код не углублялся. Довольно странно выглядит разное поведение под Windows и Linux, возможно как раз реализация вариантов немного разная? Или в Линуксе UTF-16 по-умолчанию?
Python писал(а):
Пока автор разбирается с указанными проблемами - предлагаю свои временные
РЕКОМЕНДАЦИИ ПО ОБХОДУ ПРОБЛЕМЫ
для тех, кто работает через ZeosLib: в ZConnection для свойства ControlsCodePage указываем cCP_UTF16 - и во всех связанных датасетах строковые поля автоматически будут создаваться как WideString.
Возможные траблы:
1. Если поля в датасетах созданы статически - надо пересоздать (в т.ч. в связанные MemTableEh, если используются).
2. Поля типа text из Memo преобразуются в WideMemo - и тут уже "ломается" MemTableEh, но в новой сборке автор обещал это поправить.
3. В DBGridEh надо обязательно включать опцию DrawMemoText, иначе вместо текста будем видеть "(MEMO)".
4. При работе в DBGridEh с нативной локальной фильтрацией "типа как в Excel" (выпадающие списки в титлах колонок, режим для работы через MemTableEh) - не дает поставить фильтр более чем на одну текстовую колонку. Решается путем написания собственной функции заполнения списка фильтрации и замыкании на нее событий FillSTFilterListValues для гридов. В принципе, ничего сложного там нет.
Спасибо! Выглядит вполне, правда, у меня получилось, что проще отказаться от работы через DataDriver. А вот включение DrawMemoText в гриде — дело при работе с Zeos обязательное, вне зависимости от ControlsCodePage. Дело в том, что, если я в запросе не произведу явное приведение типов для вычисляемой строки, Zeos посчитает это поле ftMemo. Например,
Код:
SELECT
concat('a','b','c') AS sample_string;
даст поле sample_string типа ftMemo, а
Код:
SELECT
cast(concat('a','b','c') as VARCHAR(5)) AS sample_string;
задаст полю тип ftString (при этом важно указать длину строки в SQL)
С уважением
Евгений