summaryrefslogtreecommitdiff
path: root/src/analysis/db/item.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/db/item.c')
-rw-r--r--src/analysis/db/item.c151
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);
}