Обновление ADO.NET провайдера — v1.7

Привет всем.

С сайта IBProvider и с nuget.org можно загрузить обновленный ADO.NET провайдер — v1.7.

Изменения минимальны — синхронизация с поведением текущей версии IBProvider v3.50 в плане кодов ошибок. Плюс немного доработаны тесты.

В остальном — все без изменений. Пока в этом нет никакой необходимости.


Полтора года назад разочаровался в EF v6. Это реально адское поделие жителей Индии.

Теперь вот linq2db разочаровал — у него какая-то корявая работа с провайдерами. Два месяца на него убил.

Осталось посмотреть EF.Core.

Вести с полей

Привет всем.

1. Сегодня наконец-то снова загрузился в Windows со 128GB на борту. Шесть Семь месяцев долбежа (хотя по ощущениям — прошла бесконечность). Будем посмотреть.

Из радикальных изменений — отключил HT у процессора. При компиляции в 20 потоков эпизодически вылазил синий экран. На msdn ищите «Перегружается компьютер 6950x» (нашел, сейчас открывается только в Edge).

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

2. Залез под ногу монитора, где лежит бумажка с проклятьями приветами из прошлого. Последняя запись от 2017-09-02 с печалью по поводу необходимости перетряхнуть 3MB исходного кода на C++. На это ушло 8 месяцев, что согласуется с производительностью 4MB/год.

Значит, я еще пока в форме 🙂

Новый триал IBProvider v3.50 (сборка 28609)

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

По умолчанию перечитывание не осуществляется. Для включения этой поддержки, нужно указать в строке подключения server_data_back_read=3.

Эта штука требует поддержки со стороны сервера. Максимально полная поддержка есть в FB2.5+.

Теоретически, перечитывание можно можно сделать с помощью хранимых процедур с OUT-параметрами. Для этого нужно руками заполнить значения свойств insert_sql, update_sql. Вызовы должны быть в ODBC-стиле: «{call SP( /*in*/ :NEW.COLUMN_NAME, /*out*/ :COL.COLUMN_NAME)}».

В целом, новая сборка вызывает настолько положительные эмоции, что даже мои тараканы в голове (которые из-за всех сил тормозили весь этот процесс, придумывая всякие изощренные проблемы) шепчут — «нужно обмыть».

UPD [2018-05-08]. Выпущена в релиз.

BLOB not found

Пешите тесты.

Соорудил замечательный тест (FB3):
1. Добавляем запись с блобом
2. Выбираем эту запись select-ом
3. Изменяем BLOB этой записи update-ом
4. Пытаемся прочитать BLOB, полученный в пункте (2)
5. Получаем %subj% — «BLOB not found»

Ну да, понятно — сервер агрессивно удаляет блобы. Приятно, что я сообразил что к чему. Практически сразу. Через полчаса.

Как такое лечить при работе через IBProvider?

Нужно указать deferred_data=0 в строке подключения. Это заставит провайдер загружать все косвенные данные (блобы, массивы) сразу, а не по требованию.

Пятничное

Накатал тест, проверяющий поведение результирующего (обновляемого) множества IBProvider-a в случае сбоя операции, манипулирующей полугигабайтным блобом. 10 попыток.

Смутно представляю что там внутри работает, но график получился забавный.

Новый триал IBProvider v3.50 (сборка 28476)

В новой сборке доступна новая фича в виде поддержки 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» к «Total Commander»

Последнюю пару месяцев я настолько активно мучал «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 v3.50.0.28072

На сайт 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 это выглядит так: (далее…)