Определение версии Firebird по папке куда он установлен
Определение версии Firebird по папке куда он установлен
Всем доброго времени суток,
если на компе установлено несколько версий FB нужно точно убедиться что папка в которую установлен Firebird это тот фиребирд который сейчас запущен (достаточно что та же версия).
Алгоритм такой:
Запросом получаем версию FB, далее сканируем ветку реестра \SYSTEM\CurrentControlSet\Services на текст Firebird (в моём случае сервис всегда содержит это слово).
Если нашли проверяем содержимое ключа "ImagePath" на наличие "fbserver.exe" или "firebird.exe" и далее вытаскиваем path из пути к ним.
Имея путь сканируем firebird.conf, ищем RemoteServicePort и сверяем порт с тем с которым мы работаем в данный момент. Если порт совпадает то путь это нужный путь. Если нет но сканируем дальше.
Сие работает только если все FB сидят на различных портах. Если они сидят на одном порту, и какой то из них остановлен в данный момент, то такой алгоритм неработает.
Посоветуйте, как начиная с FB2.5 и далее, имея путь к папке определить версию FB в ней лежашую.
Спасибо.
если на компе установлено несколько версий FB нужно точно убедиться что папка в которую установлен Firebird это тот фиребирд который сейчас запущен (достаточно что та же версия).
Алгоритм такой:
Запросом получаем версию FB, далее сканируем ветку реестра \SYSTEM\CurrentControlSet\Services на текст Firebird (в моём случае сервис всегда содержит это слово).
Если нашли проверяем содержимое ключа "ImagePath" на наличие "fbserver.exe" или "firebird.exe" и далее вытаскиваем path из пути к ним.
Имея путь сканируем firebird.conf, ищем RemoteServicePort и сверяем порт с тем с которым мы работаем в данный момент. Если порт совпадает то путь это нужный путь. Если нет но сканируем дальше.
Сие работает только если все FB сидят на различных портах. Если они сидят на одном порту, и какой то из них остановлен в данный момент, то такой алгоритм неработает.
Посоветуйте, как начиная с FB2.5 и далее, имея путь к папке определить версию FB в ней лежашую.
Спасибо.
Re: Определение версии Firebird по папке куда он установлен
Версию можно определить считав данные исполняемого файла:
![Изображение](https://i.ibb.co/G3jC4X6/2022-04-21-111524028.png)
Можно запросив у СУБД:
Передав параметр "-z" можно увидеть версию, например:
вернёт версию, пример:
вернёт версию, пример:
https://www.firebirdsql.org/pdfmanual/F ... ussian.pdf
![Изображение](https://i.ibb.co/G3jC4X6/2022-04-21-111524028.png)
Можно запросив у СУБД:
Код: Выделить всё
SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') as version from rdb$database; -- 4.0.0
Код: Выделить всё
firebird.exe -z
![Изображение](https://i.ibb.co/6B2s09s/2022-04-21-112726969.png)
Код: Выделить всё
"gsec.exe" -z
Код: Выделить всё
gsec version WI-T4.0.0.1436 Firebird 4.0 Beta 1
Re: Определение версии Firebird по папке куда он установлен
У меня одна версия Firebird на компе, но когда-то было несколько. запускал их в виде application, с ключом -a.
С тех пор у меня осталасть паранойя знать что тут установлено и работает.
Никогда не ставлю Firebird инсталлятором, просто разворачиваю архив, запускаю батник идущий в комплекте, немного модифицированный.
Путь в path добавляю руками.
Никакие dll никуда не копирую.
В итоге у меня сервер лежит в папке типа
C:\Programs\Firebird-2.5.8-32
из чего сразу понятно что там.
32 - разрядность.
Батник по установке состоит из двух строчек
пауза тут для того что бы увидеть сообщение об ошибке, если оно будет.
Установка сервиса такой командой дает сервис с именем "Firebird Server - 2.5.8-32" что дает возможность быть более-менее уверенным в том какая версия работает. Вероятно, можно установить несколько сервисов, и запускать тот который нужен.
С тех пор у меня осталасть паранойя знать что тут установлено и работает.
Никогда не ставлю 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" что дает возможность быть более-менее уверенным в том какая версия работает. Вероятно, можно установить несколько сервисов, и запускать тот который нужен.
Re: Определение версии Firebird по папке куда он установлен
Если запущен только одна служба Firebird, можно просто посмотреть в ее свойства в "Управление комптьютером" - "Службы" - свойства службы Firebird, там отображается команда запуска, с полным путем и ключами.
Код: Выделить всё
c:\Programs\Firebird-2.5.8-64\bin\fbserver.exe -s 2.5.8-64
Re: Определение версии Firebird по папке куда он установлен
Можно прочитать в ресурсах fbserver.exe его версию.
Re: Определение версии Firebird по папке куда он установлен
а не проще пойти еще дальше и запускать каждый экземпляр FB под своим портом?
соответственно, коннект к базе определенной версии осуществляется указанием порта в строке коннекта:
для 32-бит
для 64-бит
Отсюда, о версии сервера можно опосредованно судить либо по номеру порта ![Smile :)](./images/smilies/icon_e_smile.gif)
Код: Выделить всё
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
Код: Выделить всё
>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
![Smile :)](./images/smilies/icon_e_smile.gif)
Док.
fpc trunk/lazarus trunk
Firebird 3.0.7 33374
Win10 x64 Ultim/Debian10 amd64/Darwin Hackintosh 12.2
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 порта, который я использую. Если порт занят - юзеру предлагается позвонить разработчику (мне), далее обсуждаем дополнительные необходимые телодвижения. Не звонили ни разу.
Использовать "чужие" инсталляции - да ну нафиг. Другие программисты такие же эгоисты , как и я, могут поставить FB куда угодно, сталкивался, больше не хочу.
Для сложных/дорогих заказчиков - провожу инсталляцию самостоятельно, руками. Штатный инсталлятор FB не использую.
При инсталляции всегда останавливаю мой экземпляр FB, затем анализирую занятость tcp порта, который я использую. Если порт занят - юзеру предлагается позвонить разработчику (мне), далее обсуждаем дополнительные необходимые телодвижения. Не звонили ни разу.
![Very Happy :D](./images/smilies/icon_e_biggrin.gif)
Использовать "чужие" инсталляции - да ну нафиг. Другие программисты такие же эгоисты , как и я, могут поставить FB куда угодно, сталкивался, больше не хочу.
Для сложных/дорогих заказчиков - провожу инсталляцию самостоятельно, руками. Штатный инсталлятор FB не использую.
Re: Определение версии Firebird по папке куда он установлен
делаю прощее:
search_firebird.cmd :
get_fbexe_info.cmd :
deinstall_fb.bat :
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
)
Код: Выделить всё
@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
Код: Выделить всё
@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