Определение версии Firebird по папке куда он установлен

Всё о СУБД FireBird.
Ответить
rusmikle
Сообщения: 5
Зарегистрирован: 01.04.2022 14:48:29

Определение версии Firebird по папке куда он установлен

Сообщение rusmikle »

Всем доброго времени суток,

если на компе установлено несколько версий FB нужно точно убедиться что папка в которую установлен Firebird это тот фиребирд который сейчас запущен (достаточно что та же версия).
Алгоритм такой:
Запросом получаем версию FB, далее сканируем ветку реестра \SYSTEM\CurrentControlSet\Services на текст Firebird (в моём случае сервис всегда содержит это слово).
Если нашли проверяем содержимое ключа "ImagePath" на наличие "fbserver.exe" или "firebird.exe" и далее вытаскиваем path из пути к ним.
Имея путь сканируем firebird.conf, ищем RemoteServicePort и сверяем порт с тем с которым мы работаем в данный момент. Если порт совпадает то путь это нужный путь. Если нет но сканируем дальше.
Сие работает только если все FB сидят на различных портах. Если они сидят на одном порту, и какой то из них остановлен в данный момент, то такой алгоритм неработает.

Посоветуйте, как начиная с FB2.5 и далее, имея путь к папке определить версию FB в ней лежашую.

Спасибо.
Аватара пользователя
admin
Site Admin
Сообщения: 36
Зарегистрирован: 19.03.2022 16:27:02

Re: Определение версии Firebird по папке куда он установлен

Сообщение admin »

Версию можно определить считав данные исполняемого файла:
Изображение
Можно запросив у СУБД:

Код: Выделить всё

SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') as version from rdb$database; -- 4.0.0
Передав параметр "-z" можно увидеть версию, например:

Код: Выделить всё

firebird.exe -z
вернёт версию, пример:
Изображение

Код: Выделить всё

"gsec.exe" -z
вернёт версию, пример:

Код: Выделить всё

gsec version WI-T4.0.0.1436 Firebird 4.0 Beta 1
https://www.firebirdsql.org/pdfmanual/F ... ussian.pdf
fraks
Сообщения: 26
Зарегистрирован: 06.04.2022 11:27:22

Re: Определение версии Firebird по папке куда он установлен

Сообщение fraks »

У меня одна версия Firebird на компе, но когда-то было несколько. запускал их в виде application, с ключом -a.
С тех пор у меня осталасть паранойя знать что тут установлено и работает.
Никогда не ставлю Firebird инсталлятором, просто разворачиваю архив, запускаю батник идущий в комплекте, немного модифицированный.
Путь в path добавляю руками.
Никакие dll никуда не копирую.

В итоге у меня сервер лежит в папке типа
C:\Programs\Firebird-2.5.8-32
из чего сразу понятно что там.
32 - разрядность.

Батник по установке состоит из двух строчек

Код: Выделить всё

rem install_super - 2.5.8-32.bat

instsvc install -n "2.5.8-32" -auto -superserver -z
instsvc start   -n "2.5.8-32"

pause
пауза тут для того что бы увидеть сообщение об ошибке, если оно будет.

Установка сервиса такой командой дает сервис с именем "Firebird Server - 2.5.8-32" что дает возможность быть более-менее уверенным в том какая версия работает. Вероятно, можно установить несколько сервисов, и запускать тот который нужен.
fraks
Сообщения: 26
Зарегистрирован: 06.04.2022 11:27:22

Re: Определение версии Firebird по папке куда он установлен

Сообщение fraks »

Если запущен только одна служба Firebird, можно просто посмотреть в ее свойства в "Управление комптьютером" - "Службы" - свойства службы Firebird, там отображается команда запуска, с полным путем и ключами.

Код: Выделить всё

c:\Programs\Firebird-2.5.8-64\bin\fbserver.exe -s 2.5.8-64
fraks
Сообщения: 26
Зарегистрирован: 06.04.2022 11:27:22

Re: Определение версии Firebird по папке куда он установлен

Сообщение fraks »

Можно прочитать в ресурсах fbserver.exe его версию.
Аватара пользователя
eddoc
Сообщения: 1
Зарегистрирован: 01.04.2022 13:51:28

Re: Определение версии Firebird по папке куда он установлен

Сообщение eddoc »

а не проще пойти еще дальше и запускать каждый экземпляр FB под своим портом?

Код: Выделить всё

C:\Programs\Firebird_307_x32\firebird.exe -a -p 30732 //32-битная
C:\Programs\Firebird_307_x64\firebird.exe -a -p 30764 //64-битная
соответственно, коннект к базе определенной версии осуществляется указанием порта в строке коннекта:
для 32-бит

Код: Выделить всё

>C:\Programs\Firebird_307_x32\isql
SQL> connect '127.0.0.1/30732:C:\Programs\Firebird_307_x32\examples\empbuild\Employee.fdb' user sysdba password 'cooladmin';
Database: '127.0.0.1/30732:C:\Programs\Firebird_307_x32\examples\empbuild\Employee.fdb', User: SYSDBA
для 64-бит

Код: Выделить всё

>C:\Programs\Firebird_307_x64\isql
SQL> connect 'inet4://127.0.0.1:30764:C:\Programs\Firebird_307_x64\examples\empbuild\Employee.fdb' user sysdba password 'cooladmin';
Database: 'inet4://127.0.0.1:30764:C:\Programs\Firebird_307_x64\examples\empbuild\Employee.fdb', User: SYSDBA
Отсюда, о версии сервера можно опосредованно судить либо по номеру порта :)
Док.

fpc trunk/lazarus trunk
Firebird 3.0.7 33374
Win10 x64 Ultim/Debian10 amd64/Darwin Hackintosh 12.2
Морской десант
Сообщения: 4
Зарегистрирован: 10.04.2022 03:49:27

Re: Определение версии Firebird по папке куда он установлен

Сообщение Морской десант »

Ну вот мой инсталлятор всегда ставит firebird в папку C:\FBServer. И что вам с той информации? При деинсталляции программного комплекса я удаляю сервер FB, если юзер подтвердил это желание. Что там есть в реестре - ни разу не интересно.
При инсталляции всегда останавливаю мой экземпляр FB, затем анализирую занятость tcp порта, который я использую. Если порт занят - юзеру предлагается позвонить разработчику (мне), далее обсуждаем дополнительные необходимые телодвижения. Не звонили ни разу. :D
Использовать "чужие" инсталляции - да ну нафиг. Другие программисты такие же эгоисты , как и я, могут поставить FB куда угодно, сталкивался, больше не хочу.
Для сложных/дорогих заказчиков - провожу инсталляцию самостоятельно, руками. Штатный инсталлятор FB не использую.
svd
Сообщения: 3
Зарегистрирован: 15.08.2022 12:21:10

Re: Определение версии Firebird по папке куда он установлен

Сообщение svd »

делаю прощее:

search_firebird.cmd :

Код: Выделить всё

@set "SERVICE=Firebird"
@set "FBSERVICENAME="
@if "%1"=="" @(@set "CN=\\%COMPUTERNAME%") ELSE @(@set "CN=\\%1")
@for /f " delims=" %%s in ('sc %CN% query state^= all ^|find /I "SERVICE_NAME" ^|find /I "Firebird" ') do @(
     @for /f "tokens=2 delims=:" %%# in ("%%s") do @(
        @set "FBSERVICENAME=%%#"
        @rem echo.%%#
    )
)
@rem echo.%FBSERVICENAME%

@rem sc %CN% qc %FBSERVICENAME%
@for /f " delims=" %%s in ('sc %CN% qc %FBSERVICENAME% ^|find /I "BINARY_PATH_NAME" ') do @(
  @rem echo.%%s
  @echo.%FBSERVICENAME%%%s
)
get_fbexe_info.cmd :

Код: Выделить всё

@rem ====
@rem = Read information about installed on the current computer firebird version
@rem =
@rem = FBSVER - Version of the Firebird. vers - full versions number.
@rem = FBEXE - executabel name with path and drive
@rem = FBDIR - the path to executable (warning: it would be duffrent to FB25, FB30 and FB40 ) 
@rem = FBSBITVER - bit-version of the instance
@rem = OSBITVER - bit-version of the operating system
@rem = FBSVCNAME - Firebird Service Name
@rem ====
@set "OSBITVER=x32"
@if exist "%windir%\SysWOW64" @set "OSBITVER=x64"
@echo OSBITVER::%OSBITVER%
@set "CURDIR=%~dp0"
@call "%CURDIR%\search_firebird.cmd" >"%CURDIR%fb_out.txt"
@rem echo FBSERVICENAME::%FBSERVICENAME%
@set /P FBOUT=<"%CURDIR%\fb_out.txt"
@call :GET_EXE %FBOUT%
@rem set 'FBEXE=%FBOUT:"=' & @set "FBEXE=%"
@set "FBSVCNAME=%FBSVCNAME%"
@rem echo.PATH::"%FBEXE%" FBSVCNAME::"%FBSVCNAME%"


@call :GET_VER %FBEXE%
@set "FBSVER=%vers%"
@if "%FBSVER%"=="" @set "FBSVER=0.0"
@rem echo FBSVER::%FBSVER% 
@call :GET_PATH  %FBEXE%
@rem echo FBDIR::%FBDIR%

@if not x%FBSVER:2.5.=%==x%FBSVER% (
   @set "FBSVER=2.5"
   @set "FBVER=2_5"
   @if exist "%FBDIR%..\WOW64" (
       @set "FBSBITVER=x64"
   ) else (
       @set "FBSBITVER=x32"
   )
) else (
    @if not x%FBSVER:3.0=%==x%FBSVER% ( 
        @set "FBSVER=3.0" 
        @set "FBVER=3_0" 
   @if exist "%FBDIR%WOW64" (
       @set "FBSBITVER=x64"
   ) else (
       @set "FBSBITVER=x32"
   )
))

@rem if not x%FBEXE:(x86)=%==x%FBEXE% (
@rem   @set "FBSBITVER=x32"
@rem ) else (
@rem   @set "FBSBITVER=x64"
@rem )
@echo.FBServer Version::%FBSVER%%FBSBITVER%
@echo FBDIR::%FBDIR%
@echo FBEXE::%FBEXE%

@rem echo FBOUT::%FBOUT%

@rem exit

:GET_EXE
	@set "FBSVCNAME=%1"
    	@set "FBEXE=%4"
	@exit /B

:GET_VER                                                      
    @set "file=%~1"
    @if not defined file goto :eof
    @if not exist "%file%" goto :eof

    @set "vers="
    @FOR /F "tokens=2 delims==" %%a in ('
        wmic datafile where name^="%file:\=\\%" get Version /value 
    ') do @set "vers=%%~a"
                                   
@exit /B

:GET_PATH
    @FOR %%i IN (%1) DO @(
        @rem ECHO filedrive=%%~di
        @rem ECHO filepath=%%~pi
	@set "FBDIR=%%~di%%~pi"
        @rem ECHO filename=%%~ni
        @rem ECHO fileextension=%%~xi
    )
@exit /B
deinstall_fb.bat :

Код: Выделить всё

@rem ===============
@rem =  Denstallation of Firebird any version
@rem ===============
@set "M4DIR=C:\MACH4"
@set "M4DBDIR=%M4DIR%\Database"
@set "OURDIR=C:\"
@set "OURSYSBAT=C:\Update_working\Sys-Batch"
@echo.
@echo Current installed version is :
@call "%OURSYSBAT%\get_fbexe_info.cmd"

@if "%FBSVER%"=="0.0" (
	@echo Firbird not found!
	@exit 300
) 

@if "%FBSVER%"=="2.5" (

   sc \\%COMPUTERNAME% stop FirebirdGuardianDefaultInstance
   sc \\%COMPUTERNAME% stop FirebirdServerDefaultInstance
   @echo Deinstallation ....
   @call "%FBDIR%..\unins000.exe" /silent
   @echo ... Done

)
@if "%FBSVER%"=="3.0" (

   sc \\%COMPUTERNAME% stop FirebirdServerDefaultInstance
   @echo Deinstallation ....
   @call "%FBDIR%unins000.exe" /silent
   @echo ... Done

)

@call %OURSYSBAT%\get_fbexe_info.cmd

Ответить