Формат строки подключения к 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 соответственно.