Comment déterminer l'architecture de Firebird avec une requête SQL ?
Firebird Friday Joke #8 (de https://t.me/firebirdsql)
Le script ci-dessous détermine l’architecture actuelle d’exécution d’un serveur Firebird avec SQL.
Normalement, vous devez consulter le fichier de configuration firebird.conf ou les paramètres du service Firebird pour comprendre quelle est l’architecture.
Cependant, dans notre environnement de test hautement automatisé, il est nécessaire de vérifier l’architecture avec du SQL pur.
L’auteur de cette méthode est Pavel Zotov, responsable QA Firebird et administrateur principal chez IBSurgeon.
Pour simplifier, le code est déclaré comme execute block, mais il peut être facilement transformé en procédure stockée.
Le script ci-dessous est prêt pour isql.exe.
`set list on; set term ^; –create or alter procedure sys_get_fb_arch ( – a_connect_with_usr varchar(31) default ‘SYSDBA’ – ,a_connect_with_pwd varchar(31) default ‘masterkey’ –) returns( – fb_arch varchar(50) –) as execute block returns( fb_arch varchar(50) ) as declare a_connect_with_usr varchar(31) default ‘SYSDBA’; declare a_connect_with_pwd varchar(31) default ‘masterkey’; declare cur_server_pid int; declare ext_server_pid int; declare att_protocol varchar(255); declare v_test_sttm varchar(255); declare v_fetches_beg bigint; declare v_fetches_end bigint; begin
-- Procédure stockée auxiliaire pour détecter l'architecture FB.
select a.mon$server_pid, a.mon$remote_protocol
from mon$attachments a
where a.mon$attachment_id = current_connection
into cur_server_pid, att_protocol;
if ( att_protocol is null ) then
fb_arch = 'Embedded';
else if ( upper(current_user) = upper('SYSDBA')
and rdb$get_context('SYSTEM','ENGINE_VERSION') NOT starting with '2.5'
and exists(select * from mon$attachments a
where a.mon$remote_protocol is null
and upper(a.mon$user) in ( upper('Cache Writer'), upper('Garbage Collector'))
)
) then
fb_arch = 'SuperServer';
else
begin
v_test_sttm =
'select a.mon$server_pid + 0*(select 1 from rdb$database)'
||' from mon$attachments a '
||' where a.mon$attachment_id = current_connection';
select i.mon$page_fetches
from mon$io_stats i
where i.mon$stat_group = 0 -- db_level
into v_fetches_beg;
execute statement v_test_sttm
on external
'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME')
as
user a_connect_with_usr
password a_connect_with_pwd
role left('R' || replace(uuid_to_char(gen_uuid()),'-',''),31)
into ext_server_pid;
in autonomous transaction do
select i.mon$page_fetches
from mon$io_stats i
where i.mon$stat_group = 0 -- db_level
into v_fetches_end;
fb_arch = iif( cur_server_pid is distinct from ext_server_pid,
'Classic',
iif( v_fetches_beg is not distinct from v_fetches_end,
'SuperClassic',
'SuperServer'
)
);
end
fb_arch = trim(fb_arch) || ' ' || rdb$get_context('SYSTEM','ENGINE_VERSION');
suspend;
end
^ – sys_get_fb_arch set term ;^ commit;`