1 Vue d’ensemble
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
| Projet | Rôle |
|---|---|
FbExpert.Domain | Entités et énumérations, sans dépendance. |
FbExpert.Application | Contrats, snippets, formatage, découpage SQL, règles pures. |
FbExpert.Infrastructure | Firebird, export/import, pipeline ETL, magasins JSON, transformations. |
FbExpert.Engines | Catalogue des kits moteurs (versions, validation). |
FbExpert.Blazor | Interface Blazor/Radzen. |
FirebirdSql.Data.FirebirdClient | Client Firebird compilé dans la solution. |
FbExpert.Infrastructure.Tests | 627 tests (unitaires + E2E moteur). |
FbExpert.Engines.Tests | 46 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.
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ément | Rôle |
|---|---|
engines/<version>/ | Kit Firebird (client, plugins, outils, kit.json). |
data/FBEXPERT.FB5 | Base système : registre des bases, historique, transferts. |
sql-snippets.json | Catalogue de snippets (fournis + personnalisés). |
sql-format.json | Options de formatage SQL. |
transfers/ | Dossiers d’export/import par défaut. |
4 Explorateur de schéma
- 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
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 … ENDn’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
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égorie | Exemples |
|---|---|
| DDL | Table, IDENTITY, BOOLEAN, DECFLOAT, INT128, TIME ZONE, vue, domaine, séquence, index, contraintes, commentaire, rôle. |
| PSQL | Procédure 2.5/3.0+, fonction, trigger 2.5/3.0+, trigger DDL, package en-tête/corps, EXECUTE BLOCK. |
| DML / Requêtes | MERGE, 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
Bouton Formater + Options… dans l’éditeur d’objet et le panneau Script SQL.
| Option | Effet |
|---|---|
| Indentation | Tabulations ou 2/3/4 espaces. |
| Une colonne par ligne | Chaque champ de la liste SELECT sur sa ligne. |
| Virgules en début de ligne | Style ,colonne avec alignement du premier champ. |
| ON sur la ligne du JOIN | LEFT JOIN T ON … au lieu d’isoler ON. |
| Mots-clés en majuscules | Active/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
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
- 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
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(optionoptions.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.
10 Atelier de migration
Page /migration, organisée en onglets :
| Onglet | Contenu |
|---|---|
| 1 · Source et cible | Dossier 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 SQL | Panneau 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 INDEXouALTER TABLE … ADD CONSTRAINT; l’étatINACTIVEest conservé. - Triggers neutralisés : badge
inactifet filtre dédié.
11 Champs et référentiels
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 :
| Option | Détail |
|---|---|
| Nom / type | Type SQL libre (INTEGER, VARCHAR, NUMERIC, TIMESTAMP…). |
| Nullabilité | Si NOT NULL : une valeur par défaut ou un défaut conditionnel est exigé. |
| Défaut | Expression SQL (0, 'N/C', CURRENT_TIMESTAMP…). |
| Défaut conditionnel | Trigger BEFORE INSERT : si NULL, applique la valeur. |
| Référence | FK 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
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.
| Section | Rôle |
|---|---|
| Tables à stager | Chargées dans FBX_STAGE_<table> depuis les dumps, puis supprimées. |
| Préambule | Déclarations UDR, fonctions PSQL, index. Exécuté avant le script. |
| Script | UPDATE, MERGE, EXECUTE BLOCK, SET TERM accepté. |
| Postambule | Contraintes après calcul : CHECK, NOT NULL, FK… |
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);
13 Assistant de transformation
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, combinaisonAND/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.
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é
- 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.21 | Guide complet des fonctionnalités (cette page) : recherche, thème, journal et règle de maintenance. |
| 7.20 | Assistant de transformation : champ cible, champs source, conditions de jointure, fonction/UDR, EXECUTE BLOCK, repli NULL, compatibilité. |
| 7.19 | Transformations par table : staging du dump, préambule UDR/fonctions, SQL libre, postambule, nettoyage ; correctif EXECUTE BLOCK … DECLARE. |
| 7.18 | Ajout de champ dans l’atelier : défaut, NOT NULL, FK, défaut conditionnel (trigger). |
| 7.17 | README et PLAN remis à jour ; documentation centralisée. |
| 7.16 | Liste redimensionnable, formatage SQL paramétrable, installation de sql-format.json. |
| 7.15 | Atelier en onglets, filtres d’analyse synchronisés, barre d’actions. |
| 7.14 | Auto-complétion contextuelle (COMMENT ON TABLE → Tables, etc.) et correctif catalogue/popup. |
| 7.13 | Snippets 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
BACKLOG.md dans le même lot. La page est le guide de relecture ; le backlog reste le journal technique.
Checklist à chaque évolution
- Ajouter la section ou compléter la fonctionnalité concernée dans ce fichier.
- Mettre à jour la version et la date en tête (
Version documentée,Dernière mise à jour). - Ajouter une ligne au journal des évolutions.
- Mettre à jour les compteurs de tests/build si nécessaire.
- Ajouter l’entrée correspondante dans
BACKLOG.md(section 7.x).
Fichiers de référence
| Fichier | Usage |
|---|---|
docs/features.html | Cette page : guide complet et lisible. |
BACKLOG.md | Journal technique : causes, décisions, tests, validations. |
README.md | Installation, commandes, démarrage. |
PLAN.md | Cadrage 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.