feat: associate relations with evidence

This commit is contained in:
grayTerminal-sh 2026-07-21 07:27:50 +02:00
parent b493ba6cd4
commit fbaaac583d
4 changed files with 3216 additions and 2 deletions

View file

@ -47,6 +47,7 @@ ENTITY_DAO_TEST_CFLAGS := $(TEST_CFLAGS) -Wpedantic
EVIDENCE_ENTITY_DAO_TEST_CFLAGS := $(TEST_CFLAGS) -Wpedantic
RELATION_RECORD_TEST_CFLAGS := $(TEST_CFLAGS) -Wpedantic
RELATION_DAO_TEST_CFLAGS := $(TEST_CFLAGS) -Wpedantic
RELATION_EVIDENCE_DAO_TEST_CFLAGS := $(TEST_CFLAGS) -Wpedantic
SRC := $(shell find src -name "*.c")
@ -94,6 +95,7 @@ TEST_ENTITY_DAO := tests/test_entity_dao
TEST_EVIDENCE_ENTITY_DAO := tests/test_evidence_entity_dao
TEST_RELATION_RECORD := tests/test_relation_record
TEST_RELATION_DAO := tests/test_relation_dao
TEST_RELATION_EVIDENCE_DAO := tests/test_relation_evidence_dao
all: $(TARGET)
@ -439,6 +441,22 @@ $(TEST_RELATION_DAO): \
src/database/error.c
$(CC) $(RELATION_DAO_TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) -lsqlite3
$(TEST_RELATION_EVIDENCE_DAO): \
tests/test_relation_evidence_dao.c \
src/dao/relation_evidence_dao.c \
src/dao/relation_dao.c \
src/dao/evidence_dao.c \
src/dao/entity_dao.c \
src/models/relation_record.c \
src/models/evidence_record.c \
src/models/entity_record.c \
src/database/database.c \
src/database/schema.c \
src/database/statement.c \
src/database/transaction.c \
src/database/error.c
$(CC) $(RELATION_EVIDENCE_DAO_TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) -lsqlite3
test: \
$(TEST_NODE) \
$(TEST_TREE_MODEL) \
@ -479,7 +497,8 @@ test: \
$(TEST_ENTITY_DAO) \
$(TEST_EVIDENCE_ENTITY_DAO) \
$(TEST_RELATION_RECORD) \
$(TEST_RELATION_DAO)
$(TEST_RELATION_DAO) \
$(TEST_RELATION_EVIDENCE_DAO)
@echo "Exécution des tests..."
@./$(TEST_NODE)
@./$(TEST_TREE_MODEL)
@ -521,6 +540,7 @@ test: \
@$(TEST_EVIDENCE_ENTITY_DAO)
@$(TEST_RELATION_RECORD)
@$(TEST_RELATION_DAO)
@$(TEST_RELATION_EVIDENCE_DAO)
@echo "Tous les tests sont valides."
%.o: %.c
@ -568,6 +588,7 @@ clean:
$(TEST_ENTITY_DAO) \
$(TEST_EVIDENCE_ENTITY_DAO) \
$(TEST_RELATION_RECORD) \
$(TEST_RELATION_DAO)
$(TEST_RELATION_DAO) \
$(TEST_RELATION_EVIDENCE_DAO)
.PHONY: clean run test

View file

@ -0,0 +1,218 @@
/******************************************************************************
* @file relation_evidence_dao.h
* @brief Persistance des associations entre relations et preuves.
******************************************************************************/
#ifndef LABFY_INVESTIGATION_RELATION_EVIDENCE_DAO_H
#define LABFY_INVESTIGATION_RELATION_EVIDENCE_DAO_H
#include "database/database.h"
#include <glib.h>
G_BEGIN_DECLS
/**
* @brief DAO opaque des associations entre relations et preuves.
*
* Le DAO emprunte la connexion Database reçue lors de sa création.
*/
typedef struct RelationEvidenceDao RelationEvidenceDao;
/**
* @brief Catégories d'erreurs produites par RelationEvidenceDao.
*/
typedef enum
{
/**
* Un argument public est invalide.
*/
RELATION_EVIDENCE_DAO_ERROR_INVALID_ARGUMENT,
/**
* L'allocation d'une ressource a échoué.
*/
RELATION_EVIDENCE_DAO_ERROR_MEMORY,
/**
* La requête SQLite n'a pas pu être préparée.
*/
RELATION_EVIDENCE_DAO_ERROR_PREPARE,
/**
* Un paramètre n'a pas pu être lié à la requête.
*/
RELATION_EVIDENCE_DAO_ERROR_BIND,
/**
* La requête SQLite n'a pas pu être exécutée.
*/
RELATION_EVIDENCE_DAO_ERROR_EXECUTE,
/**
* Une contrainte SQLite a é violée.
*/
RELATION_EVIDENCE_DAO_ERROR_CONSTRAINT,
/**
* Un enregistrement ou une association demandée n'existe pas.
*/
RELATION_EVIDENCE_DAO_ERROR_NOT_FOUND,
/**
* Une ligne SQLite n'a pas pu être lue.
*/
RELATION_EVIDENCE_DAO_ERROR_READ,
/**
* La table ou une colonne attendue est absente.
*/
RELATION_EVIDENCE_DAO_ERROR_SCHEMA
} RelationEvidenceDaoError;
/**
* @brief Domaine d'erreur du DAO.
*/
#define RELATION_EVIDENCE_DAO_ERROR \
relation_evidence_dao_error_quark()
/**
* @brief Retourne le domaine d'erreur du DAO.
*/
GQuark relation_evidence_dao_error_quark(void);
/**
* @brief Crée un DAO utilisant une connexion Database existante.
*
* La connexion est empruntée et doit rester valide pendant toute
* la durée de vie du DAO.
*
* @param database Connexion SQLite ouverte.
* @param error Emplacement facultatif recevant une erreur.
*
* @return Nouveau DAO, ou NULL en cas d'échec.
*/
RelationEvidenceDao *relation_evidence_dao_new(
Database *database,
GError **error
);
/**
* @brief Libère le DAO.
*
* La connexion Database empruntée n'est pas fermée.
* Cette fonction accepte NULL.
*
* @param relation_evidence_dao DAO à libérer.
*/
void relation_evidence_dao_free(
RelationEvidenceDao *relation_evidence_dao
);
/**
* @brief Associe une relation à une preuve.
*
* Les deux UUID doivent correspondre à des enregistrements existants.
* Une association déjà existante produit une erreur de contrainte.
*
* @param relation_evidence_dao DAO valide.
* @param relation_identifier UUID de la relation.
* @param evidence_identifier UUID de la preuve.
* @param error Emplacement facultatif recevant une erreur.
*
* @return TRUE si l'association est créée.
*/
gboolean relation_evidence_dao_link(
RelationEvidenceDao *relation_evidence_dao,
const char *relation_identifier,
const char *evidence_identifier,
GError **error
);
/**
* @brief Supprime une association entre une relation et une preuve.
*
* Une association absente produit RELATION_EVIDENCE_DAO_ERROR_NOT_FOUND.
*
* La relation et la preuve ne sont jamais supprimées.
*
* @param relation_evidence_dao DAO valide.
* @param relation_identifier UUID de la relation.
* @param evidence_identifier UUID de la preuve.
* @param error Emplacement facultatif recevant une erreur.
*
* @return TRUE si l'association est supprimée.
*/
gboolean relation_evidence_dao_unlink(
RelationEvidenceDao *relation_evidence_dao,
const char *relation_identifier,
const char *evidence_identifier,
GError **error
);
/**
* @brief Vérifie si une association existe.
*
* @param relation_evidence_dao DAO valide.
* @param relation_identifier UUID de la relation.
* @param evidence_identifier UUID de la preuve.
* @param out_exists Destination du résultat.
* @param error Emplacement facultatif recevant une erreur.
*
* @return TRUE si la recherche a é exécutée correctement.
*/
gboolean relation_evidence_dao_exists(
RelationEvidenceDao *relation_evidence_dao,
const char *relation_identifier,
const char *evidence_identifier,
gboolean *out_exists,
GError **error
);
/**
* @brief Liste les UUID des preuves liées à une relation.
*
* Les identifiants sont triés par ordre lexicographique croissant.
*
* Le tableau et les chaînes qu'il contient appartiennent à l'appelant.
* Le tableau utilise g_free() comme fonction de destruction.
*
* Une relation sans association produit un tableau vide.
*
* @param relation_evidence_dao DAO valide.
* @param relation_identifier UUID de la relation.
* @param error Emplacement facultatif recevant une erreur.
*
* @return Nouveau GPtrArray de chaînes, ou NULL en cas d'échec.
*/
GPtrArray *relation_evidence_dao_list_evidence_identifiers(
RelationEvidenceDao *relation_evidence_dao,
const char *relation_identifier,
GError **error
);
/**
* @brief Liste les UUID des relations liées à une preuve.
*
* Les identifiants sont triés par ordre lexicographique croissant.
*
* Le tableau et les chaînes qu'il contient appartiennent à l'appelant.
* Le tableau utilise g_free() comme fonction de destruction.
*
* Une preuve sans association produit un tableau vide.
*
* @param relation_evidence_dao DAO valide.
* @param evidence_identifier UUID de la preuve.
* @param error Emplacement facultatif recevant une erreur.
*
* @return Nouveau GPtrArray de chaînes, ou NULL en cas d'échec.
*/
GPtrArray *relation_evidence_dao_list_relation_identifiers(
RelationEvidenceDao *relation_evidence_dao,
const char *evidence_identifier,
GError **error
);
G_END_DECLS
#endif

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff