diff options
Diffstat (limited to 'src/analysis/db/collection.c')
-rw-r--r-- | src/analysis/db/collection.c | 162 |
1 files changed, 159 insertions, 3 deletions
diff --git a/src/analysis/db/collection.c b/src/analysis/db/collection.c index 20b1ff3..5c25720 100644 --- a/src/analysis/db/collection.c +++ b/src/analysis/db/collection.c @@ -24,6 +24,11 @@ #include "collection.h" +#include <stdio.h> +#include <string.h> + + +#include "../../common/extstr.h" #include "../../common/io.h" #include "../../glibext/chrysamarshal.h" @@ -36,6 +41,7 @@ struct _GDbCollection uint32_t featuring; /* Fonctionnalité représentée */ GType type; /* Identifiant GLib équivalent */ + const char *name; /* Nom en base de données */ GList *items; /* Eléments rassemblés */ GList *sorted; /* Eléments triés */ @@ -71,6 +77,15 @@ static void g_db_collection_finalize(GDbCollection *); +/* --------------------- MANIPULATIONS AVEC UNE BASE DE DONNEES --------------------- */ + + +/* Enregistre un élément de collection dans une base de données. */ +static bool g_db_collection_store_item(const GDbCollection *, const GDbItem *, sqlite3 *); + + + + /* Indique le type défini pour une collection générique d'éléments. */ G_DEFINE_TYPE(GDbCollection, g_db_collection, G_TYPE_OBJECT); @@ -170,7 +185,8 @@ static void g_db_collection_finalize(GDbCollection *collec) /****************************************************************************** * * * Paramètres : id = identifiant réseau des éléments à traiter. * -* type = type GLib des éléments à intégrer dans la collection. * +* type = type GLib des éléments à placer dans la collection. * +* name = indique le nom désignant la table associée. * * * * Description : Prépare la mise en place d'une nouvelle collection. * * * @@ -180,7 +196,7 @@ static void g_db_collection_finalize(GDbCollection *collec) * * ******************************************************************************/ -GDbCollection *g_db_collection_new(uint32_t id, GType type) +GDbCollection *g_db_collection_new(uint32_t id, GType type, const char *name) { GDbCollection *result; /* Adresse à retourner */ @@ -188,6 +204,7 @@ GDbCollection *g_db_collection_new(uint32_t id, GType type) result->featuring = id; result->type = type; + result->name = name; return result; @@ -233,6 +250,7 @@ uint32_t g_db_collection_get_feature(const GDbCollection *collec) * * * Paramètres : collec = ensemble d'éléments à considérer. * * fd = flux ouvert en lecture pour la réception de données.* +* db = base de données à mettre à jour. * * * * Description : Réceptionne et traite une requête réseau pour collection. * * * @@ -244,7 +262,7 @@ uint32_t g_db_collection_get_feature(const GDbCollection *collec) * * ******************************************************************************/ -bool g_db_collection_recv(GDbCollection *collec, int fd) +bool g_db_collection_recv(GDbCollection *collec, int fd, sqlite3 *db) { bool result; /* Bilan à faire remonter */ uint32_t val32; /* Valeur sur 32 bits */ @@ -269,6 +287,8 @@ bool g_db_collection_recv(GDbCollection *collec, int fd) { case DBA_ADD_ITEM: result = g_db_collection_add_item(collec, item); + if (result && db != NULL) + result = g_db_collection_store_item(collec, item, db); break; case DBA_REM_ITEM: @@ -430,6 +450,10 @@ bool g_db_collection_add_item(GDbCollection *collec, GDbItem *item) g_signal_emit_by_name(collec, "content-changed", DBA_ADD_ITEM, item); + + printf(" ==== CONTENT CHANGED !!!\n"); + + result = true; } @@ -478,6 +502,138 @@ bool g_db_collection_modify_item(GDbCollection *collec, GDbItem *item) /* ---------------------------------------------------------------------------------- */ /* CREATION DE L'ABSTRACTION POUR COLLECTIONS */ +/* MANIPULATIONS AVEC UNE BASE DE DONNEES */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : collec = ensemble d'éléments à considérer. * +* item = élément de collection à enregistrer. * +* db = base de données à mettre à jour. * +* * +* Description : Enregistre un élément de collection dans une base de données.* +* * +* Retour : Bilan de l'exécution de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_db_collection_store_item(const GDbCollection *collec, const GDbItem *item, sqlite3 *db) +{ + bool result; /* Conclusion à faire remonter */ + bound_value *values; /* Champs de table à inclure */ + size_t count; /* Nombre de ces champs */ + char *sql; /* Requête SQL à construire */ + size_t i; /* Boucle de parcours */ + sqlite3_stmt *stmt; /* Déclaration mise en place */ + int ret; /* Bilan d'un appel à SQLite */ + int index; /* Indice de valeur attachée */ + + if (!g_db_item_prepare_db_statement(item, true, &values, &count)) + return false; + + result = false; + + /* Préparation de la requête */ + + sql = strdup("INSERT INTO "); + sql = stradd(sql, collec->name); + sql = stradd(sql, " ("); + + for (i = 0; i < count; i++) + { + if (i > 0) sql = stradd(sql, ", "); + + sql = stradd(sql, values[i].name); + + } + + sql = stradd(sql, ") VALUES ("); + + for (i = 0; i < count; i++) + { + if (i > 0) sql = stradd(sql, ", "); + + if (values[i].type == SQLITE_RAW) + sql = stradd(sql, values[i].cstring); + else + sql = stradd(sql, "?"); + + } + + sql = stradd(sql, ");"); + + ret = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (ret != SQLITE_OK) + { + fprintf(stderr, "Can't prepare INSERT statment '%s' (ret=%d): %s\n", sql, ret, sqlite3_errmsg(db)); + goto gdcsi_exit; + } + + /* Attribution des valeurs */ + + index = 1; + + for (i = 0; i < count; i++) + { + switch (values[i].type) + { + case SQLITE_INT64: + ret = sqlite3_bind_int64(stmt, index, values[i].integer64); + index++; + break; + + case SQLITE_TEXT: + ret = sqlite3_bind_text(stmt, index, values[i].string, -1, values[i].delete); + index++; + break; + + default: + ret = SQLITE_OK; + break; + + } + + if (ret != SQLITE_OK) + { + fprintf(stderr, "Can't bind value for parameter nb %d in '%s' (ret=%d): %s\n", + index - 1, sql, ret, sqlite3_errmsg(db)); + goto gdcsi_exit; + } + + } + + /* Exécution finale */ + + ret = sqlite3_step(stmt); + + if (ret != SQLITE_DONE) + { + fprintf(stderr, "INSERT statement '%s' didn't return DONE (ret=%d): %s\n", sql, ret, sqlite3_errmsg(db)); + goto gdcsi_exit; + } + + sqlite3_finalize(stmt); + + result = true; + + gdcsi_exit: + + free(sql); + + printf("INSERT ? %d\n", result); + + return result; + +} + + + + +/* ---------------------------------------------------------------------------------- */ +/* CREATION DE L'ABSTRACTION POUR COLLECTIONS */ /* ---------------------------------------------------------------------------------- */ |