Сегодня один наш турецкий друг прислал замечательную ошибку, полученную при работе через собственный FB-клиент провайдера (dbclient_type=fb.direct).
Bug check at [RemoteFB__P12__XSQLDA_Utilities::Helper__ReadString] [#003]: the size [33] of the resulting data [tag: isc_info_sql_alias] is larger than the buffer size [32].
[Subsystem: remote_fb.p12] XSQLVAR information raw-data processing error. Index: 8.
Failed to build the definition of statement result.
Failed to obtain descriptions of the columns.
Говорит — с gds32.dll такой проблемы нет.
Связанный кусок SQL запроса:
STOKMIKTAR1.ASGARININALTINDA "İ.Stok Asgari Miktarın Altında",
Ответил, что gds32.dll обрезает строки, а провайдер обрабатывает строки (которые не влазят в XSQLVAR) как ошибки. И сообщил о своих мыслях избавиться в собственном клиенте от XSQLDA/XSQLVAR.
Связанный кусок кода из исходников 2.5:
//Тут помимо обрезания - есть еще пара проблем.
static SSHORT get_string_info(const SCHAR** ptr, SCHAR* buffer, int buffer_len)
{
const SCHAR* p = *ptr;
SSHORT len = static_cast<SSHORT>(gds__vax_integer(reinterpret_cast<const UCHAR*>(p), 2));
// CVC: What else can we do here?
if (len < 0)
len = 0;
*ptr += len + 2;
p += 2;
if (len >= buffer_len)
len = buffer_len - 1;
if (len)
memcpy(buffer, p, len);
buffer[len] = 0;
return len;
}
Правда сначала я начал искать в FB3 и нашел там такой замечательный код:
TEXT aliasbuffer[100] = "";
const TEXT* aliasname = aliasbuffer;
if (alias.hasData())
{
int length = alias.length(); //ну что это за херня, Карл?
if (length > 99)
{
length = 99;
memcpy(aliasbuffer, alias.c_str(), length);
aliasbuffer[length] = 0;
}
else
aliasname = alias.c_str();
}
else
aliasname = "<unnamed>";
Самое грустное — в IBProvider до сих пор присутствует подобный код. Хотя я последние несколько лет веду упорную борьбу с этими багами.
Вот кто бы лет двадцать назад сразу объяснил что так делать нельзя 🙁
Dmitry Kovalenko on 11 февраля, 2017 | 1 Comment
В настоящее время идет достаточно злобная массированная ревизия и переработка относительно старого кода, связанного с управлением OLE DB свойствами.
В процессе обнаруживаются баги, дыры и костыли. Про первое и второе говорить особо смысла нет. А вот про третье — можно 🙂
Удалено свойство инициализации «free_threading«, которое влияло на значение информационного свойства «Data Source Object Threading«.
(далее…)
Все начиналось достаточно безобидно — я поправил в описании информационного свойства «Maximum Row Size» значение с 65536 на 65565.
Потом сообразил, что надо бы поправить эту константу в коде IBProvider.
Потом пришла мысль, которая должна была прийти в самом начале — «надо бы посмотреть на сайте FB». Посмотрел.
Maximum row size = 64KB
Maximum number of columns per table = Depends on data types used. (Example: 16,384 INTEGER (4-byte) values per row.)
А потом решил таки проверить все это самому на Firebird 3.0.2.32651.
(далее…)
Dmitry Kovalenko on 21 января, 2017 | 1 Comment
Что-то я увлекся и перестал следить за состоянием FB3.
Выложено очередное обновление IBProvider — версия 3.36
Примечательно, что сегодня стукнуло 17 лет с начала разработки этой штуковины. Хорошо помню что и в каком (ужасном) виде было создано в первые дни.
Что касается новой версии, то за кулисами осталась безуспешная попытка создать «суперпровайдер», то есть DLL с самостоятельно живущими потоками. К сожалению, выгрузка DLL ведет себя непредсказуемым образом и не получается реализовать корректную остановку потоков.
Так что, все оставлено как было — после освобождения последнего COM-объекта в DLL прекращается любая фоновая активность.
Жаль.
На сайт выгружена новая сборка IBProvider (3.36.0.24718), в которой сделано небольшое, но важное изменение — задействована системная функция DisableThreadLibraryCalls.
Это немного улучшает работу IBProvider в многопоточных процессах (провайдер сам по себе многопоточный), но говорит «до свидания» Windows 2000, в которой данная функция не поддерживается.
Поскольку последний раз про поддержку Windows 2000 спрашивали много лет тому назад, я думаю эта платформа уже не актуальна.
До кучи, раз уж провайдер попрощался с Windows 2000, я удалил проектные файлы для VS2008. С VS2005 я попрощался уже очень давно.
Visual Studio 2010 пока поддерживается — многие клиенты предпочитают сборки именно этой студии. По всей видимости из за Windows XP.
В настоящее время основным компилятором является VC14 (VS2015), а основное тестирование выполняется на 64-битных Windows 7 и Windows 10.
Free IBProvider теперь, как и основные версии (Prof, Lite), распространяется в виде MSI-пакета.
Сегодня стукнул год с момента выпуска провайдера с собственным клиентом для FB.
После таких релизов обычно накрывает страх не удержать темп или, что еще хуже — начать считать что лучше уже не сделать 🙂
Но пока страхи не оправдываются и за прошедший год были сделаны две ключевые вещи:
1. Наконец-то побеждены VARCHAR-массивы.
2. Реализован собственный клиент для FB3
И в настоящий момент закрывается третья большая тема — (предварительная) реорганизация фундамента кодовой базы провайдера, который был заложен еще в самом начале 2000-ых. Для проекта с объемом порядка 20MB кода — это реально подвиг.
Конечным пользователям эти изменения, конечно, до лампочки. Но для проекта это достаточно важный этап, который позволит еще с десяток лет развиваться c текущими темпами. Это, конечно, если сил хватит 🙂
Надеюсь, что успею до конца года все закончить и выложить релиз v3.35.
При сравнении относительно больших файлов в Araxis Merge вылазит окно:
Пять лет не напрягало, а тут внезапно стало задалбывать. Написал в поддержку и получил следующую инструкцию:
- Открываем ветку реестра «HKEY_CURRENT_USER\SOFTWARE\Araxis\Merge\7.0»
- Меняем значение параметра LargeFileThreshold. Я у себя поставил значение FFFFFFFF.
Работает.
Там хорошо, где нас нет …
Проснувшись ближе к вечеру (утром задолбала попа Грамота), открыл хабр и тупо стал созерцать картинку к топику про патчи к PostgreSQL:
Набрал в поиске «element_alloc(HTAB *hashp, int nelem, in freelist_idx)» и вышел на файл postgrespro/postgres_cluster/blob/master/src/backend/utils/hash/dynahash.c.
Реально — используют int для nelem и freelist_idx.
Посмотрел что там дальше, после картинки — «есть основания полагать, что данные патчи будут интересны новичкам«.
А, ну понятно — это экскурсия для детей.