diff options
Diffstat (limited to 'src/analysis/db/cdb.c')
-rw-r--r-- | src/analysis/db/cdb.c | 76 |
1 files changed, 62 insertions, 14 deletions
diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c index 46cfc23..96e69d5 100644 --- a/src/analysis/db/cdb.c +++ b/src/analysis/db/cdb.c @@ -34,6 +34,7 @@ #include <signal.h> #include <stdint.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> @@ -44,7 +45,6 @@ #include "collection.h" #include "protocol.h" -#include "items/bookmark.h" #include "../../common/cpp.h" #include "../../common/extstr.h" #include "../../common/io.h" @@ -127,11 +127,14 @@ static bool g_cdb_archive_read(GCdbArchive *); +/* -------------------------- MANIPULATION DES PARTIES XML -------------------------- */ /* Crée la description XML correspondant à l'archive. */ static bool g_cdb_archive_create_xml_desc(GCdbArchive *, const rle_string *); +/* Vérifie la conformité d'une description XML avec le serveur. */ +static bool g_cdb_archive_check_xml_version(const GCdbArchive *); @@ -201,6 +204,8 @@ static void g_cdb_archive_class_init(GCdbArchiveClass *klass) static void g_cdb_archive_init(GCdbArchive *archive) { + archive->collections = create_collections_list(); + g_mutex_init(&archive->clients_access); g_mutex_init(&archive->id_access); @@ -330,7 +335,9 @@ GCdbArchive *g_cdb_archive_new(const char *owner, const rle_string *hash, const g_cdb_archive_create_xml_desc(result, user); g_cdb_archive_create_db(result, NULL); - if (g_cdb_archive_write(result) != DBE_NONE) + *error = g_cdb_archive_write(result); + + if (*error != DBE_NONE) goto gcan_error; } @@ -342,10 +349,19 @@ GCdbArchive *g_cdb_archive_new(const char *owner, const rle_string *hash, const if (!g_cdb_archive_read(result)) goto gcan_error; + if (!g_cdb_archive_check_xml_version(result)) + { + *error = DBE_XML_VERSION_ERROR; + goto gcan_error; + } + /* Chargement des éléments sauvegardés */ if (!g_cdb_archive_load_collections(result)) + { + *error = DBE_DB_LOADING_ERROR; goto gcan_error; + } return result; @@ -586,12 +602,9 @@ int g_cdb_archive_compare_hash(const GCdbArchive *archive, const rle_string *has - -/* --------------------- OPERATIONS DE LECTURE D'UN FICHIER XML --------------------- */ -/* --------------------- OPERATIONS DE LECTURE D'UN FICHIER XML --------------------- */ - - - +/* ---------------------------------------------------------------------------------- */ +/* MANIPULATION DES PARTIES XML */ +/* ---------------------------------------------------------------------------------- */ /****************************************************************************** @@ -639,8 +652,38 @@ static bool g_cdb_archive_create_xml_desc(GCdbArchive *archive, const rle_string } +/****************************************************************************** +* * +* Paramètres : archive = archive à consulter. * +* * +* Description : Vérifie la conformité d'une description XML avec le serveur. * +* * +* Retour : Bilan de la vérification. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_cdb_archive_check_xml_version(const GCdbArchive *archive) +{ + bool result; /* Bilan à retourner */ + char *version; /* Version protocolaire */ + unsigned long int used; /* Version utilisée */ + + result = NULL; + + version = get_node_text_value(archive->context, "/ChrysalideBinary/Protocol"); + if (version == NULL) return false; + + used = strtoul(version, NULL, 16); + result = (used == CDB_PROTOCOL_VERSION); + free(version); + + return result; + +} /* ---------------------------------------------------------------------------------- */ @@ -666,6 +709,8 @@ static bool g_cdb_archive_create_db(const GCdbArchive *archive, const core_db_in bool result; /* Bilan à retourner */ sqlite3 *db; /* Base de données à constituer*/ int ret; /* Bilan de la création */ + GList *iter; /* Boucle de parcours */ + GDbCollection *collec; /* Collection visée manipulée */ ret = sqlite3_open(archive->sql_db, &db); @@ -675,11 +720,16 @@ static bool g_cdb_archive_create_db(const GCdbArchive *archive, const core_db_in return false; } + result = true; - - result = create_bookmark_db_table(db); - - + for (iter = g_list_first(archive->collections); + iter != NULL && result; + iter = g_list_next(iter)) + { + collec = G_DB_COLLECTION(iter->data); + result = g_db_collection_create_db_table(collec, db); + fprintf(stderr, "STATUS :: %d\n", result); + } sqlite3_close(db); @@ -725,8 +775,6 @@ static bool g_cdb_archive_load_collections(GCdbArchive *archive) GList *iter; /* Boucle de parcours */ GDbCollection *collec; /* Collection visée manipulée */ - archive->collections = create_collections_list(); - for (iter = g_list_first(archive->collections); iter != NULL; iter = g_list_next(iter)) |