Всем привет.
Добавил новый пример с демонстрацией «правильного» способа создания базы данных через .NET провайдер.
Первые 15 минут радовался — вот какой я молодец. А потом задумался. Вообще, с технологической точки зрения, «круто» было бы выполнять подобный CREATE DATABASE через команду. И этот «запрос» инициализировал бы родительский источник данных.
До кучи можно было бы еще и CONNECT аналогичным образом оформить.
OLEDB провайдер, то есть IBProvider, такое извращение скорее всего выдержит. А вот .NET провайдер вряд ли….
С пятницей.
Сто лет назад, в 2006, я озвучивал вслух мысль о том что «было бы неплохо иметь возможность получать информацию о сервере базы данных до подключения к самой базе данных». Сейчас, в рамках прямого подключения к FB через TCP/IP, в принципе можно сказать к какой версии FB мы подключаемся — на основе версии протокола, которая согласуется с сервером до подключения к базе данных. В ISC API, для аналогичного трюка, нужно разделить isc_attach_database на две функции — connect_to_server и attach_database. Первая подключается к серверу, вторая к базе данных. После подключения к серверу нужно разрешить выполнять isc_database_info для получения версии протокола.
А вообще хотелось бы, после подключения к серверу, получать данные для isc_info_firebird_version (id: 103).
В рамках этих мыслей провел два эксперимента с FB 2.5.x.
(далее…)
Затеял написать парсер строки с расположением базы данных при подключении к серверу через TCP/IP (INET).
Полез в исходники сервера (FB 2.5.x):
bool ISC_analyze_tcp(tstring& file_name, tstring& node_name)
{
/**************************************
*
* I S C _ a n a l y z e _ t c p ( G E N E R I C )
*
**************************************
*
* Functional description
* Analyze a filename for a TCP node name on the front. If
* one is found, extract the node name, compute the residual
* file name, and return true. Otherwise return false.
*
**************************************/
// Avoid trivial case
if (!file_name.hasData())
return false;
/* Scan file name looking for separator character */
node_name.erase();
const size p = file_name.find(INET_FLAG);
if (p == npos || p == 0 || p == file_name.length() - 1)
return false;
node_name = file_name.substr(0, p);
#ifdef WIN_NT
/* For Windows NT, insure that a single character node name does
not conflict with an existing drive letter. */
if (p == 1)
{
const ULONG dtype = GetDriveType((node_name + ":\\").c_str());
// Is it removable, fixed, cdrom or ramdisk?
if (dtype > DRIVE_NO_ROOT_DIR && (dtype != DRIVE_REMOTE || Config::getRemoteFileOpenAbility()))
{
// CVC: If we didn't match, clean our garbage or we produce side effects
// in the caller.
node_name.erase();
return false;
}
}
#endif
file_name.erase(0, p + 1);
return true;
}
Из штатного алгоритма видим, что (в случае Windows) проблема только с однобуквенным именем хоста — возможен конфликт с именем локального диска. Если честно, мне раньше и в голову не приходила мысль давать компьютеру имя из одной буквы. Наверное, потому что я еще ни разу не писал подобный парсер.
Нашел вот такой документ — «Connection to the sample database». Из которого узнал, что в Linux локальный путь к базе данных может начинаться с символа ‘/’ — «servername:/filesystem-path/database-file». То есть, формально, строка «с:/windows/system32/cmd.exe» может быть интерпретирована как путь к локальному файлу в Windows, так и к сетевому ресурсу на Linux (хост «C», ресурс «/windows/system32/cmd.exe»).
Вот сижу теперь и думаю — наверное не зря все таки придумали всякие префиксы «http://», «ftp://».
Был бы формат «inet://host:local_path», и не было бы никакой неоднозначности.
Уверен, что я не первый кто про это подумал 🙂
Привет всем.
Доступен для скачивания новый триал IBProvider’a — 3.22.0.17404.
— Восстановлена возможность подключения к IB4, IB5. В последнем релизе я слишком сильно закрутил гайки. Почему-то вспомнился второй сервис пак для XP, который (в чистом виде) не работал на Intel Prescott.
— Исправлена очередная группа древних замысловатых багов. Выявлены новой тестовой системой, тестирующей прямое подключение к Firebird через TCP/IP. Эти тесты не то чтобы парализовали движение вперед, но как-то очень сильно его затормозили… Пока все топчусь на этапе инициализации подключения. Черт, третий месяц уже. Правда тестов уже не 3, а 83.
— Добавлено новое информационное свойство «IB Database ODS Version», которое публикует версию ODS в виде строки «major_num.minor_num». Свойства «IB ODS Version» и «IB ODS Minor Version» помечены как устаревшие.
Хотел попросить тебя задарить мне в этом году Xeon. 10 ядерный.
Я хорошо себя вел в прошлом году, честное пионерское. Старался, по-крайней мере.
Но почитав fb-devel, решил — ладно, я подожду.

Компиляция FB3 на нетбуке.
Привет всем.
Сегодня закончил(?) работу над очередным выпуском IBProvider-а и .Net провайдера. Это будет продолжение немного затянувшегося исправления ошибок и переписывания старого плюсового кода с реализацией корявых конструкций на самом нижнем, инфраструктурном уровне, созданных в период бурной молодости 🙂 Такого осталось уже совсем немного.
Основное изменение в .Net провайдере — запрет неявного коммита «вложенных» транзакций. Добил затеянное два с половиной года назад. Вернуть старое поведение можно через новое (специализированное) свойство строки подключения «NetProv: NestedTransRules». Допустимые значения перечислены в OleDbPropertiesVaules.NetProvider.NestedTransRules (обожаю эти километровые имена).
Ну и под занавес, я освоил создание NuGet-пакетов (Задача элементарная, по сравнению с нормальным инсталлятором. Но сутки я на неё все равно угробил.). Так что наш Ado.Net провайдер теперь можно загружать и с NuGet.org. В пакет включены релизные сборки провайдера (под все версии FW) и PDB файлы. Пользуясь случаем передаю привет Ксении Кузнецовой, которая год назад предложила эту затею.
Всем привет.
Соорудил новый пример по работе с массивами через .NET провайдер.
С горечью могу констатировать факт — всю жизнь стремился создать профессиональную библиотеку для высокоуровневой работы с FB/IB на C++, а создал её на C#.
Доступен для скачивания новый триал IBProvider-a. Будет работать до 20 января 2015-го.
За это время, я думаю, будет выполнено избычное полное тестирование сборок. Кстати, тестирование идет с FB2.5, собранным 2013 студией. Модифицированным, конечно.
Все изменения в провайдере — внутренние:
— Увеличена надежность алгоритмов, работающих с памятью.
— Улучшена обработка ошибок.
Как показывает практика — кругом засады. Поэтому приходится перестраховываться по-полной.
(далее…)
Dmitry Kovalenko on 30 декабря, 2014 | 1 Comment
Привет всем!
2014 был (по крайней мере, для меня лично) весьма забавным годом — догнало все и сразу 🙂
Хочется сказать ОГРОМНОЕ спасибо (THANKS!), всем кто покупал лицензии на IBProvider и пожелать им в Новом Году только самое лучшее.
Ну а кто не купил — горите в Аду вас тоже с наступающим 🙂
Коваленко Дмитрий.
Yes, ofcourse. Define in connection string the «nested_trans=true». News.
А чем вы занимались 9 лет и 9 месяцев тому назад? 🙂