Вести с полей

Привет всем.

1. Обладатели лицензий могут скачать из личного кабинета очередной релиз IBProvider — v3.25.1.18333.

2. Начиная с прошлого четверга начато постепенное тестирование работы IBProvider-a через нового клиента. На текущий момент устранены выявленные огрехи (тестам и ассертам — СЛАВА!). Сегодня ночью проехал достаточно агрессивный набор нагрузочных тестов, проверяющий работу с результирующими множествами. Ошибки были очень интеллигентные. Типа:

1. [LCPI.IBProvider.3]: [winsock] Сбой записи данных в порт подключения. Ошибка WinSock: 10054.
2. [LCPI.IBProvider.3]: Ошибка подтверждения транзакции. Транзакция будет отменена.
3. [LCPI.IBProvider.3]: [Подсистема: remote_fb.inet] Запись в порт невозможна. Предыдущая операция записи завершилась с ошибками.
4. [LCPI.IBProvider.3]: Ошибка отката транзакции.

Что там случилось — я не знаю. В следующий раз оставлю сервер (2.5.5.26942) под отладчиком.

3. Пока не утвержден, но сформулирован следующий план выпуска IBProvider:
— Недели через две будет выпущена версия 3.26, в которую попадут все исправления сделанные в рамках интеграции нового клиента.
— Постараемся одновременно с 3.26 выложить триал 3.27 с новым клиентом.
— Две-три недели будет идти нагрузочное и прочее тестирование. Потому что реально страшно 🙂
— Потом будет релиз 3.27 с новым клиентом.

То есть, при даже благополучном стечении обстоятельств, финиш будет не раньше 20-ых чисел декабря.

Вести с полей

Привет всем.

На днях завершился процесс разработки низкоуровневого клиента для Firebird 2.5 (INET, все типы и режимы 12-го протокола). Так что на вопрос «асилю или нет?» ответ положительный.

В настоящий момент уже начался процесс интеграции с основным кодом IBProvider-a. Уже даже входит и выходит можно подключаться и отключаться.

Риск наткнуться на какую либо реально серьезную проблему — минимален. Сейчас основная сложность с придумыванием базовых названий для конструкций и файлов.

Лично я очень надеюсь, что в течении этой недели будут реализованы все необходимые переходники и можно будет начинать использовать основную тестовую систему IBProvider.

Эволюция базового интерфейса

На самом нижнем уровне IBProvider и всех моих остальных, более менее крупных, проектов на С++ лежит единый базовый класс с парой методов — add_ref и release, управляющих счетчиком ссылок на объект.

Судя по истории репозитария (CVS), который был запущен 21 декабря 2000 года, этот класс появился раньше. Наверное, где-то в районе конца 99-го или начала 2000-го кода.

Забавно посмотреть на этапы эволюции этой конструкции, лежащей в основе всей архитектуры.
(далее…)

Про исключения

В качестве зарядки посмотрел выступление парня из Яндекса. Там половину времени занимает описание причин «почему не используются исключения». По мне — херня какая-та.

Но мысль появилась и я полез в исходники FB, посмотреть на один из моих любимых деструкторов:

Semaphore::~Semaphore()
{
 if (hSemaphore && !CloseHandle(hSemaphore))
  system_call_failed::raise("CloseHandle");
}

До сих пор не исправлен. Потому что:

Профессор Преображенский. Facepalm.
Мы должны знать о системном сбое незамедлительно!

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

Всем привет.

Выложен новый триал OLE DB провайдера, в который внесены следующие исправления и изменения, связанные с массивами:

1. Исправлено формирование многомерных массивов. Внезапно обнаружилось, что IBProvider формирует описания размерностей не в том порядке. В результате сервер и провайдер по-разному вычисляют расположения элементов.

2. После очередного размышления над багой Firebird CORE-1588 (у InterBase аналогичная болезнь), пришел к выводу что на текущий момент самым правильным решением будет обрабатывать VARCHAR-массивы как CHAR-массивы. Это устранило костыли в коде IBProvider-а и принесло в мою душу гармонию и умиротворенность.

Чтобы два раза не вставать, похоже я нашел способ решения этой баги, но он достаточно тяжеловесный — нужно самостоятельно формировать и обрабатывать блоб с массивом. Возможно когда-нибудь запилю.

На уровне сервера эта проблема решается определением двух новых API-функций для записи и чтения массивов, которые будут правильно обрабатывать SDL-описание. Как выяснилось — в саму базу VARCHAR-массивы пишутся правильно. Надо будет, в качестве эксперимента, попробовать реализовать это в собственном клоне FB.


Вот такие вот дела. Все это побочный эффект реализации и тестирования сохранения массивов через собственный низкоуровневый INET-клиент для Firebird.

Релиз IBProvider-а (3.25) будет после реализации чтения массивов в этом низкоуровневом клиенте. Сегодня планирую начать тупить возиться в этом направлении.

Visual Studio 2015

Привет всем.

Чуть больше месяца назад поставил себе Visual Studio 2015 Community Edition и перевел на неё основные проекты: IBProvider, ADO.NET провайдер и тестовый проект собственного клиента к FB2.5 (в основном вожусь с ним). Ну и свой клон Firebird 2.5, тоже перевел. Не без спотыканий.
(далее…)

.Net provider для FW 4.6 [VS2015]

Привет всем.

Пересобрал .Net провайдер под Framework 4.6. Дистрибутив можно скачать, как обычно, с сайта IBProvider и nuget.org. Полный список поддерживаемых версий FW выглядит так: 3.5, 4.0, 4.5, 4.5.1 и 4.6. В природе еще существует FW 4.5.2, но я решил его пропустить.

Естественно, помимо самого провайдера, собран и DDEX провайдер для Visual Studio 2015.

Обновлен Free IBProvider. Теперь и для FB3, IB XE7.

Решил добавить свежей воды в болото памяти под названием «Firebird и InterBase». В виде обновленного Free IBProvider, в который добавлена поддержка всех текущих версий FB/IB. В том числе для FB3 и IB XE7.

Сказано — сделано.

Формат сетевых пакетов.

Медленно и печально продолжаю пилить собственную реализацию сетевого клиента к Firebird.

На днях реализовал выполнение запросов с IN-параметрами. Чертыхнулся, но сумел реализовать отправку пакета (op_execute) опираясь только на собственные данные пакета. В оригинале (fbclient.dll) при отправке этого пакета внезапно начинают лезть к объекту запроса. :facepalm: да и только.

Начал реализацию поддержки запросов с OUT-параметрами… Пока только начал. Но уже появилась мысль:

«Если меня вдруг угораздит проектировать подобные конструкции для обмена данными, то пакет будет включать информацию о своем размере. А еще лучше — размер будет находиться в самом начале пакета.»

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

Асинхронная загрузка. Тест

Соорудил небольшой тест, сравнивающий производительность асинхронной и синхронной загрузки. Для разнообразия, в цикле выборки данных реализована модификация результирующего множества.

Конфигурация:
— Серверная машина: Q6600, 8GB, RAID0 из 4HDD, FB 2.5.4 SuperClassic
— Клиентская машина: Core i7, 16GB, SSD.
— Гигабитная сеть.

Тестировался 64-битный IBProvider.

Сразу озвучу результат — наблюдались устойчивые тридцать процентов ускорения работы.
(далее…)