FbExpert — guide des fonctionnalités

Tout ce que fait l’application, sur une seule page : explorateur Firebird, éditeur SQL, snippets et formatage, export/import, atelier de migration, champs ajoutés et transformations.

Version documentée : 7.21 Dernière mise à jour : 1er novembre 2026 Tests : 627 Infrastructure + 46 moteurs Build : 0 erreur / 0 avertissement
♻️ Maintenir cette page
Aucune section ne correspond à la recherche.

1 Vue d’ensemble

Fait .NET 10 Blazor Interactive Server Radzen

FbExpert est un atelier Firebird : il explore un schéma, édite du SQL, exporte et importe des bases (structure et données) et accompagne une migration inter-versions pilotée par un contrat JSON.

🧭 Explorer

Tables, vues, procédures, fonctions, triggers, domaines, index, contraintes, dépendances, détails et DDL.

⌨️ Éditer

Auto-complétion schema-aware, snippets versionnés, formatage paramétrable, exécution multi-instructions.

📦 Exporter / importer

Dumps binaires en flux, DDL fidèle, migration 2.5 → 6.0, chargement par lots.

🛠️ Atelier

Onglets, sélection d’objets, SQL cible, analyse, import, champs ajoutés, transformations.

Architecture

ProjetRôle
FbExpert.DomainEntités et énumérations, sans dépendance.
FbExpert.ApplicationContrats, snippets, formatage, découpage SQL, règles pures.
FbExpert.InfrastructureFirebird, export/import, pipeline ETL, magasins JSON, transformations.
FbExpert.EnginesCatalogue des kits moteurs (versions, validation).
FbExpert.BlazorInterface Blazor/Radzen.
FirebirdSql.Data.FirebirdClientClient Firebird compilé dans la solution.
FbExpert.Infrastructure.Tests627 tests (unitaires + E2E moteur).
FbExpert.Engines.Tests46 tests.

2 Installation

Les kits Firebird (clients/binaires) et les paramètres fournis sont installés par deux scripts équivalents.

Windows — tools/fetch-kits.ps1

.\tools\fetch-kits.ps1                  # kit 5.0 + snippets + options de formatage
.\tools\fetch-kits.ps1 -Kit 5.0,4.0     # plusieurs kits
.\tools\fetch-kits.ps1 -SettingsOnly    # paramètres seulement
.\tools\fetch-kits.ps1 -ForceSnippets   # réinstalle les snippets fournis
.\tools\fetch-kits.ps1 -ForceFormat     # réinstalle les options de formatage
.\tools\fetch-kits.ps1 -NoSnippets      # kits + options, sans snippets
.\tools\fetch-kits.ps1 -NoFormat        # kits + snippets, sans options

-SnippetsOnly reste accepté comme alias de -SettingsOnly.

Linux — tools/fetch-kits.sh

./tools/fetch-kits.sh                   # kit 5.0 + snippets + options
./tools/fetch-kits.sh -k 5.0,4.0
./tools/fetch-kits.sh --settings-only   # alias : --snippets-only
./tools/fetch-kits.sh --force-format
./tools/fetch-kits.sh --no-format

Prérequis Linux : bash 4+, curl, tar, python3, sha256sum.

Les fichiers existants (sql-snippets.json, sql-format.json) ne sont jamais écrasés sans -Force… / --force-… : les personnalisations sont conservées.

3 Données utilisateur

Windows : %LOCALAPPDATA%\FbExpert\ — Linux : ${XDG_DATA_HOME:-$HOME/.local/share}/FbExpert/.

ÉlémentRôle
engines/<version>/Kit Firebird (client, plugins, outils, kit.json).
data/FBEXPERT.FB5Base système : registre des bases, historique, transferts.
sql-snippets.jsonCatalogue de snippets (fournis + personnalisés).
sql-format.jsonOptions de formatage SQL.
transfers/Dossiers d’export/import par défaut.

4 Explorateur de schéma

Fait
  • Arborescence des bases, dossiers, tables, vues, procédures, fonctions, triggers, générateurs, domaines, exceptions, rôles, index et contraintes.
  • Détail d’objet : colonnes, paramètres, contraintes, index, dépendances, DDL, commentaires.
  • Recherche, filtre par type, pagination, rafraîchissement, détection de version moteur.
  • Connexion embarquée ou serveur, gestion des identifiants, test de connexion, mise en ligne (gfix -online).

5 Éditeur SQL

FaitCtrl+EspaceSnippetsFormater

Auto-complétion

Tables, vues, procédures, fonctions, packages, colonnes (alias a.), domaines, types, mots-clés. Ignore chaînes et commentaires.

Contexte

COMMENT ON TABLE → Tables ; EXECUTE PROCEDURE → Procédures ; SELECT … FROM reste sur « Tout ».

Snippets

Fragments prévalidés, filtrés par version du moteur, insérés avec le premier marqueur sélectionné.

Formatage

Mots-clés, clauses, BEGIN/END, tabulations, virgules en tête, ON sur la ligne du JOIN.

Exécution de scripts

Chaque instruction est validée séparément : les objets créés sont visibles par les instructions suivantes. SET TERM est géré ; COMMIT, ROLLBACK, SET SQL DIALECT et SET TRANSACTION sont ignorés.

CREATE TABLE T (ID INTEGER NOT NULL PRIMARY KEY, NOM VARCHAR(30));

SET TERM ^ ;
CREATE PROCEDURE P (X INTEGER) RETURNS (N INTEGER) AS
BEGIN
  N = X + 1;
  SUSPEND;
END^
SET TERM ; ^

CREATE VIEW V AS SELECT ID, NOM FROM T;
INSERT INTO T (ID, NOM) VALUES (1, 'OK');
SELECT ID, NOM FROM T;

Le bouton « Exécuter » accepte ce script complet et affiche les lignes du dernier SELECT.

Correctifs d’éditeur

  • Fin de lignes normalisées en LF avant tout calcul de position (snippets, curseur, sélection).
  • EXECUTE BLOCK AS DECLARE … ; BEGIN … END n’est plus coupé au premier ; des déclarations.
  • La popup ne reste plus vide après un snippet : le catalogue est chargé à l’ouverture et sur Ctrl+Espace.

6 Snippets

32 fournis/snippetsversions 2.5 → 6.0

Le catalogue est stocké dans sql-snippets.json. Les snippets fournis sont fusionnés sans écraser les personnalisations ; « Réinitialiser les snippets fournis » restaure les définitions d’origine.

CatégorieExemples
DDLTable, IDENTITY, BOOLEAN, DECFLOAT, INT128, TIME ZONE, vue, domaine, séquence, index, contraintes, commentaire, rôle.
PSQLProcédure 2.5/3.0+, fonction, trigger 2.5/3.0+, trigger DDL, package en-tête/corps, EXECUTE BLOCK.
DML / RequêtesMERGE, UPDATE OR INSERT, CTE récursive, INFORMATION_SCHEMA (6.0+).

Les marqueurs {{TABLE}}, {{COLUMN}}, {{TYPE}}… sont remplacés à l’insertion ; le premier est sélectionné.

Deux endroits pour insérer : catégorie « Snippets » de l’auto-complétion, ou sélecteur « Snippet (Firebird x.y) » à côté de l’éditeur.

7 Formatage SQL

Paramétrable/sql-format.json

Bouton Formater + Options… dans l’éditeur d’objet et le panneau Script SQL.

OptionEffet
IndentationTabulations ou 2/3/4 espaces.
Une colonne par ligneChaque champ de la liste SELECT sur sa ligne.
Virgules en début de ligneStyle ,colonne avec alignement du premier champ.
ON sur la ligne du JOINLEFT JOIN T ON … au lieu d’isoler ON.
Mots-clés en majusculesActive/désactive la mise en majuscules.
SELECT
	 rdb$relation_name
	,rdb$view_blr
FROM rdb$relations r
LEFT JOIN rdb$fields f ON f.rdb$field_name = r.rdb$relation_name
WHERE rdb$view_blr IS NOT NULL
ORDER BY 1
Les chaînes, identifiants entre guillemets et commentaires sont conservés. SET TERM reste lisible : l’espace entre le terminateur et ; est préservé.

Options enregistrées dans %LOCALAPPDATA%\FbExpert\sql-format.json ; « Réinitialiser » revient au style standard.

8 Export

Faitstreaming
  • Export structure seule ou structure + données, vers un dossier avec manifeste et dumps binaires (FBDUMP).
  • DDL fidèle : domaines, tables, vues, procédures, fonctions, triggers, packages, index, contraintes, commentaires, états ACTIVE/INACTIVE.
  • Dumps en flux (aucune table chargée en mémoire), lecture DDL parallèle bornée, cache de version.
  • Tables externes : exportées en structure interne, données non exportées.
  • Avancement (étape, compteur, durée, annulation) et bilan.

9 Import et ETL

Faitcontrat JSON2.5 → 6.0

Deux modes

Import classique

Lecture du dossier, création de la base cible, application du DDL et chargement des dumps.

Import par contrat

import.contract.json : périmètre, renommages, conversions, décisions, overrides SQL, transformations.

Garanties

  • Alignement colonnes/valeurs, conversion de charset, GUID (CHAR(16) CHARACTER SET OCTETS / BINARY(16)), fuseaux horaires.
  • DDL validé instruction par instruction (les objets créés sont visibles ensuite).
  • Mode Bloquer (rollback/base supprimée) ou Continuer par objet.
  • Procédures/fonctions/triggers en échec définitif : corps d’origine commenté, cause en tête, objet conservé ; trigger créé INACTIVE ; package : en-tête conservé sans corps.
  • Insertion par lots via EXECUTE BLOCK (option options.batchRows, défaut 200, plafond 1000 paramètres) avec reprise ligne par ligne en cas d’échec.
  • Reprise après échec, dumps d’erreur, historique et journal.
Benchmark réel sur 2 449 766 lignes : 118 556 ms ligne par ligne vs 102 436 ms par lots de 200, soit +15,7 % (mêmes compteurs, même taille de base).

10 Atelier de migration

Fait4 ongletsavant → après

Page /migration, organisée en onglets :

OngletContenu
1 · Source et cibleDossier d’export, base cible, version, charset, taille de page, contrat.
2 · Objets à importer (n)Sélection par dépendances, filtres de type, recherche, pagination, « Appliquer la sélection ».
3 · Script SQLPanneau d’exécution sur la base cible (création d’objets, snippets, formatage).
4 · Analyse et importÉdition SQL, filtres, problèmes, index/contraintes, inactifs, mode, lot, analyse, import.

Filtres de l’analyse

Les mêmes filtres de type que l’onglet 2 : Tous, table, vue, procédure, fonction, trigger, domaine, générateur… avec compteurs, synchronisés dans les deux sens. Le filtre Inactifs apparaît pour les triggers.

Après une action

Analyse, import, correction ou « Appliquer la sélection » → retour automatique à l’onglet 4 (résultats/erreurs).

Édition des objets

  • Vues, procédures, fonctions, triggers, packages, index et contraintes : SQL éditable, test à blanc, retour à l’original.
  • Index/contraintes : le SQL éditable porte sur CREATE INDEX ou ALTER TABLE … ADD CONSTRAINT ; l’état INACTIVE est conservé.
  • Triggers neutralisés : badge inactif et filtre dédié.
Source→Sélection→Édition SQL→ Analyse→Import→Journal

11 Champs et référentiels

Édition complèteajout de champ

Champs existants

  • Renommage, type cible, nullabilité (source / NULL / NOT NULL), valeur par défaut (vide = source, x = sans défaut, ? = retour au source).
  • Normalisation en table de référence (Enum…) avec clé identité ou texte, FK, casse/trim, NULL conservé.

Champ ajouté (absent de l’export)

Bouton + Ajouter un champ dans le panneau Champs :

OptionDétail
Nom / typeType SQL libre (INTEGER, VARCHAR, NUMERIC, TIMESTAMP…).
NullabilitéSi NOT NULL : une valeur par défaut ou un défaut conditionnel est exigé.
DéfautExpression SQL (0, 'N/C', CURRENT_TIMESTAMP…).
Défaut conditionnelTrigger BEFORE INSERT : si NULL, applique la valeur.
RéférenceFK vers une table/colonne (UNIQUE/PRIMARY KEY).
ALTER TABLE "CLIENT" ADD "STATUT" SMALLINT DEFAULT 0 NOT NULL;

CREATE TRIGGER "BI_CLIENT_STATUT" FOR "CLIENT"
ACTIVE BEFORE INSERT POSITION 0 AS
BEGIN
  IF (NEW."STATUT" IS NULL) THEN NEW."STATUT" = 0;
END

Appliqué après la création des tables et avant le chargement. Un champ NOT NULL est refusé sans défaut (immédiat ou conditionnel).

Référentiels (lookup)

  • Création d’une table LUT_… à partir des valeurs distinctes d’un champ, avec clé identité ou texte.
  • Alimentation distincte, FK, aperçu, mode structure seule.
  • Regroupement insensible à la casse et trim ; NULL conservé.

12 Transformations par table

Lot 1staging dumpUDR / EXECUTE BLOCK

Bouton Transformations… sur une table : stager des tables du dump complet (même non importées), exécuter un préambule, un script SQL libre, puis un postambule.

SectionRôle
Tables à stagerChargées dans FBX_STAGE_<table> depuis les dumps, puis supprimées.
PréambuleDéclarations UDR, fonctions PSQL, index. Exécuté avant le script.
ScriptUPDATE, MERGE, EXECUTE BLOCK, SET TERM accepté.
PostambuleContraintes après calcul : CHECK, NOT NULL, FK…
DDL→Champs ajoutés→Staging→ Chargement→Préambule→Script→ Postambule→DROP staging

Exemple

-- Préambule
CREATE OR ALTER FUNCTION FBX_UPPER (X VARCHAR(30)) RETURNS VARCHAR(30)
AS BEGIN RETURN UPPER(X); END

-- Script (JETON n'est pas importée, seulement stagée)
EXECUTE BLOCK AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE NOM VARCHAR(30);
BEGIN
  FOR SELECT C.ID, J.LIBELLE
        FROM CLIENT C
        JOIN FBX_STAGE_JETON J ON J.ID = C.ID
       INTO :ID, :NOM
  DO
    UPDATE CLIENT SET NOM = FBX_UPPER(:NOM), NOM2 = :NOM WHERE ID = :ID;
END

-- Postambule
ALTER TABLE CLIENT ADD CONSTRAINT CHK_NOM2 CHECK (NOM2 IS NOT NULL);
Une UDR doit être déclarée avant le bloc : mettez sa déclaration dans le préambule. La bibliothèque doit être présente dans le kit cible (elle l’est dans l’embedded).

13 Assistant de transformation

Lot 1génère le SQL

Dans le même dialogue, l’assistant construit la règle à partir des métadonnées du dump :

  • Champ cible (type, nullabilité) ;
  • Table source du dump (auto-stagée) et champs d’entrée ;
  • conditions cible ↔ source : =, !=, <>, <, <=, >, >=, LIKE, IS NULL, IS NOT NULL, condition calculée, combinaison AND/OR ;
  • mode : expression SQL, fonction PSQL/UDR, EXECUTE BLOCK ;
  • valeur si NULL / aucune ligne → COALESCE ;
  • compatibilité : compare la famille du type de sortie déclaré avec celle du champ cible, et alerte si NOT NULL sans repli.

Exemple généré

UPDATE "RM_SOURCE_DATA" T
   SET "SOURCE_DATA" = COALESCE(
       (SELECT FBX_X(S."SOURCE_DATA")
          FROM "FBX_STAGE_RM_SOURCE_DATA" S
         WHERE T."GUID" = S."GUID"), 'N/C')
 WHERE EXISTS (SELECT 1 FROM "FBX_STAGE_RM_SOURCE_DATA" S
                WHERE T."GUID" = S."GUID");

Ou en EXECUTE BLOCK avec clé de mise à jour, variables :INn, :KEYV, :OUTV.

Le SQL généré atterrit dans l’éditeur et reste modifiable. Il est enregistré dans transforms du contrat, puis exécuté par le moteur du lot 1.

14 Historique et transferts

  • Historique SQL : requêtes exécutées, succès/erreur, durée, lignes, base.
  • Historique des transferts : export/import, dossier, base cible, résultat, durée, lignes, journal.
  • Panneau « Transferts » et atelier « avant/après » partagent le même contexte.
  • Base système FBEXPERT.FB5 (registre, historique) ; sauvegarde/nettoyage possible.

15 Tests et qualité

627 + 460 avertissement
  • Tests unitaires : contrat, transformations DDL, types, champs, snippets, formatage, découpage SQL, magasins JSON.
  • Tests d’intégration réels sur moteur Firebird embarqué : import complet, versions 2.5 → 5.0, lots, triggers/index INACTIVE, packages, champs ajoutés, transformations.
  • Les collections de tests sont sérialisées : les tests E2E modifient l’environnement global du kit Firebird.
  • Build : 0 erreur / 0 avertissement.

16 Limites connues

  • Champs calculés : le type est une expression SQL libre, sans conversion automatique.
  • Champ ajouté : un homonyme déjà présent fait échouer l’ALTER TABLE (étape en erreur).
  • Référence FK : la colonne visée doit être UNIQUE/PRIMARY KEY ; la valeur par défaut doit exister.
  • Staging : les types viennent du DDL source ; un domaine absent de la cible fera échouer la création du staging.
  • UDR : la bibliothèque doit être présente dans le kit ; la déclaration doit précéder le bloc.
  • Transformations : règles au niveau table ; les presets réutilisables et le « Tester » sur base temporaire sont prévus au lot suivant.
  • Expression SQL : la compatibilité de sortie est vérifiée par Firebird à l’exécution ; l’assistant ne peut pas typer une expression arbitraire.

17 Journal des évolutions

VersionÉvolution
7.21Guide complet des fonctionnalités (cette page) : recherche, thème, journal et règle de maintenance.
7.20Assistant de transformation : champ cible, champs source, conditions de jointure, fonction/UDR, EXECUTE BLOCK, repli NULL, compatibilité.
7.19Transformations par table : staging du dump, préambule UDR/fonctions, SQL libre, postambule, nettoyage ; correctif EXECUTE BLOCK … DECLARE.
7.18Ajout de champ dans l’atelier : défaut, NOT NULL, FK, défaut conditionnel (trigger).
7.17README et PLAN remis à jour ; documentation centralisée.
7.16Liste redimensionnable, formatage SQL paramétrable, installation de sql-format.json.
7.15Atelier en onglets, filtres d’analyse synchronisés, barre d’actions.
7.14Auto-complétion contextuelle (COMMENT ON TABLE → Tables, etc.) et correctif catalogue/popup.
7.13Snippets versionnés, scripts d’installation Windows/Linux, page /snippets.
≤ 7.12Édition index/contraintes, lots EXECUTE BLOCK, triggers/index INACTIVE, référentiels, champs, export/import, ETL.

18 Maintenance de cette page

Règle : toute évolution fonctionnelle met à jour cette page et BACKLOG.md dans le même lot. La page est le guide de relecture ; le backlog reste le journal technique.

Checklist à chaque évolution

  1. Ajouter la section ou compléter la fonctionnalité concernée dans ce fichier.
  2. Mettre à jour la version et la date en tête (Version documentée, Dernière mise à jour).
  3. Ajouter une ligne au journal des évolutions.
  4. Mettre à jour les compteurs de tests/build si nécessaire.
  5. Ajouter l’entrée correspondante dans BACKLOG.md (section 7.x).

Fichiers de référence

FichierUsage
docs/features.htmlCette page : guide complet et lisible.
BACKLOG.mdJournal technique : causes, décisions, tests, validations.
README.mdInstallation, commandes, démarrage.
PLAN.mdCadrage initial (historique).
tools/fetch-kits.*Options d’installation des kits et paramètres.

Page autonome : un seul fichier HTML, CSS et JavaScript inclus, aucune ressource externe. Elle peut être ouverte directement dans un navigateur ou imprimée en PDF.