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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user