DEPO на Firebird в мастере: подготовка базы одним действием, как для MSSQL

Мастер, шаг «Учёт DEPO», и «Обмен с DEPO» в настройках: СУБД «Firebird» (Fancy на Firebird 2.5).
- Подключение: драйвер nakagami/firebirdsql, путь к файлу базы или псевдоним, WIN1251. Запросы bj к DEPO
  (T-SQL) подключение переводит само (fancyfb.go): механически (dbo., TOP, ISNULL, GETDATE, LEN, N, exec)
  вне строк и комментариев, точные тексты — fsql/fb.go (каталоги, LIKE [_], COUNT(*) OVER, SELECT без FROM,
  PATINDEX); @имена — позиционные ?, GUID — в верхнем регистре. Системные запросы из кода — в fsql/depocatalog.go.
- «Подготовить» логином SYSDBA (depo_setup_fb.go): проверка базы и UDF Fancy, логин SYSDBA_BJ (Fancy даёт права
  на документы логинам SYSDBA%; для Firebird — обычный пользователь), оператор-робот Fancy, кодировщик M2M,
  привязки FTV_M2M_SETTINGS по признакам Fancy, таблицы, процедуры, права; обработку запускает bj.
  «Получить скрипт» — то же для isql в WIN1251; письмо администратору, установка процедур, плашка обновления.
- Скрипты Firebird встроены (depoprocs/firebird, тест сверяет с deploy/); количества — DOUBLE PRECISION: из
  диалекта 3 в базу диалекта 1 процедуру с NUMERIC(18,7) не создать.
- Проверено на копии базы Fancy (отдельный экземпляр bj): мастер с нуля — все проверки, BJ_PING; тестовый режим
  DEPO — К1 Бубликов, зачисление и списание до исполнения без ошибок; очередь, справочник НРД.
  Тест FBLive готовит на базе все запросы bj к DEPO: 94 из 101, оставшиеся 7 — ЛК и ручной ввод (следующий этап).

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 18:55:02 +03:00
parent 7073ce2a33
commit 50e420f4a0
30 changed files with 2698 additions and 71 deletions
+20 -1
View File
@@ -126,6 +126,10 @@ var depoSchemaFixes = []struct{ Name, SQL string }{
// depoProcsHash — отпечаток набора процедур, который bj установит (с учётом правки под клиента).
func depoProcsHash(f FancyMSSQLSettings) string {
h := sha256.New()
if f.IsFirebird() { // таблицы, привязки, процедуры и права Firebird (depo_setup_fb.go)
h.Write(depoFBHash())
return hex.EncodeToString(h.Sum(nil))[:16]
}
for _, fx := range depoSchemaFixes {
h.Write([]byte(fx.Name + "\n" + fx.SQL + "\n"))
}
@@ -154,6 +158,9 @@ func depoProcList() []struct{ Name, File string } { return depoProcInstallOrder
// depoProcsCombined — единый скрипт установки (для скачивания администратору): USE, процедуры, GRANT.
func depoProcsCombined(f FancyMSSQLSettings) string {
if f.IsFirebird() {
return depoSetupScriptFB(f, f.DepoDB(), depoSetupLogin(f), "")
}
return depoProcsScriptFor(f, f.DepoDB(), depoSetupLogin(f))
}
@@ -233,7 +240,10 @@ func quoteIdent(s string) string { return "[" + strings.ReplaceAll(s, "]", "]]")
// для экрана, признак «можно применять» и ошибку подключения/проверки.
func depoProcsPreflight(ctx context.Context, f FancyMSSQLSettings, adminUser, adminPass string) (report string, canApply bool, err error) {
if f.IsPostgres() {
return "", false, fmt.Errorf("установка процедур bj2depo поддержана только для MSSQL")
return "", false, fmt.Errorf("установка процедур bj2depo поддержана только для MSSQL и Firebird")
}
if f.IsFirebird() {
return depoProcsPreflightFB(ctx, f, adminUser, adminPass)
}
conn := f
admin := strings.TrimSpace(adminUser)
@@ -314,6 +324,9 @@ func depoProcErrHint(msg string) string {
// depoProcsInstall — установить процедуры логином администратора. Сначала preflight; при отсутствии
// прав — отказ без изменений. Возвращает итоговое сообщение.
func depoProcsInstall(ctx context.Context, f FancyMSSQLSettings, adminUser, adminPass string) (string, error) {
if f.IsFirebird() {
return depoProcsInstallFB(ctx, f, adminUser, adminPass)
}
report, canApply, err := depoProcsPreflight(ctx, f, adminUser, adminPass)
if err != nil {
return "", err
@@ -401,6 +414,12 @@ func (h *setupHandlers) installFancyDepoProcs(w http.ResponseWriter, r *http.Req
// fancyDepoProcsScript — GET /admin/setup/fancy/depo-procs/script.sql: единый скрипт для администратора.
func (h *setupHandlers) fancyDepoProcsScript(w http.ResponseWriter, r *http.Request) {
s := h.rc.Snapshot().Fancy
if s.IsFirebird() { // isql -ch WIN1251
w.Header().Set("Content-Type", "application/sql; charset=windows-1251")
w.Header().Set("Content-Disposition", `attachment; filename="bj-depo-procs-firebird.sql"`)
_, _ = w.Write(win1251(depoProcsCombined(s)))
return
}
w.Header().Set("Content-Type", "application/sql; charset=utf-8")
w.Header().Set("Content-Disposition", `attachment; filename="bj-depo-procs-mssql.sql"`)
// UTF-8 BOM (0xEF 0xBB 0xBF): SSMS без него читает кириллицу в комментариях как ANSI.