summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/db/cdb.c31
-rw-r--r--src/analysis/db/server.c46
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);