Charger le graphe d'enquête depuis SQLite #59
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Charger le graphe d'enquête depuis SQLite
Contexte
Le projet possède désormais :
EntityRecordetEntityDao;RelationRecordetRelationDao;InvestigationGraphModel.InvestigationGraphModelreprésente en mémoire :SQLite reste la source de vérité.
La future interface GTK et le futur tableau blanc ne doivent pas charger
directement les DAO ni gérer eux-mêmes le transfert de propriété des modèles.
Une couche dédiée doit construire un graphe complet et cohérent depuis la base
de données.
Objectif
Créer un composant
InvestigationGraphLoadercapable de :EntityDao;InvestigationGraphModel;RelationDao;Le composant doit rester indépendant de GTK.
Fichiers
Créer :
Type opaque
Le chargeur doit :
Databaseexistante ;Domaine d'erreur
Créer :
Ajouter :
Les erreurs provenant des DAO ou du graphe doivent être contextualisées sans
masquer leur message d'origine.
Construction
La fonction doit :
NULL;EntityDao;RelationDao;GError **facultatif.Destruction
La fonction doit :
NULL;Database.Chargement complet
La fonction doit retourner un nouveau graphe possédé par l'appelant.
Ordre obligatoire
Le chargement doit suivre cet ordre :
Les relations ne doivent jamais être ajoutées avant les entités.
Transfert de propriété
Les tableaux retournés par
EntityDaoetRelationDaopossèdent leursmodèles.
Lorsqu'un modèle est ajouté avec succès au graphe :
Lorsqu'un ajout échoue :
explicitement ;
freene doit être possible.L'implémentation doit donc transférer chaque pointeur de manière explicite.
Une stratégie valide consiste à :
NULLuniquement après le succès ;Aucun pointeur ne doit être abandonné.
Comportement en cas d'échec
Au moindre échec :
NULL;Exemples :
Échec pendant le chargement des entités
Échec pendant le transfert d'une entité
Échec pendant le transfert d'une relation
Base vide
Une base contenant :
doit produire un graphe valide et vide.
Ce cas ne constitue pas une erreur.
Cohérence des données
Si SQLite contient une relation dont :
le chargement doit échouer avec
INVESTIGATION_GRAPH_LOADER_ERROR_RELATION_TRANSFER.Le chargeur ne doit pas ignorer silencieusement la relation incohérente.
Le message doit inclure l'erreur produite par
InvestigationGraphModel.Absence de modification de SQLite
Le chargeur est strictement en lecture.
Il ne doit :
Tests
Créer :
Les tests doivent utiliser une base SQLite temporaire initialisée avec le
schéma réel.
Les données valides doivent être préparées avec les DAO existants.
Les incohérences impossibles à créer via les DAO peuvent être introduites par
SQL direct uniquement lorsque le test vise précisément leur détection.
Scénarios minimaux
NULL;NULL;NULL;GError **facultatif ;entitesest absente ;relationsest absente ;Test d'indépendance des graphes
Le test doit appeler deux fois :
Il doit vérifier que :
EntityRecordcorrespondants sont différents ;RelationRecordcorrespondants sont différents ;Chaque chargement doit donc reconstruire ses propres modèles depuis SQLite.
Test d'une relation incohérente
Pour tester une relation dont une entité est absente, les contraintes de clés
étrangères doivent être désactivées uniquement pour la préparation du cas de
test, puis réactivées avant le chargement.
Le test doit :
NULL;RELATION_TRANSFER;Cette manipulation ne doit jamais être utilisée dans le code de production.
Makefile
Ajouter :
Ajouter une cible dédiée compilant uniquement :
tests/test_investigation_graph_loader.c;src/core/investigation_graph_loader.c;src/dao/entity_dao.c;src/dao/relation_dao.c;src/models/investigation_graph_model.c;src/models/entity_record.c;src/models/relation_record.c;databasenécessaires.La cible ne doit inclure aucun autre fichier
tests/test_*.c.Ajouter
$(TEST_INVESTIGATION_GRAPH_LOADER):make test;make test;make clean.La compilation doit conserver :
Hors périmètre
Ce ticket ne couvre pas :
Le chargement asynchrone destiné à l'interface GTK fera l'objet d'un ticket
séparé après validation de ce chargeur synchrone.
Critères d'acceptation
InvestigationGraphLoaderest opaque.Database.make clean && make && make testréussit.git diff --checkne retourne aucune erreur.