Ajouter l’ouverture d’une enquête existante #29
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?
Ticket #028 — Ajouter l’ouverture d’une enquête existante
Contexte
Les tickets précédents ont permis de mettre en place :
Database;DatabaseStatement;InvestigationRecord;InvestigationDaopermettant de charger l’unique ligne de la tableinvestigation.Le projet possède également un type
InvestigationProjectchargé de représenter les chemins du projet sur le système de fichiers, notamment :Enquete.sqlite.Cependant, l’application ne possède pas encore d’objet représentant une enquête réellement ouverte pendant son exécution.
Les différentes ressources sont encore séparées :
Il faut désormais les regrouper dans un contexte cohérent dont la durée de vie correspond à celle d’une enquête ouverte.
Objectif
Créer un type opaque
InvestigationSessionchargé d’ouvrir une enquête existante et de conserver :InvestigationProject;Database;InvestigationRecord.L’ouverture doit vérifier que le dossier sélectionné correspond bien aux informations enregistrées dans la base SQLite.
La connexion SQLite doit rester ouverte pendant toute la durée de vie de la session afin de permettre les futurs appels aux DAO.
Architecture attendue
Travail à réaliser
1. Créer le type
InvestigationSessionCréer les fichiers :
Le type doit être opaque :
Sa représentation privée doit contenir au minimum :
Le header public ne doit pas exposer cette structure.
2. Définir les erreurs d’ouverture
Créer une énumération dédiée :
Définir un domaine d’erreur GLib :
Les erreurs doivent être transmises avec un paramètre :
Lorsqu’une erreur provenant de
Databasedoit être propagée, son message doit être copié dans leGErroravant la fermeture de la connexion.3. Ajouter la fonction d’ouverture
Déclarer :
La fonction doit ouvrir une enquête déjà existante à partir de son dossier racine.
Elle ne doit pas créer une nouvelle enquête.
4. Valider les paramètres
La fonction doit refuser :
Le code d’erreur attendu est :
Le paramètre
errorpeut êtreNULL.Si
errorn’est pasNULL, il doit respecter les conventions GLib :au moment de l’appel.
5. Vérifier le dossier racine
Le chemin fourni doit correspondre à un dossier existant.
La fonction doit vérifier :
Un chemin inexistant ou qui ne représente pas un dossier doit produire :
Le chemin doit être normalisé avec :
La session doit travailler à partir de ce chemin canonique.
6. Construire
InvestigationProjectRéutiliser l’API existante de
InvestigationProject.La logique de construction du chemin de la base ne doit pas être dupliquée dans
InvestigationSession.Le chemin attendu reste géré par
InvestigationProject:Si l’API actuelle de
InvestigationProjectne permet pas de représenter un projet existant, elle peut être étendue de manière minimale.Aucune logique SQLite ne doit être ajoutée dans
InvestigationProject.7. Vérifier le fichier SQLite
Avant l’ouverture de la connexion, vérifier que le chemin retourné par
InvestigationProjectcorrespond à un fichier régulier :Si le fichier n’existe pas, retourner :
L’ouverture d’une enquête existante ne doit jamais créer silencieusement une nouvelle base vide.
8. Ouvrir la connexion Database
Utiliser :
La fonction
investigation_session_open()ne doit pas appeler directement :Si
database_open()échoue, retourner :La connexion doit rester ouverte si la session est créée avec succès.
9. Charger l’enquête persistée
Utiliser :
Le DAO doit retourner un
InvestigationRecord.Si le chargement échoue :
Database;GError;NULL;Le code d’erreur de session attendu est :
10. Vérifier la cohérence du chemin racine
Le chemin sélectionné doit correspondre au champ persistant :
Comparer les versions canoniques de :
La comparaison doit être faite après normalisation avec :
Si les chemins ne correspondent pas, l’ouverture doit échouer avec :
Cette vérification évite d’ouvrir une base copiée ou déplacée sans détecter l’incohérence.
Le déplacement volontaire d’une enquête sera traité dans un ticket distinct.
11. Construire la session
La session ne doit être créée qu’après validation complète :
En cas d’échec d’allocation, retourner :
12. Ajouter la fonction de fermeture
Déclarer :
Cette fonction doit accepter
NULL.Elle doit libérer toutes les ressources possédées par la session :
La session devient propriétaire de ces trois objets dès que son ouverture réussit.
13. Ajouter les accesseurs
Ajouter :
Les pointeurs retournés appartiennent à la session et ne doivent pas être libérés par l’appelant.
Les accesseurs doivent retourner
NULLsi la session reçue estNULL.Databasereste non constante car les futurs DAO auront besoin d’une connexion modifiable.14. Interdire les dépendances SQLite et GTK
Le module
InvestigationSessionne doit pas inclure :Il doit exclusivement utiliser les abstractions existantes :
Tests à ajouter
Créer :
Test d’ouverture valide
Créer un dossier temporaire.
Initialiser une base avec :
Ouvrir ensuite l’enquête avec :
Vérifier :
NULL;created_atn’est pas vide ;updated_atn’est pas vide ;Test des paramètres invalides
Vérifier :
Le code attendu est :
Vérifier également le comportement avec :
Test d’un dossier inexistant
Utiliser un chemin inexistant.
Vérifier :
Test d’un chemin qui n’est pas un dossier
Créer un fichier temporaire et utiliser son chemin comme racine.
Vérifier :
Test d’une base absente
Créer une structure de projet valide sans fichier :
Vérifier :
La fonction ne doit pas créer de nouveau fichier SQLite.
Test d’une base invalide
Créer un fichier SQLite vide ou une base ne contenant pas la table :
Vérifier :
Test d’un chemin racine incohérent
Créer une base avec un chemin racine enregistré différent du dossier utilisé pour l’ouverture.
Vérifier :
Test des accesseurs avec NULL
Vérifier :
Vérifier également :
Test de réutilisation du DAO
Après l’ouverture valide d’une session, appeler de nouveau :
Vérifier que la connexion reste fonctionnelle pendant toute la durée de vie de la session.
Gestion de la mémoire
Toutes les sorties d’échec de
investigation_session_open()doivent libérer les ressources déjà créées.Le nettoyage doit couvrir les cas suivants :
Aucun objet ne doit être libéré deux fois.
Aucune ressource temporaire ne doit rester allouée :
Makefile
Ajouter :
Ajouter une règle compilant au minimum :
Lier avec :
Ajouter le test aux cibles :
La nouvelle sortie attendue est :
Critères d’acceptation
InvestigationSessionest opaque.InvestigationProject.Database.InvestigationRecord.InvestigationProject.database_open().InvestigationDao.NULL.GError.makeréussit sans erreur.make testréussit.git diff --checkne retourne aucune erreur.Audit attendu
Les commandes suivantes ne doivent rien afficher :
Vérifier également que la logique du chemin SQLite n’est pas dupliquée :
Le résultat attendu est aucune occurrence, sauf éventuellement dans un commentaire de documentation justifié.
Hors périmètre
Ce ticket ne doit pas ajouter :
investigation.root_path;Fichiers principalement concernés
Une adaptation limitée de ces fichiers est autorisée si nécessaire :
Résultat attendu
À la fin du ticket, le programme doit pouvoir ouvrir une enquête existante à partir de son dossier racine.
Une session valide doit conserver ensemble :
Cette session deviendra le contexte principal utilisé ultérieurement par l’interface et les futurs DAO.
Commit attendu
Une fois tous les critères d’acceptation validés :
Avant le commit :
Préparer les fichiers :
Ajouter également les fichiers
InvestigationProjectuniquement s’ils ont réellement été modifiés :Contrôler le contenu préparé :
Créer le commit :
Le push ne doit être effectué qu’après validation complète de la compilation, des tests et du contenu du commit.