Новый триал IBProvider [сборка 25055]

В новый триал (v3.38.0.25055) внесены следующие изменения и исправления:

1. Реализован контроль длин названий объектов в XSQLVAR (relname_length, sqlname_length, aliasname_length). До этого было обрезание при превышении максимального значения (32 или 68 байт) и обнуление отрицательного значения. Так что если серверный клиент вернет в этих полях некорректное значение, то теперь провайдер будет ругаться.
(далее…)

Про обрезания

Сегодня один наш турецкий друг прислал замечательную ошибку, полученную при работе через собственный 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 до сих пор присутствует подобный код. Хотя я последние несколько лет веду упорную борьбу с этими багами.

Вот кто бы лет двадцать назад сразу объяснил что так делать нельзя 🙁

Новый триал IBProvider [3.37.0.24894]

В настоящее время идет достаточно злобная массированная ревизия и переработка относительно старого кода, связанного с управлением OLE DB свойствами.

В процессе обнаруживаются баги, дыры и костыли. Про первое и второе говорить особо смысла нет. А вот про третье — можно 🙂

Удалено свойство инициализации «free_threading«, которое влияло на значение информационного свойства «Data Source Object Threading«.
(далее…)

FB3. Max Row Size

Все начиналось достаточно безобидно — я поправил в описании информационного свойства «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.
(далее…)

Пора перегружать …

Что-то я увлекся и перестал следить за состоянием FB3.

FB3 Super Server Memory Leaks
За шесть дней набежало.

Релиз IBProvider v3.36

Выложено очередное обновление IBProvider — версия 3.36

Примечательно, что сегодня стукнуло 17 лет с начала разработки этой штуковины. Хорошо помню что и в каком (ужасном) виде было создано в первые дни.

Что касается новой версии, то за кулисами осталась безуспешная попытка создать «суперпровайдер», то есть DLL с самостоятельно живущими потоками. К сожалению, выгрузка DLL ведет себя непредсказуемым образом и не получается реализовать корректную остановку потоков.

Так что, все оставлено как было — после освобождения последнего COM-объекта в DLL прекращается любая фоновая активность.

Жаль.

Новый триал IBProvider [сборка 24718]

На сайт выгружена новая сборка 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.

MSI инсталлятор для Free IBProvider

Free IBProvider теперь, как и основные версии (Prof, Lite), распространяется в виде MSI-пакета.

Вести с полей

Сегодня стукнул год с момента выпуска провайдера с собственным клиентом для FB.

После таких релизов обычно накрывает страх не удержать темп или, что еще хуже — начать считать что лучше уже не сделать 🙂

Но пока страхи не оправдываются и за прошедший год были сделаны две ключевые вещи:
1. Наконец-то побеждены VARCHAR-массивы.
2. Реализован собственный клиент для FB3

И в настоящий момент закрывается третья большая тема — (предварительная) реорганизация фундамента кодовой базы провайдера, который был заложен еще в самом начале 2000-ых. Для проекта с объемом порядка 20MB кода — это реально подвиг.

Конечным пользователям эти изменения, конечно, до лампочки. Но для проекта это достаточно важный этап, который позволит еще с десяток лет развиваться c текущими темпами. Это, конечно, если сил хватит 🙂

Надеюсь, что успею до конца года все закончить и выложить релиз v3.35.

Сравнение больших файлов в Araxis Merge

При сравнении относительно больших файлов в Araxis Merge вылазит окно:

The files you are about to compare are very large. Are you sure that you want to open a comparison window for them?

Пять лет не напрягало, а тут внезапно стало задалбывать. Написал в поддержку и получил следующую инструкцию:

  1. Открываем ветку реестра «HKEY_CURRENT_USER\SOFTWARE\Araxis\Merge\7.0»
  2. Меняем значение параметра LargeFileThreshold. Я у себя поставил значение FFFFFFFF.

Работает.

« Предыдущие записи