Формат строки подключения к 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», и не было бы никакой неоднозначности.
Уверен, что я не первый кто про это подумал 🙂
dimitr on 13 февраля, 2015
> Был бы формат «inet://host:local_path», и не было бы никакой неоднозначности.
В тройке он есть 🙂 Только вот так: «inet://host[:port]/local_path». Ну и wnet/xnet соответственно.