diff options
Diffstat (limited to 'src/analysis')
| -rw-r--r-- | src/analysis/db/cdb.c | 31 | ||||
| -rw-r--r-- | src/analysis/db/server.c | 46 | 
2 files changed, 74 insertions, 3 deletions
| diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c index 14ea5c7..e909210 100644 --- a/src/analysis/db/cdb.c +++ b/src/analysis/db/cdb.c @@ -26,6 +26,7 @@  #include <archive.h>  #include <archive_entry.h> +#include <assert.h>  #include <errno.h>  #include <fcntl.h>  #include <malloc.h> @@ -253,10 +254,38 @@ static void g_cdb_archive_dispose(GCdbArchive *archive)  static void g_cdb_archive_finalize(GCdbArchive *archive)  { -    //void close_xml_file(xmlDocPtr, xmlXPathContextPtr); +    int ret;                                /* Bilan d'un appel            */ + +    if (archive->db != NULL) +    { +        ret = sqlite3_close(archive->db); +        assert(ret == SQLITE_OK); +    } + +    if (archive->xdoc != NULL) +        close_xml_file(archive->xdoc, archive->context); + +    if (archive->xml_desc != NULL) +    { +        ret = unlink(archive->xml_desc); +        if (ret != 0) perror("unlink"); + +        free(archive->xml_desc); + +    } + +    if (archive->sql_db != NULL) +    { +        ret = unlink(archive->sql_db); +        if (ret != 0) perror("unlink"); + +        free(archive->sql_db); + +    }      free(archive->filename); +    exit_rle_string(&archive->hash);      G_OBJECT_CLASS(g_cdb_archive_parent_class)->finalize(G_OBJECT(archive)); diff --git a/src/analysis/db/server.c b/src/analysis/db/server.c index 0debd83..f6c7a71 100644 --- a/src/analysis/db/server.c +++ b/src/analysis/db/server.c @@ -107,6 +107,9 @@ static void g_db_server_class_init(GDbServerClass *);  /* Initialise une description de fichier binaire. */  static void g_db_server_init(GDbServer *); +/* Supprime toutes les références externes. */ +static void g_db_server_dispose(GDbServer *); +  /* Procède à la libération totale de la mémoire. */  static void g_db_server_finalize(GDbServer *); @@ -149,6 +152,7 @@ static void g_db_server_class_init(GDbServerClass *klass)      object = G_OBJECT_CLASS(klass); +    object->dispose = (GObjectFinalizeFunc/* ! */)g_db_server_dispose;      object->finalize = (GObjectFinalizeFunc)g_db_server_finalize;  } @@ -179,6 +183,37 @@ static void g_db_server_init(GDbServer *server)  /******************************************************************************  *                                                                             * +*  Paramètres  : archive = instance d'objet GLib à traiter.                   * +*                                                                             * +*  Description : Supprime toutes les références externes.                     * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_db_server_dispose(GDbServer *server) +{ +    GList *iter;                            /* Boucle de parcours          */ + +    for (iter = g_list_first(server->archives); +         iter != NULL; +         iter = g_list_first(server->archives)) +    { +        g_object_unref(G_OBJECT(iter->data)); +        server->archives = g_list_delete_link(server->archives, iter); +    } + +    g_mutex_clear(&server->mutex); + +    G_OBJECT_CLASS(g_db_server_parent_class)->dispose(G_OBJECT(server)); + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : server = instance d'objet GLib à traiter.                    *  *                                                                             *  *  Description : Procède à la libération totale de la mémoire.                * @@ -740,7 +775,7 @@ static void *g_db_server_listener(GDbServer *server)              if (!status) goto gdsl_out_error;              /** -             * L'ajout dans la liste des clients connectés provoque un envoie de mises à jour. +             * L'ajout dans la liste des clients connectés provoque un envoi de mises à jour.               * L'éventuelle erreur survenant pendant l'envoi ne peut donc pas être remontée               * lors des échanges initiaux, car ces derniers seraient alors précédés des mises à jour...               */ @@ -749,7 +784,10 @@ static void *g_db_server_listener(GDbServer *server)              {                  assert(error == DBE_NONE); -                server->archives = g_list_append(server->archives, archive); +                /* Si l'archive a été créée pour l'occasion... */ +                if (iter == NULL) +                    server->archives = g_list_append(server->archives, archive); +                  error = g_cdb_archive_add_client(archive, fd, &user);                  exit_packed_buffer(&out_pbuf); @@ -769,6 +807,10 @@ static void *g_db_server_listener(GDbServer *server)              exit_packed_buffer(&out_pbuf); +            /* Si l'archive a été créée pour l'occasion... */ +            if (iter == NULL && archive != NULL) +                g_object_unref(G_OBJECT(archive)); +   gdsl_error:              free(peer_name); | 
