summaryrefslogtreecommitdiff
path: root/src/analysis/db/items
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/db/items')
-rw-r--r--src/analysis/db/items/bookmark.c377
-rw-r--r--src/analysis/db/items/bookmark.h27
2 files changed, 374 insertions, 30 deletions
diff --git a/src/analysis/db/items/bookmark.c b/src/analysis/db/items/bookmark.c
index 6ff386c..a8182ce 100644
--- a/src/analysis/db/items/bookmark.c
+++ b/src/analysis/db/items/bookmark.c
@@ -28,11 +28,18 @@
#include <sys/socket.h>
+#include "../collection-int.h"
#include "../item-int.h"
#include "../misc/rlestr.h"
+
+
+
+/* --------------------- ELABORATION D'UN ELEMENT DE COLLECTION --------------------- */
+
+
/* Signet à l'intérieur d'une zone de texte (instance) */
struct _GDbBookmark
{
@@ -81,48 +88,54 @@ static bool g_db_bookmark_prepare_db_statement(const GDbBookmark *, bool, bound_
-/******************************************************************************
-* *
-* Paramètres : db = accès à la base de données. *
-* *
-* Description : Crée la table des signets dans une base de données. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-bool create_bookmark_db_table(sqlite3 *db)
+
+/* ---------------------- DEFINITION DE LA COLLECTION ASSOCIEE ---------------------- */
+
+
+
+
+/* Collection dédiée aux signets (instance) */
+struct _GBookmarkCollection
{
- char *sql; /* Requête à exécuter */
- int ret; /* Bilan de la création */
- char *msg; /* Message d'erreur */
+ GDbCollection parent; /* A laisser en premier */
- sql = "CREATE TABLE Bookmarks (" \
- SQLITE_DB_ITEM_CREATE \
- SQLITE_VMPA_CREATE \
- "comment TEXT" \
- ");";
+};
- ret = sqlite3_exec(db, sql, NULL, NULL, &msg);
- if (ret != SQLITE_OK)
- {
- fprintf(stderr, "sqlite3_exec(): %s\n", msg);
- sqlite3_free(msg);
- }
+/* Collection dédiée aux signets (classe) */
+struct _GBookmarkCollectionClass
+{
+ GDbCollectionClass parent; /* A laisser en premier */
- return (ret == SQLITE_OK);
+};
-}
+/* Initialise la classe des signets dans une zone de texte. */
+static void g_bookmark_collection_class_init(GBookmarkCollectionClass *);
+/* Initialise un signet dans une zone de texte. */
+static void g_bookmark_collection_init(GBookmarkCollection *);
+/* Supprime toutes les références externes. */
+static void g_bookmark_collection_dispose(GBookmarkCollection *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_bookmark_collection_finalize(GBookmarkCollection *);
+
+/* Décrit les colonnes utiles à un chargement de données. */
+static bool g_bookmark_collection_setup_load(GBookmarkCollection *, bound_value **, size_t *);
+/* Charge les valeurs utiles pour une localisation. */
+static bool g_bookmark_collection_load_item(GBookmarkCollection *, const bound_value *, size_t);
+/* Détermine si un élément est déjà présent ou non. */
+static GDbItem *g_bookmark_collection_has_key(GBookmarkCollection *, va_list *);
+/* ---------------------------------------------------------------------------------- */
+/* ELABORATION D'UN ELEMENT DE COLLECTION */
+/* ---------------------------------------------------------------------------------- */
/* Indique le type défini pour un signet à l'intérieur d'une zone de texte. */
@@ -269,12 +282,12 @@ static gint g_db_bookmark_cmp(GDbBookmark *a, GDbBookmark *b)
{
gint result; /* Bilan de la comparaison */
- result = cmp_vmpa_by_phy(&a->addr, &b->addr);
+ result = cmp_vmpa(&a->addr, &b->addr);
if (result == 0)
result = cmp_rle_string(&a->comment, &b->comment);
- return 0;
+ return result;
}
@@ -451,3 +464,307 @@ void g_db_bookmark_set_comment(GDbBookmark *bookmark, const char *comment)
set_rle_string(&bookmark->comment, comment);
}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* DEFINITION DE LA COLLECTION ASSOCIEE */
+/* ---------------------------------------------------------------------------------- */
+
+
+/* Indique le type défini pour une collection de signets. */
+G_DEFINE_TYPE(GBookmarkCollection, g_bookmark_collection, G_TYPE_DB_COLLECTION);
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe à initialiser. *
+* *
+* Description : Initialise la classe des signets dans une zone de texte. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_bookmark_collection_class_init(GBookmarkCollectionClass *klass)
+{
+ GObjectClass *object; /* Autre version de la classe */
+ GDbCollectionClass *collec; /* Encore une autre vision... */
+
+ object = G_OBJECT_CLASS(klass);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_bookmark_collection_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_bookmark_collection_finalize;
+
+ collec = G_DB_COLLECTION_CLASS(klass);
+
+ collec->setup_load = (collec_setup_load_fc)g_bookmark_collection_setup_load;
+ collec-> load_item = (collec_load_item)g_bookmark_collection_load_item;
+ collec->has_key = (collec_has_key_fc)g_bookmark_collection_has_key;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : collec = instance à initialiser. *
+* *
+* Description : Initialise un signet dans une zone de texte. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_bookmark_collection_init(GBookmarkCollection *collec)
+{
+
+
+ G_DB_COLLECTION(collec)->featuring = 0;
+ G_DB_COLLECTION(collec)->type = G_TYPE_DB_BOOKMARK;
+ G_DB_COLLECTION(collec)->name = "Bookmarks";
+
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : collec = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_bookmark_collection_dispose(GBookmarkCollection *collec)
+{
+ G_OBJECT_CLASS(g_bookmark_collection_parent_class)->dispose(G_OBJECT(collec));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : bookmark = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_bookmark_collection_finalize(GBookmarkCollection *collec)
+{
+ G_OBJECT_CLASS(g_bookmark_collection_parent_class)->finalize(G_OBJECT(collec));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Crée une collection dédiée aux signets. *
+* *
+* Retour : Collection mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBookmarkCollection *g_bookmark_collection_new(void)
+{
+ GBookmarkCollection *result; /* Instance à retourner */
+
+ result = g_object_new(G_TYPE_BM_COLLECTION, NULL);
+
+ return result;
+
+}
+
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : db = accès à la base de données. *
+* *
+* Description : Crée la table des signets dans une base de données. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool create_bookmark_db_table(sqlite3 *db)
+{
+ char *sql; /* Requête à exécuter */
+ int ret; /* Bilan de la création */
+ char *msg; /* Message d'erreur */
+
+ sql = "CREATE TABLE Bookmarks (" \
+ SQLITE_DB_ITEM_CREATE \
+ SQLITE_VMPA_CREATE \
+ "comment TEXT" \
+ ");";
+
+ ret = sqlite3_exec(db, sql, NULL, NULL, &msg);
+ if (ret != SQLITE_OK)
+ {
+ fprintf(stderr, "sqlite3_exec(): %s\n", msg);
+ sqlite3_free(msg);
+ }
+
+ return (ret == SQLITE_OK);
+
+}
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : collec = ensemble d'éléments à consulter. *
+* values = tableau d'éléments à compléter. [OUT] *
+* count = nombre de descriptions renseignées. [OUT] *
+* *
+* Description : Décrit les colonnes utiles à un chargement de données. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_bookmark_collection_setup_load(GBookmarkCollection *collec, bound_value **values, size_t *count)
+{
+ // TODO : classe supérieure
+
+ if (!setup_load_for_vmpa(NULL, values, count))
+ return false;
+
+ *values = (bound_value *)realloc(*values, ++(*count) * sizeof(bound_value));
+
+ (*values)[*count - 1].name = "comment";
+
+ return true;
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : collec = ensemble d'éléments à compléter. *
+* values = tableau d'éléments à consulter. *
+* count = nombre de descriptions renseignées. *
+* *
+* Description : Charge les valeurs utiles pour une localisation. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_bookmark_collection_load_item(GBookmarkCollection *collec, const bound_value *values, size_t count)
+{
+ vmpa2t addr; /* Localisation d'un signet */
+ const char *comment; /* Eventuel commentaire associé*/
+ const bound_value *value; /* Valeur à intégrer */
+ GDbBookmark *new; /* Nouvel élément à intégrer */
+
+ if (!load_vmpa(&addr, values, count))
+ return false;
+
+ value = find_bound_value(values, count, "comment");
+ if (value == NULL) return false;
+
+ switch (value->type)
+ {
+ case SQLITE_TEXT:
+ comment = value->cstring;
+ break;
+
+ case SQLITE_NULL:
+ comment = NULL;
+ break;
+
+ default:
+ return false;
+ break;
+
+ }
+
+ new = g_db_bookmark_new(&addr, comment);
+
+ printf(" LOAD new bm :: %p\n", new);
+
+ return g_db_collection_add_item(G_DB_COLLECTION(collec), G_DB_ITEM(new));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : collec = ensemble d'éléments à consulter. *
+* ap = clef identifiant de manière unique un élément. *
+* *
+* Description : Détermine si un élément est déjà présent ou non. *
+* *
+* Retour : Elément trouvé ou NULL si aucun. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GDbItem *g_bookmark_collection_has_key(GBookmarkCollection *collec, va_list *ap)
+{
+ GDbItem *result; /* Bilan à retourner */
+ vmpa2t *ref; /* Adresse de référence */
+ GList *items; /* Eléments déjà en place */
+ GList *iter; /* Boucle de parcours */
+ GDbBookmark *bm; /* Signet à consulter */
+
+ result = NULL;
+
+ ref = va_arg(ap, vmpa2t *);
+
+ items = g_db_collection_list_items(G_DB_COLLECTION(collec));
+
+ for (iter = g_list_first(items); iter != NULL && result == NULL; iter = g_list_next(iter))
+ {
+ bm = G_DB_BOOKMARK(iter->data);
+
+ if (cmp_vmpa(&bm->addr, ref) != 0)
+
+ /**
+ * Un verrou est sensé être posé, donc il n'y a pas besoin
+ * de toucher au décompte des références car l'élément trouvé
+ * ne peut pas être supprimé.
+ */
+ result = G_DB_ITEM(bm);
+
+ }
+
+ return result;
+
+}
diff --git a/src/analysis/db/items/bookmark.h b/src/analysis/db/items/bookmark.h
index cd5e202..de12b1b 100644
--- a/src/analysis/db/items/bookmark.h
+++ b/src/analysis/db/items/bookmark.h
@@ -42,6 +42,7 @@ bool create_bookmark_db_table(sqlite3 *);
+/* --------------------- ELABORATION D'UN ELEMENT DE COLLECTION --------------------- */
#define G_TYPE_DB_BOOKMARK g_db_bookmark_get_type()
@@ -76,4 +77,30 @@ void g_db_bookmark_set_comment(GDbBookmark *, const char *);
+/* ---------------------- DEFINITION DE LA COLLECTION ASSOCIEE ---------------------- */
+
+
+#define G_TYPE_BM_COLLECTION g_bookmark_collection_get_type()
+#define G_BM_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_bookmark_collection_get_type(), GBookmarkCollection))
+#define G_IS_BM_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_bookmark_collection_get_type()))
+#define G_BM_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BM_COLLECTION, GBookmarkCollectionClass))
+#define G_IS_BM_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BM_COLLECTION))
+#define G_BM_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BM_COLLECTION, GBookmarkCollectionClass))
+
+
+/* Collection dédiée aux signets (instance) */
+typedef struct _GBookmarkCollection GBookmarkCollection;
+
+/* Collection dédiée aux signets (classe) */
+typedef struct _GBookmarkCollectionClass GBookmarkCollectionClass;
+
+
+/* Indique le type défini pour une collection de signets. */
+GType g_bookmark_collection_get_type(void);
+
+/* Crée une collection dédiée aux signets. */
+GBookmarkCollection *g_bookmark_collection_new(void);
+
+
+
#endif /* _ANALYSIS_DB_ITEMS_BOOKMARK_H */