diff options
Diffstat (limited to 'src/analysis/db/item.c')
-rw-r--r-- | src/analysis/db/item.c | 151 |
1 files changed, 121 insertions, 30 deletions
diff --git a/src/analysis/db/item.c b/src/analysis/db/item.c index 7fa1a52..746ca27 100644 --- a/src/analysis/db/item.c +++ b/src/analysis/db/item.c @@ -24,6 +24,7 @@ #include "item.h" +#include <assert.h> #include <malloc.h> #include <sqlite3.h> @@ -61,7 +62,10 @@ static bool g_db_item_send_to_fd(const GDbItem *, int, int); /* Constitue les champs destinés à une insertion / modification. */ -static bool _g_db_item_prepare_db_statement(const GDbItem *, bool, bound_value **, size_t *); +static bool _g_db_item_prepare_db_statement(const GDbItem *, bound_value **, size_t *); + +/* Charge les valeurs utiles pour un élément de collection. */ +static bool _g_db_item_load(GDbItem *, const bound_value *, size_t); @@ -96,6 +100,7 @@ static void g_db_item_class_init(GDbItemClass *klass) klass->send = (send_db_item_fc)g_db_item_send_to_fd; klass->prepare_stmt = (prepare_db_statement)_g_db_item_prepare_db_statement; + klass->load = (load_db_item_fc)_g_db_item_load; } @@ -114,6 +119,15 @@ static void g_db_item_class_init(GDbItemClass *klass) static void g_db_item_init(GDbItem *item) { + const char *author; /* Identification à diffuser */ + bool status; /* Bilan d'une obtention */ + + status = g_generic_config_get_value(get_main_configuration(), MPK_AUTHOR_NAME, &author); + assert(status); + + set_rle_string(&item->author, author); + + item->is_volatile = false; } @@ -193,7 +207,7 @@ static gint g_db_item_cmp(GDbItem *a, GDbItem *b) result = -1; else - result = 0; + result = cmp_rle_string(&a->label, &b->label); } @@ -241,16 +255,25 @@ static bool g_db_item_recv_from_fd(GDbItem *item, int fd, int flags) uint64_t val64; /* Valeur sur 64 bits */ bool status; /* Bilan d'une réception */ - status = safe_recv(fd, &val64, sizeof(uint64_t), flags); + status = safe_recv(fd, &val64, sizeof(uint64_t), MSG_WAITALL | flags); if (!status) return false; item->created = be64toh(val64); - status = safe_recv(fd, &val64, sizeof(uint64_t), flags); + status = safe_recv(fd, &val64, sizeof(uint64_t), MSG_WAITALL | flags); if (!status) return false; item->modified = be64toh(val64); + status = recv_rle_string(&item->author, fd, flags); + if (!status) return false; + + status = recv_rle_string(&item->tool, fd, flags); + if (!status) return false; + + status = recv_rle_string(&item->label, fd, flags); + if (!status) return false; + return true; } @@ -295,14 +318,19 @@ static bool g_db_item_send_to_fd(const GDbItem *item, int fd, int flags) { bool status; /* Bilan d'une émission */ + status = safe_send(fd, (uint64_t []) { htobe64(item->created) }, sizeof(uint64_t), MSG_MORE | flags); + if (!status) return false; - printf("<sending> FROM %s...\n", __FUNCTION__); + status = safe_send(fd, (uint64_t []) { htobe64(item->modified) }, sizeof(uint64_t), MSG_MORE | flags); + if (!status) return false; + status = send_rle_string(&item->author, fd, MSG_MORE | flags); + if (!status) return false; - status = safe_send(fd, (uint64_t []) { htobe64(item->created) }, sizeof(uint64_t), MSG_MORE | flags); + status = send_rle_string(&item->tool, fd, MSG_MORE | flags); if (!status) return false; - status = safe_send(fd, (uint64_t []) { htobe64(item->modified) }, sizeof(uint64_t), flags); + status = send_rle_string(&item->label, fd, flags); if (!status) return false; return true; @@ -379,7 +407,6 @@ bool g_db_item_is_volatile(const GDbItem *item) /****************************************************************************** * * * Paramètres : item = base d'éléments sur laquelle s'appuyer. * -* create = indique si la préparation vise une création ou non. * * values = couples de champs et de valeurs à lier. [OUT] * * count = nombre de ces couples. [OUT] * * * @@ -391,35 +418,35 @@ bool g_db_item_is_volatile(const GDbItem *item) * * ******************************************************************************/ -static bool _g_db_item_prepare_db_statement(const GDbItem *item, bool create, bound_value **values, size_t *count) +static bool _g_db_item_prepare_db_statement(const GDbItem *item, bound_value **values, size_t *count) { - char *author; /* Identification à diffuser */ + bool result; /* Bilan à retourner */ bound_value *value; /* Valeur à éditer / définir */ - if (!g_generic_config_get_value(get_main_configuration(), MPK_AUTHOR_NAME, &author)) - return false; + result = true; + + *count += 2; + *values = (bound_value *)realloc(*values, *count * sizeof(bound_value)); + + value = &(*values)[*count - 2]; + + value->name = "created"; + value->type = SQLITE_INT64; + value->integer64 = item->created; - *values = (bound_value *)realloc(*values, ++(*count) * sizeof(bound_value)); value = &(*values)[*count - 1]; - value->name = "user"; - value->type = SQLITE_TEXT; - value->string = author; - value->delete = free; + value->name = "modified"; + value->type = SQLITE_INT64; + value->integer64 = item->modified; - if (!create) - { - *values = (bound_value *)realloc(*values, ++(*count) * sizeof(bound_value)); - value = &(*values)[*count - 1]; + result &= prepare_db_statement_for_rle_string(&item->author, "author", values, count); - value->name = "modified"; - value->type = SQLITE_RAW; - value->string = "CURRENT_TIMESTAMP"; - value->delete = SQLITE_STATIC; + result &= prepare_db_statement_for_rle_string(&item->tool, "tool", values, count); - } + result &= prepare_db_statement_for_rle_string(&item->label, "label", values, count); - return true; + return result; } @@ -427,7 +454,6 @@ static bool _g_db_item_prepare_db_statement(const GDbItem *item, bool create, bo /****************************************************************************** * * * Paramètres : item = base d'éléments sur laquelle s'appuyer. * -* create = indique si la préparation vise une création ou non. * * values = couples de champs et de valeurs à lier. [OUT] * * count = nombre de ces couples. [OUT] * * * @@ -439,11 +465,76 @@ static bool _g_db_item_prepare_db_statement(const GDbItem *item, bool create, bo * * ******************************************************************************/ -bool g_db_item_prepare_db_statement(const GDbItem *item, bool create, bound_value **values, size_t *count) +bool g_db_item_prepare_db_statement(const GDbItem *item, bound_value **values, size_t *count) { *values = NULL; *count = 0; - return G_DB_ITEM_GET_CLASS(item)->prepare_stmt(item, create, values, count); + return G_DB_ITEM_GET_CLASS(item)->prepare_stmt(item, values, count); + +} + + +/****************************************************************************** +* * +* Paramètres : item = base d'éléments à charger depuis les réponses. * +* values = tableau d'éléments à consulter. * +* count = nombre de descriptions renseignées. * +* * +* Description : Charge les valeurs utiles pour un élément de collection. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool _g_db_item_load(GDbItem *item, const bound_value *values, size_t count) +{ + bool result; /* Bilan global à retourner */ + const bound_value *value; /* Valeur à éditer / définir */ + + value = find_bound_value(values, count, "created"); + if (value == NULL) return false; + if (value->type != SQLITE_INT64) return false; + + item->created = value->integer64; + + value = find_bound_value(values, count, "modified"); + if (value == NULL) return false; + if (value->type != SQLITE_INT64) return false; + + item->modified = value->integer64; + + result = true; + + result &= load_rle_string(&item->author, "author", values, count); + + result &= load_rle_string(&item->tool, "tool", values, count); + + result &= load_rle_string(&item->label, "label", values, count); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = base d'éléments à charger depuis les réponses. * +* values = tableau d'éléments à consulter. * +* count = nombre de descriptions renseignées. * +* * +* Description : Charge les valeurs utiles pour un élément de collection. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_db_item_load(GDbItem *item, const bound_value *values, size_t count) +{ + return G_DB_ITEM_GET_CLASS(item)->load(item, values, count); } |