Créer le schéma SQLite et le DAO des preuves #46
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 schéma SQLite et le DAO des preuves
Contexte
Labfy Investigation dispose maintenant d’un modèle métier opaque
EvidenceRecord.Le modèle représente une preuve numérique sans dépendre :
L’étape suivante consiste à rendre ces enregistrements persistants dans la base SQLite de l’enquête.
Ce ticket ajoute :
Le calcul SHA-256, la copie sûre et l’import depuis l’interface restent hors périmètre.
Objectif
Créer une table SQLite dédiée aux preuves et un DAO capable de :
EvidenceRecord;EvidenceRecordvalide depuis SQLite ;sqlite3_stmtau reste de l’application.Le DAO ne doit contenir aucune logique GTK ni aucune opération de fichier.
1. Architecture
Créer de préférence :
Adapter les chemins seulement si le projet utilise déjà un autre dossier pour les DAO.
Le schéma doit être ajouté au mécanisme existant d’initialisation ou de migration SQLite.
Ne pas exécuter un
CREATE TABLEcaché dans une fonction d’insertion.2. Table SQLite
Créer une table :
Le nom exact peut être adapté aux conventions du schéma existant, mais les informations doivent rester équivalentes.
Contraintes obligatoires
La table doit garantir au minimum :
Ajouter des contraintes SQLite lorsque cela reste lisible et fiable :
Le DAO doit continuer à valider les données via
EvidenceRecord.Choix volontaire
sha256ne doit pas êtreUNIQUE.Deux enregistrements peuvent représenter le même contenu provenant de sources ou de contextes différents.
La détection de doublons sera traitée dans le service d’import.
3. Migration et idempotence
L’initialisation du schéma doit être idempotente.
Ouvrir plusieurs fois la même enquête ne doit pas :
Utiliser le mécanisme de migration déjà présent dans le projet.
S’il n’existe pas encore, ce ticket doit introduire une version de schéma explicite, par exemple avec :
Une migration doit être exécutée dans une transaction.
En cas d’échec :
4. Type opaque
EvidenceDaoDéclarer :
Le DAO emprunte la connexion ou le composant
Databaseexistant.Il ne doit pas ouvrir une seconde connexion SQLite indépendante lorsque la session possède déjà une connexion active.
Le nom du type de connexion doit suivre le module actuel du projet.
5. Erreurs
Définir :
Ajouter :
Les messages doivent conserver le contexte SQLite sans exposer des informations inutiles à l’utilisateur final.
6. Constructeur et destruction
API indicative :
Règles :
databaseest emprunté ;EvidenceDaone détruit pas la base ;evidence_dao_free(NULL)est accepté.Adapter
Databaseau type réel déjà utilisé par le projet.7. Insertion
Ajouter :
Le DAO doit utiliser une requête préparée :
Règles :
sqlite3_bind_*;NULLpour les champs facultatifs absents ;EvidenceRecordreçu ;Les conflits suivants doivent être distinguables dans le message :
Aucune suppression ni mise à jour automatique ne doit être effectuée.
8. Recherche par identifiant
Ajouter :
Comportement :
Le modèle retourné appartient à l’appelant.
La requête doit être préparée :
9. Liste des preuves
Ajouter :
Le tableau doit :
evidence_record_freecomme fonction de destruction ;NULL.Ordre initial :
Chaque ligne doit être reconstruite avec
evidence_record_new().Une ligne invalide doit faire échouer toute la lecture plutôt que retourner une liste partielle silencieuse.
10. Comptage
Ajouter :
Requête :
Règles :
out_countest obligatoire ;*out_countà0avant la requête ;11. Immutabilité des preuves
Ce ticket ne doit pas ajouter :
Une preuve enregistrée ne doit pas être écrasée silencieusement.
Les futures modifications d’intégrité ou de description devront passer par des opérations métier explicites et auditées.
12. Conversion SQLite vers modèle
Créer une fonction privée centralisée, par exemple :
Elle doit :
NULL;size_bytesest positif ou nul ;EvidenceIntegrityStatus;evidence_record_new();Ne pas dupliquer ce code dans
findetlist.13. Transactions
Une insertion simple peut être exécutée sans transaction explicite si elle ne modifie qu’une seule ligne.
Le futur service d’import utilisera une transaction englobant :
Le DAO ne doit donc pas démarrer ou valider une transaction de manière cachée dans
evidence_dao_insert().Il doit fonctionner lorsqu’une transaction externe est déjà active.
14. Tests attendus
Utiliser une base temporaire dédiée aux tests.
Ajouter au minimum :
NULL;evidenceprésente après initialisation ;NULL;evidence_dao_free(NULL);GErrorfacultatif ;Les tests ne doivent utiliser aucune interface GTK.
15. Base temporaire
Ne pas utiliser la base d’une vraie enquête.
Créer une base temporaire avec les utilitaires GLib, puis la supprimer à la fin du test.
Les tests doivent être indépendants :
Privilégier une fixture lorsque cela simplifie la création et la destruction de la base.
16. Propriété mémoire
DAO
Insertion
Recherche
Liste
Toutes les requêtes préparées doivent être finalisées sur chaque chemin de sortie.
17. Hors périmètre
Ne pas ajouter dans ce ticket :
GFile;18. Audit de sécurité
Aucune requête ne doit être construite avec :
pour y injecter des données utilisateur.
Cette commande doit confirmer l’utilisation de statements préparés :
Cette commande ne doit trouver aucune concaténation de valeur dans du SQL :
19. Audit d’architecture
Cette commande ne doit rien afficher :
Cette commande ne doit rien afficher :
20. Critères d’acceptation
evidenceest créée par le mécanisme de schéma.EvidenceDaoest opaque.NULL.EvidenceRecord.NULLsans erreur.makeréussit sans warning.git diff --checkne remonte aucune erreur.21. Validation finale
Puis :
Résultat attendu :
22. Fichiers concernés
Les chemins exacts doivent suivre l’organisation existante du module SQLite.
Fichiers attendus :
Ainsi que le ou les fichiers existants responsables :
Aucun fichier GTK ne doit être modifié.
Résultat attendu
À la fin du ticket, une enquête peut conserver et relire des
EvidenceRecorddans sa base SQLite.Le ticket suivant ajoutera le calcul SHA-256 d’un fichier sans encore l’importer.