Обновил сборки всех компонент, отгружаемых пользователям.
ADO.NET провайдер v1.7.2.3437
Самым интересным аспектом этого обновления является привязка к инструментальной библиотеке (lcpi.lib, 2.1.1.1665) от предыдущего обновления . В дистрибутивы также включены бинарники и PDB из предыдущего обновления.
Это отработала самописная спец. приблуда процесса формирования дистрибутивов и nuget-пакетов, которая увидела, что версия lcpi.lib не поменялась и подсунула старые модули из спец. хранилища.
В общем, процесс построения дистрибутивов и пакетов ADO.NET провайдера стал более чем нетривиальным. Но полностью автоматизированным — на входе исходники, на выходе MSI, EXE, NUPKG.
(далее…)
С пятницей!
Неделю назад запустил окончательное тестирование своего триллиона битиков оперативной памяти — самую большую группу тестов основной тестовой системы IBProvider-а (blob*). Их там 6713994 штук. В десять потоков. База на RAM диске (80GB).
Не знаю как оно закончится.
Но уже сейчас можно сказать — поставлен своеобразный рекорд, недостижимый на моем предыдущем десктопе с Q6600/8GB.
Проехало 3.7 млн тестов.
Один раз комп ложился баиньки на несколько часов — отключали электричество.
Ошибок нет. База опухла до 38.6GB.
Статистика базы выглядит так:
Database "D:\DATABASE\RAM\IBP_TEST_FB30_D3_2.GDB"
Gstat execution time Fri May 25 15:27:30 2018
Database header page information:
Flags 0
Generation 11273707
System Change Number 0
Page size 16384
ODS version 12.2
Oldest transaction 11272850
Oldest active 11272851
Oldest snapshot 11272838
Next transaction 11272867
Sequence number 0
Next attachment ID 11219
Implementation HW=AMD/Intel/x64 little-endian OS=Windows CC=MSVC
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 3
Creation date Apr 18, 2018 23:07:38
Attributes
Variable header data:
*END*
Gstat completion time Fri May 25 15:27:30 2018
FB 3.0.4.32972 SS x64 (Windows).
IBProvider — 3.50 x64.
Через неделю будет окончательный диагноз 🙂
Не приходя в сознание, запилил каркас провайдера для EntityFrameworkCore, через который получилось выполнить по настоящему интересную штуку:
public static class Test_001
{
public class MyContext:DbContext
{
public DbSet<DUAL> table_DUAL { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLcpiOleDbFirebird
("provider=LCPI.IBProvider.3;"
+"location=inet4://localhost/d:\\database\\ram\\ibp_test_fb30_d3.gdb;"
+"user id=GAMER;"
+"password=vermut;"
+"dbclient_type=fb.direct;"
+"auto_commit=true");
}//OnConfiguring
[Table("DUAL")]
public class DUAL
{
public int ID { get; set; }
};//class DUAL
};//class MyContext
[Test]
public static void Test_01()
{
using(var db=new MyContext())
{
foreach (var rec in db.table_DUAL)
{
Console.WriteLine("ID: {0}",rec.ID);
}
}//using
}//Test_01
};//class Test_001
Теперь можно включать спинной мозг для дополнительной разведки местности.
И мне уже кажется, что UseLcpiOleDbFirebird нужно сократить до UseLcpiOleDb. Потому что, скорее всего получится соорудить универсальный провайдер как для Firebird, так и для InterBase.
Привет всем.
С сайта 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/год.
Значит, я еще пока в форме 🙂
В новой сборке реализована полноценная поддержка перечитывания данных обновляемых множеств. И для новых рядов и для модифицируемых рядов.
По умолчанию перечитывание не осуществляется. Для включения этой поддержки, нужно указать в строке подключения 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]. Выпущена в релиз.
Пешите тесты.
Соорудил замечательный тест (FB3):
1. Добавляем запись с блобом
2. Выбираем эту запись select-ом
3. Изменяем BLOB этой записи update-ом
4. Пытаемся прочитать BLOB, полученный в пункте (2)
5. Получаем %subj% — «BLOB not found»
Ну да, понятно — сервер агрессивно удаляет блобы. Приятно, что я сообразил что к чему. Практически сразу. Через полчаса.
Как такое лечить при работе через IBProvider?
Нужно указать deferred_data=0 в строке подключения. Это заставит провайдер загружать все косвенные данные (блобы, массивы) сразу, а не по требованию.
Накатал тест, проверяющий поведение результирующего (обновляемого) множества IBProvider-a в случае сбоя операции, манипулирующей полугигабайтным блобом. 10 попыток.
Смутно представляю что там внутри работает, но график получился забавный.
В новой сборке доступна новая фича в виде поддержки OUT-параметров в запросах для добавления новых записей «обновляемых» множеств. Это значит что теперь можно использовать «INSERT … RETURNING … INTO» для перечитывания значений колонок новых записей множества.
Пользуясь случаем, хочу передать привет самому себе. Пять лет прошло, Карл. Пять лет.
Фича пока доступна только для запросов, явно указанных в свойстве набора рядов «insert_sql».
Для демонстрации работоспособности этой штуки, предлагаю посмотреть следующий небольшой пример на VBScript и ADODB. Давно я на этой паре ничего не писал 🙂
(далее…)
Dmitry Kovalenko on 25 апреля, 2018 | 1 Comment
В последних сборках Firebird 3.0.4 (у меня сейчас стоит 3.0.4.32952) разрешили использование символа ‘\r’ в качестве переноса строки. Что привело к рассогласованию парсера запросов Firebird и IBProvider.
В целом, проблема ничтожная. Но она напомнила о старой мысли ужесточить ограничение на максимально поддерживаемые версии серверов (FB/IB). Во избежание.
С одной стороны идея плохая. Потому что возникают риски, которые не хочется озвучивать вслух.
А с другой стороны, провайдер не будет работать якобы «неправильно». Ну и, конечно, появится «напоминание» о том, что пора обновить провайдер.
Надо подумать.