diff options
Diffstat (limited to 'src/analysis/db/collection.c')
-rw-r--r-- | src/analysis/db/collection.c | 117 |
1 files changed, 98 insertions, 19 deletions
diff --git a/src/analysis/db/collection.c b/src/analysis/db/collection.c index adb3ad1..2c6086a 100644 --- a/src/analysis/db/collection.c +++ b/src/analysis/db/collection.c @@ -271,9 +271,53 @@ const char *g_db_collection_get_name(const GDbCollection *collec) +/****************************************************************************** +* * +* Paramètres : collec = ensemble d'éléments à considérer. * +* pbuf = paquet de données où venir puiser les infos. * +* action = commande de la requête. [OUT] * +* dest = élément de collection ou NULL pour un rejet. [OUT] * +* * +* Description : Réceptionne un élément depuis une requête réseau. * +* * +* Retour : Bilan de l'exécution de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ +bool _g_db_collection_unpack(GDbCollection *collec, packed_buffer *pbuf, DBAction *action, GDbItem **dest) +{ + bool result; /* Bilan à faire remonter */ + uint32_t tmp32; /* Valeur sur 32 bits */ + GDbItem *item; /* Définition d'élément visé */ + result = extract_packed_buffer(pbuf, &tmp32, sizeof(uint32_t), true); + if (!result) goto exit; + + *action = tmp32; + result = (*action >= 0 && *action < DBA_COUNT); + if (!result) goto exit; + + item = g_object_new(collec->type, NULL); + + result = g_db_item_unpack(item, pbuf); + if (!result) goto exit; + + if (dest != NULL) + *dest = item; + else + g_object_unref(G_OBJECT(item)); + + exit: + + if (!result) + g_object_unref(G_OBJECT(item)); + + return result; + +} /****************************************************************************** @@ -295,28 +339,13 @@ const char *g_db_collection_get_name(const GDbCollection *collec) bool g_db_collection_unpack(GDbCollection *collec, packed_buffer *pbuf, sqlite3 *db) { bool result; /* Bilan à faire remonter */ - uint32_t tmp32; /* Valeur sur 32 bits */ - bool status; /* Bilan de lecture initiale */ DBAction action; /* Commande de la requête */ GDbItem *item; /* Définition d'élément visé */ GList *found; /* Test de présence existante */ timestamp_t inactive; /* Horodatage de désactivation */ - result = extract_packed_buffer(pbuf, &tmp32, sizeof(uint32_t), true); - action = tmp32; - - if (action < 0 || action >= DBA_COUNT) - result = false; - - if (!result) - return result; - - item = g_object_new(collec->type, NULL); - - status = g_db_item_unpack(item, pbuf); - if (!status) return false; - - result = false; + result = _g_db_collection_unpack(collec, pbuf, &action, &item); + if (!result) return false; switch (action) { @@ -459,7 +488,10 @@ bool g_db_collection_pack_all_updates(GDbCollection *collec, packed_buffer *pbuf result = true; - /* TODO : lock ? */ + /** + * La gestion des accès s'effectue depuis le seul appelant : la fonction + * g_cdb_archive_add_client(). + */ for (iter = g_list_first(collec->items); iter != NULL && result; @@ -1529,6 +1561,48 @@ void lock_unlock_collections(GList *list, bool write, bool lock) /****************************************************************************** * * * Paramètres : list = ensemble de collectons à traiter. * +* pbuf = paquet de données où venir inscrire des infos. * +* * +* Description : Collecte les informations utiles pour un nouvel arrivant. * +* * +* Retour : Bilan du déroulement des opérations. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool pack_all_collection_updates(GList *list, packed_buffer *pbuf) +{ + bool result; /* Bilan à retourner */ + GList *iter; /* Boucle de parcours */ + GDbCollection *collec; /* Collection visée manipulée */ + + result = true; + + /** + * Cette procédure n'est appelée que depuis g_cdb_archive_process(), + * qui bloque son exécution jusqu'à la fin des opérations. + * + * On a donc l'assurance d'un récupérer tous les éléments d'un coup, + * sans activité parallèle. + */ + + for (iter = g_list_first(list); iter != NULL && result; iter = g_list_next(iter)) + { + collec = G_DB_COLLECTION(iter->data); + + result = g_db_collection_pack_all_updates(collec, pbuf); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : list = ensemble de collectons à traiter. * * pbuf = paquet de données où venir puiser les infos. * * db = base de données à mettre à jour. * * * @@ -1553,7 +1627,12 @@ bool update_activity_in_collections(GList *list, packed_buffer *pbuf, sqlite3 *d GList *i; /* Boucle de parcours #2 */ GDbItem *item; /* Elément collecté à manipuler*/ - /* TODO : lock ? */ + /** + * Cette procédure n'est appelée que depuis g_cdb_archive_process(), + * qui bloque son exécution jusqu'à la fin des opérations. + * + * On a donc l'assurance d'un traitement global homgène des horodatages. + */ status = unpack_timestamp(×tamp, pbuf); if (!status) return false; |