Создание базы данных через ADO.NET провайдер.

Всем привет.

Добавил новый пример с демонстрацией «правильного» способа создания базы данных через .NET провайдер.

Первые 15 минут радовался — вот какой я молодец. А потом задумался. Вообще, с технологической точки зрения, «круто» было бы выполнять подобный CREATE DATABASE через команду. И этот «запрос» инициализировал бы родительский источник данных.

До кучи можно было бы еще и CONNECT аналогичным образом оформить.

OLEDB провайдер, то есть IBProvider, такое извращение скорее всего выдержит. А вот .NET провайдер вряд ли….

Эксперименты с подключением к FB

С пятницей.

Сто лет назад, в 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.
(далее…)

Формат строки подключения к FB через TCP/IP.

Затеял написать парсер строки с расположением базы данных при подключении к серверу через 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 [17404].

Привет всем.

Доступен для скачивания новый триал 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, решил — ладно, я подожду.


Facepalm
Компиляция FB3 на нетбуке.

Вести с полей.

Привет всем.

Сегодня закончил(?) работу над очередным выпуском IBProvider-а и .Net провайдера. Это будет продолжение немного затянувшегося исправления ошибок и переписывания старого плюсового кода с реализацией корявых конструкций на самом нижнем, инфраструктурном уровне, созданных в период бурной молодости 🙂 Такого осталось уже совсем немного.

Основное изменение в .Net провайдере — запрет неявного коммита «вложенных» транзакций. Добил затеянное два с половиной года назад. Вернуть старое поведение можно через новое (специализированное) свойство строки подключения «NetProv: NestedTransRules». Допустимые значения перечислены в OleDbPropertiesVaules.NetProvider.NestedTransRules (обожаю эти километровые имена).

Ну и под занавес, я освоил создание NuGet-пакетов (Задача элементарная, по сравнению с нормальным инсталлятором. Но сутки я на неё все равно угробил.). Так что наш Ado.Net провайдер теперь можно загружать и с NuGet.org. В пакет включены релизные сборки провайдера (под все версии FW) и PDB файлы. Пользуясь случаем передаю привет Ксении Кузнецовой, которая год назад предложила эту затею.

Вести с полей.

Всем привет.

Соорудил новый пример по работе с массивами через .NET провайдер.

С горечью могу констатировать факт — всю жизнь стремился создать профессиональную библиотеку для высокоуровневой работы с FB/IB на C++, а создал её на C#.

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

Доступен для скачивания новый триал IBProvider-a. Будет работать до 20 января 2015-го.

За это время, я думаю, будет выполнено избычное полное тестирование сборок. Кстати, тестирование идет с FB2.5, собранным 2013 студией. Модифицированным, конечно.

Все изменения в провайдере — внутренние:
— Увеличена надежность алгоритмов, работающих с памятью.
— Улучшена обработка ошибок.

Как показывает практика — кругом засады. Поэтому приходится перестраховываться по-полной.
(далее…)

С наступающим Новым Годом!

Привет всем!

2014 был (по крайней мере, для меня лично) весьма забавным годом — догнало все и сразу 🙂

Хочется сказать ОГРОМНОЕ спасибо (THANKS!), всем кто покупал лицензии на IBProvider и пожелать им в Новом Году только самое лучшее.

Ну а кто не купил — горите в Аду вас тоже с наступающим 🙂

Коваленко Дмитрий.

Can I use nested transactions with Your provider?

Yes, ofcourse. Define in connection string the «nested_trans=true». News.

А чем вы занимались 9 лет и 9 месяцев тому назад? 🙂