Créer le service transactionnel de gestion des relations #57
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?
Créer le service transactionnel de gestion des relations
Contexte
Les composants suivants existent désormais :
RelationRecord;RelationDao;RelationEvidenceDao;EvidenceDao;Une relation peut être insérée dans la table
relations, puis associée à uneou plusieurs preuves dans la table
relation_preuves.Ces opérations ne doivent pas être exécutées séparément par l'interface GTK
ou par le futur graphe interactif. Une erreur pendant l'association des
preuves ne doit jamais laisser une relation partiellement créée.
La création d'une relation et de toutes ses associations doit donc constituer
une seule opération métier atomique.
Objectif
Créer un service métier
RelationServicechargé de coordonner :Le service doit rester indépendant de GTK.
Fichiers
Créer :
Type opaque
Le service doit :
Databaseexistante ;Domaine d'erreur
Créer :
Ajouter :
Les messages d'erreur doivent conserver un contexte métier compréhensible.
Lorsqu'une erreur provient d'un DAO, le message d'origine doit être inclus
dans le message remonté par le service.
Construction
La fonction doit :
NULL;GError **facultatif.Destruction
La fonction doit :
NULL;Database.Création transactionnelle
Propriété des paramètres
Le service emprunte :
relation_record;evidence_identifiers;Il ne doit modifier ni libérer ces objets.
evidence_identifierspeut êtreNULLou vide.Validation avant transaction
Avant toute écriture, la fonction doit :
RelationRecordabsent ;NULL;NULL;Une erreur de validation ne doit ouvrir aucune transaction et ne doit produire
aucune écriture.
Transaction
L'opération doit suivre exactement ce déroulement :
En cas d'échec :
Le service doit utiliser l'infrastructure de transaction existante du projet.
Il ne doit pas exécuter directement de requête SQL métier : les écritures
doivent passer par
RelationDaoetRelationEvidenceDao.Atomicité
Les comportements suivants sont obligatoires :
annulées ;
réussie ;
TRUEsignifie que la relation et toutes les associations sontpersistées ;
FALSEsignifie que l'opération complète a échoué.Échec du rollback
Si l'opération métier échoue puis que le rollback échoue également :
FALSE;RELATION_SERVICE_ERROR_TRANSACTION_ROLLBACK;Le service ne doit jamais masquer silencieusement l'échec d'un rollback.
Absence de preuves
Une relation sans preuve associée reste autorisée par ce ticket.
Cette décision évite d'introduire une règle que le schéma actuel ne peut pas
nuancer entre :
La gestion de ces catégories et l'obligation éventuelle d'une provenance
feront l'objet d'un ticket métier séparé.
Doublons dans la demande
Le tableau suivant est invalide :
Le service doit détecter ce doublon avant d'ouvrir la transaction.
Il ne doit pas attendre la contrainte SQLite pour découvrir cette erreur.
Tests
Créer :
Les tests doivent utiliser une base SQLite temporaire initialisée avec le
schéma réel.
Les entités et preuves nécessaires doivent être créées avec les DAO existants.
Scénarios minimaux
NULL;relation_service_free(NULL);NULL;NULL;NULL;précédent ;
utilisable ;
evidence_identifiers == NULL;GError **facultatif ;Vérification de l'atomicité
Le test principal d'atomicité doit utiliser :
Après l'échec attendu, le test doit vérifier directement que :
Makefile
Ajouter :
Ajouter une cible dédiée compilant uniquement :
tests/test_relation_service.c;src/core/relation_service.c;src/dao/relation_dao.c;src/dao/relation_evidence_dao.c;La cible ne doit inclure aucun autre fichier
tests/test_*.c.Ajouter
$(TEST_RELATION_SERVICE):make test;make test;make clean.La compilation doit conserver :
Hors périmètre
Ce ticket ne couvre pas :
Critères d'acceptation
RelationServiceest opaque.Database.make clean && make && make testréussit.git diff --checkne retourne aucune erreur.