DEPO Firebird: путь к базе — и строкой подключения Fancy целиком (база на другом компьютере)

Поле пути в мастере и в «Таблицах обмена» принимает строку подключения из настройки Fancy: «сервер:путь»,
«сервер/порт:путь», «\\сервер\D:\путь», «\\сервер\D$\путь», «inet://сервер:порт/путь» — адрес и порт
bj берёт из неё (в мастере поля заполняются сразу при вставке). Сетевая папка «\\сервер\папка\…» — ошибка с
подсказкой: Firebird открывает базу только на своём диске, адрес — компьютер с сервером Firebird.
Проверено мастером на копии базы: пустой адрес + «127.0.0.1/3050:путь» — подготовка и BJ_PING.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-27 19:15:46 +03:00
parent 50e420f4a0
commit 1d8bb0c032
8 changed files with 123 additions and 9 deletions
+47
View File
@@ -468,3 +468,50 @@ func fbErr(orig, sent string, err error) error {
}
return err
}
var (
fbDriveRe = regexp.MustCompile(`^[A-Za-z]:[\\/]`)
fbHostRe = regexp.MustCompile(`^([A-Za-z0-9._\-]{2,}|\[[0-9A-Fa-f:]+\])(?:/(\d{1,5}))?:(.+)$`)
fbUNCRe = regexp.MustCompile(`^\\\\([^\\/]+)[\\/](.+)$`)
fbAdmShRe = regexp.MustCompile(`^([A-Za-z])\$[\\/](.*)$`)
fbInetURLRe = regexp.MustCompile(`(?i)^inet[46]?://([^/:]+)(?::(\d{1,5}))?/(.+)$`)
)
// fbSplitConn — строка подключения Fancy к базе Firebird целиком: «сервер:путь», «сервер/порт:путь»,
// «\\сервер\D:\путь», «\\сервер\D$\путь», «inet://сервер:порт/путь». База обычно на другом компьютере — на
// том, где работает сервер Firebird; bj подключается к нему по сети, а путь — на диске этого компьютера.
// host="" — указан только путь (сервер — в отдельном поле). Сетевую папку (\\сервер\папка\…) Firebird не
// открывает — ошибка с подсказкой.
func fbSplitConn(s string) (host string, port int, path string, err error) {
s = strings.TrimSpace(s)
switch {
case fbDriveRe.MatchString(s) || strings.HasPrefix(s, "/") || !strings.ContainsAny(s, `:\/`):
return "", 0, s, nil // путь на сервере или псевдоним
case fbInetURLRe.MatchString(s):
m := fbInetURLRe.FindStringSubmatch(s)
port, _ = strconv.Atoi(m[2])
path = m[3]
if !fbDriveRe.MatchString(path) && !strings.ContainsAny(path, `\/`) { // inet://host/alias
return m[1], port, path, nil
}
if !fbDriveRe.MatchString(path) {
path = "/" + path
}
return m[1], port, path, nil
case fbUNCRe.MatchString(s):
m := fbUNCRe.FindStringSubmatch(s)
rest := m[2]
if fbDriveRe.MatchString(rest) { // \\сервер\D:\путь — так Fancy пишет подключение по именованным каналам
return m[1], 0, rest, nil
}
if a := fbAdmShRe.FindStringSubmatch(rest); a != nil { // \\сервер\D$\путь — административный общий ресурс
return m[1], 0, strings.ToUpper(a[1]) + `:\` + a[2], nil
}
return "", 0, "", fmt.Errorf("%s — сетевая папка: Firebird не открывает базы по сети как файл. Укажите компьютер %s в поле «Адрес сервера» (на нём должен работать сервер Firebird), а путь — на его диске, например D:\\Fancy\\DEPO.GDB, — как в подключении Fancy", s, m[1])
case fbHostRe.MatchString(s):
m := fbHostRe.FindStringSubmatch(s)
port, _ = strconv.Atoi(m[2])
return strings.Trim(m[1], "[]"), port, m[3], nil
}
return "", 0, s, nil
}