diff options
Diffstat (limited to 'src/analysis/db/items')
-rw-r--r-- | src/analysis/db/items/bookmark.c | 377 | ||||
-rw-r--r-- | src/analysis/db/items/bookmark.h | 27 |
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 */ |