labfy-investigation/src/models/investigation_record.c
2026-07-16 12:41:34 +02:00

199 lines
3.8 KiB
C

/******************************************************************************
* @file investigation_record.c
* @brief Implémentation du modèle InvestigationRecord.
******************************************************************************/
#include "models/investigation_record.h"
#include <glib.h>
#include <string.h>
/**
* @brief Représentation privée d'une enquête persistée.
*/
struct InvestigationRecord
{
char *id;
char *name;
char *root_path;
char *created_at;
char *updated_at;
};
/**
* @brief Vérifie qu'une chaîne obligatoire est présente et non vide.
*/
static gboolean investigation_record_text_is_valid(
const char *text
)
{
return text != NULL && text[0] != '\0';
}
/**
* @brief Copie une chaîne en utilisant une allocation non fatale.
*
* Contrairement à g_strdup(), cette fonction retourne NULL si
* l'allocation échoue au lieu d'interrompre le programme.
*/
static char *investigation_record_copy_text(
const char *text
)
{
char *text_copy = NULL;
gsize text_length = 0;
if (text == NULL)
{
return NULL;
}
text_length = strlen(text);
if (text_length == G_MAXSIZE)
{
return NULL;
}
text_copy = g_try_malloc(
text_length + 1
);
if (text_copy == NULL)
{
return NULL;
}
memcpy(
text_copy,
text,
text_length + 1
);
return text_copy;
}
InvestigationRecord *investigation_record_new(
const char *id,
const char *name,
const char *root_path,
const char *created_at,
const char *updated_at
)
{
InvestigationRecord *record = NULL;
if (!investigation_record_text_is_valid(id) ||
!investigation_record_text_is_valid(name) ||
!investigation_record_text_is_valid(root_path) ||
!investigation_record_text_is_valid(created_at) ||
!investigation_record_text_is_valid(updated_at))
{
return NULL;
}
record = g_try_new0(
InvestigationRecord,
1
);
if (record == NULL)
{
return NULL;
}
record->id = investigation_record_copy_text(id);
record->name = investigation_record_copy_text(name);
record->root_path = investigation_record_copy_text(root_path);
record->created_at = investigation_record_copy_text(created_at);
record->updated_at = investigation_record_copy_text(updated_at);
if (record->id == NULL ||
record->name == NULL ||
record->root_path == NULL ||
record->created_at == NULL ||
record->updated_at == NULL)
{
investigation_record_free(record);
return NULL;
}
return record;
}
void investigation_record_free(
InvestigationRecord *record
)
{
if (record == NULL)
{
return;
}
g_free(record->updated_at);
g_free(record->created_at);
g_free(record->root_path);
g_free(record->name);
g_free(record->id);
g_free(record);
}
const char *investigation_record_get_id(
const InvestigationRecord *record
)
{
if (record == NULL)
{
return NULL;
}
return record->id;
}
const char *investigation_record_get_name(
const InvestigationRecord *record
)
{
if (record == NULL)
{
return NULL;
}
return record->name;
}
const char *investigation_record_get_root_path(
const InvestigationRecord *record
)
{
if (record == NULL)
{
return NULL;
}
return record->root_path;
}
const char *investigation_record_get_created_at(
const InvestigationRecord *record
)
{
if (record == NULL)
{
return NULL;
}
return record->created_at;
}
const char *investigation_record_get_updated_at(
const InvestigationRecord *record
)
{
if (record == NULL)
{
return NULL;
}
return record->updated_at;
}