Пятничное
Накатал тест, проверяющий поведение результирующего (обновляемого) множества IBProvider-a в случае сбоя операции, манипулирующей полугигабайтным блобом. 10 попыток.
Смутно представляю что там внутри работает, но график получился забавный.
Накатал тест, проверяющий поведение результирующего (обновляемого) множества IBProvider-a в случае сбоя операции, манипулирующей полугигабайтным блобом. 10 попыток.
Смутно представляю что там внутри работает, но график получился забавный.
В новой сборке доступна новая фича в виде поддержки OUT-параметров в запросах для добавления новых записей «обновляемых» множеств. Это значит что теперь можно использовать «INSERT … RETURNING … INTO» для перечитывания значений колонок новых записей множества.
Пользуясь случаем, хочу передать привет самому себе. Пять лет прошло, Карл. Пять лет.
Фича пока доступна только для запросов, явно указанных в свойстве набора рядов «insert_sql».
Для демонстрации работоспособности этой штуки, предлагаю посмотреть следующий небольшой пример на VBScript и ADODB. Давно я на этой паре ничего не писал 🙂
(далее…)
В последних сборках Firebird 3.0.4 (у меня сейчас стоит 3.0.4.32952) разрешили использование символа ‘\r’ в качестве переноса строки. Что привело к рассогласованию парсера запросов Firebird и IBProvider.
В целом, проблема ничтожная. Но она напомнила о старой мысли ужесточить ограничение на максимально поддерживаемые версии серверов (FB/IB). Во избежание.
С одной стороны идея плохая. Потому что возникают риски, которые не хочется озвучивать вслух.
А с другой стороны, провайдер не будет работать якобы «неправильно». Ну и, конечно, появится «напоминание» о том, что пора обновить провайдер.
Надо подумать.
IBProvider v3.50 вышел на финишную прямую. По крайней мере, мне так кажется. В новой тестовой сборке (28330), доступной для скачивания с сайта, обновлена обработка ошибок.
Первое. Наконец-то, реализована нормальная поддержка предупреждений. Предыдущий код «забывал» их в случае возникновения критической ошибки.
Второе. В операциях с массовой генерацией предупреждений и ошибок, при превышении жестко заданного лимита на их количество (128 штук), добавляется сигнальное сообщение о том, что часть сообщений будет проигнорирована. Раньше провайдер начинал молча игнорировать ошибки сверх нормы.
—
Сейчас по плану добавление поддержки «INSERT … RETURNING» в обновляемых множествах. Собственно сам код этой поддержки уже написан. Нужно выспаться запилить тесты. Много тестов. Жестоких.
И наступит гармония и умиротворенность.
Последнюю пару месяцев я настолько активно мучал «Araxis Merge», что даже засылал его разработчикам «feature requests».
В последней выпуске (2018.4988) одна их хотелок была удовлетворена — появилась возможность открывать окно «Windows Expolorer» с расположением сравниваемого файла/каталога.
Однако пост не про это. А про то, как запускать этого сравнивателя из «Total Commander» для объектов, выбранных в левой и правой панели. Я это сделал через кнопку на панели инструментов:
1. Щелкаем в тотале на панели инструментов правой кнопкой мыши.
2. Выбираем «Change …».
3. Указываем расположение файла Merge.exe — «C:\Program Files\Araxis\Araxis Merge\Merge.exe».
4. Пишем параметры запуска — %X%P%S %T%R.
5. Закрываем окно настройки кнопки по «OK».
Все, теперь выбираем что будем сравнивать в левой и правой панели и жмем на нашу кнопку запуска Merge.exe.
Должно работать.
На сайт IBProvider загружен новый триал OLE DB провайдера — v3.50.0.28072, в котором исправлена структурная ошибка внутреннего представления данных из за которой были специфические затруднения с модификацией базы данных.
Суть проблемы заключалась в том, что провайдер не умел корректно обрабатывать DEFAULT-значения (они обрабатывались как NULL-значения). Для этого нужно было вместо пары {value, IsNull} работать с парой {value, Status}.
В новой сборке это досадное ограничение устранено и теперь IBProvider умеет передавать состояние данных через все свои слои — от верхнего до нижнего.
В самом низу с DEFAULT-значениями умеет работать только Firebird 2.5+ (и то очень ограничено). В FB2.5 появилась поддержка запроса:
INSERT INTO ... DEFAULT VALUES
Вот этот запрос теперь и используется при добавлении новых записей в «обновляемых» множествах.
На примере работы с провайдером через связанных сервер MSSQL это выглядит так: (далее…)
В задумчивости тыкая в интерфейсе «OLE DB Rowset Viewer» (это стандартная штука для проверки провайдеров «руками и глазами»), запросил неправильный интерфейс результата и спровоцировал ассерт внутри ICommand::Execute. Релизный бинарник, как положено, возвращает E_NOINTERFACE.
Изучение этой проблемы показало, что ассерт был по делу — FAILED-ошибки (типа E_NOINTERFACE) должны обрабатываться другой веткой кода, в которой (до кучи) освобождаются сформированные значения OUT-параметров.
То есть, получалось, что ICommand::Execute возвращал OUT-параметры и FAILED-код. Это вполне могло приводить к тому что клиент, видя FAILED-ошибку, мог забить на освобождение значений OUT-параметров. А это, в свою очередь, приводит к утечке ресурсов.
Вот такая вот головоломка.
А все почему — не были написаны тесты, проверяющие реакцию ICommand::Execute на неправильные параметры.
Так что пришлось, ругаясь, устранять проблему, создавать необходимые тесты и выпускать незапланированное обновление IBProvider — v3.49.1.
Обнаружил интересное обсуждение — «Не используйте дети malloc в Windows 10».
Вкратце — похоже в Win10 поломали кучи и теперь они глючат в многопоточных приложениях.
Попробовал — действительно падает.
При Обаме Балмере такого не было!
Загружены бинарные файлы второго обновления IBProvider в текущем году (во завернул) — v3.49.0.27783.
Изменения.
1. Запрещено использование DBBINDING с типами DBTYPE_EMPTY, DBTYPE_NULL.
2. Задействованы коды ошибок DB_E_UNSUPPORTEDCONVERSION, DB_E_BADSTATUSVALUE, DB_E_BADTYPE.
3. Уборка мусора в коде. Проводил в последний путь корзину файл с утилитами, созданный в 2000 году. Даже немного взгрустнулось.
4. Продолжил избавляться от использования классов, порожденных от std::ostream, std::istream.
5. Устранил баги и странный код, обнаруженные PVS-студией.
6. Ревизия и нормализация кода.
В целом, текущий выпуск это всего лишь подготовительный этап к следующей четвертой версии (3.50), в которой будет обновлен базовый компонент провайдера — структура DBVARIANT.
UPD [2018-03-15]. Опубликованы новости на сайте.
Привет всем.
Пару месяцев назад обратил внимание, что 64-битный бинарник IBProvider-а (собранный в 2017-ой) внезапно потяжелел на полторы сотни килобайт. Я еще подумал — «это с какого перепугу произошло?». Было сильное подозрение, что «это» произошло после очередного обновления студии, но так и не проверил.
Сегодня обновил 2017-ю студию до версии 15.6.1 и вижу следующее:
Наверное, к лету.