diff options
Diffstat (limited to 'src/analysis/db')
| -rw-r--r-- | src/analysis/db/collection.c | 28 | ||||
| -rw-r--r-- | src/analysis/db/collection.h | 2 | ||||
| -rw-r--r-- | src/analysis/db/item-int.h | 4 | ||||
| -rw-r--r-- | src/analysis/db/item.c | 46 | ||||
| -rw-r--r-- | src/analysis/db/item.h | 2 | 
5 files changed, 55 insertions, 27 deletions
diff --git a/src/analysis/db/collection.c b/src/analysis/db/collection.c index 1afe96b..117a2d5 100644 --- a/src/analysis/db/collection.c +++ b/src/analysis/db/collection.c @@ -306,7 +306,7 @@ bool g_db_collection_recv(GDbCollection *collec, int fd, sqlite3 *db)              if (result)              { -                if (collec->binary != NULL) +                if (collec->binary != NULL && g_db_item_is_active(item))                      result = g_db_item_apply(item, collec->binary);                  if (db != NULL)                      result &= g_db_collection_store_item(collec, item, db); @@ -337,7 +337,7 @@ bool g_db_collection_recv(GDbCollection *collec, int fd, sqlite3 *db)                      if (g_db_item_is_active(G_DB_ITEM(found->data)))                      {                          inactive = _g_db_collection_compute_inactivity_timestamp(collec, false); -                        result = _g_db_collection_update_item_activity(collec, item, inactive, false); +                        result = _g_db_collection_update_item_activity(collec, item, &inactive, false);                      }                  } @@ -350,7 +350,15 @@ bool g_db_collection_recv(GDbCollection *collec, int fd, sqlite3 *db)          case DBA_CHANGE_STATE:              if (db == NULL) -                result = g_db_collection_update_item_activity(collec, item, g_db_item_get_timestamp(item) + 1); +            { +                if (g_db_item_is_active(item)) +                    result = g_db_collection_update_item_activity(collec, item, NULL); +                else +                { +                    inactive = g_db_item_get_timestamp(item) + 1; +                    result = g_db_collection_update_item_activity(collec, item, &inactive); +                } +            }              else                  result = false; @@ -716,7 +724,7 @@ timestamp_t _g_db_collection_compute_inactivity_timestamp(GDbCollection *collec,  *                                                                             *  ******************************************************************************/ -bool _g_db_collection_update_item_activity(GDbCollection *collec, GDbItem *item, timestamp_t timestamp, bool lock) +bool _g_db_collection_update_item_activity(GDbCollection *collec, GDbItem *item, timestamp_t *timestamp, bool lock)  {      bool result;                            /* Bilan à faire remonter      */      GList *found;                           /* Test de présence existante  */ @@ -733,7 +741,7 @@ bool _g_db_collection_update_item_activity(GDbCollection *collec, GDbItem *item,      {          internal = G_DB_ITEM(found->data); -        g_db_item_set_activity(internal, (timestamp_t []) { timestamp }); +        result = g_db_item_set_activity(internal, collec->binary, timestamp);          g_signal_emit_by_name(collec, "content-changed", DBA_CHANGE_STATE, internal); @@ -780,7 +788,7 @@ GList *g_db_collection_set_last_active(GDbCollection *collec, timestamp_t timest          {              if (!g_db_item_is_active(item))              { -                g_db_item_set_activity(item, NULL); +                /* ... */g_db_item_set_activity(item, collec->binary, NULL);                  /* ... */g_db_collection_store_updated_item(collec, item, db);                  g_signal_emit_by_name(collec, "content-changed", DBA_CHANGE_STATE, item);              } @@ -823,16 +831,16 @@ GList *g_db_collection_set_last_active(GDbCollection *collec, timestamp_t timest  bool g_db_collection_set_inactive(GDbCollection *collec, GDbItem *item, timestamp_t *timestamp)  { +    bool result;                            /* Bilan à retourner           */ +      /* Si cette collection n'est pas concernée, on ne bouge pas ! */      if (G_OBJECT_TYPE(G_OBJECT(item)) != collec->type) return false; -    assert(g_db_item_is_active(item)); - -    g_db_item_set_activity(item, timestamp); +    result = g_db_item_set_activity(item, collec->binary, timestamp);      g_signal_emit_by_name(collec, "content-changed", DBA_CHANGE_STATE, item); -    return true; +    return result;  } diff --git a/src/analysis/db/collection.h b/src/analysis/db/collection.h index e9f93d2..0f7e1f0 100644 --- a/src/analysis/db/collection.h +++ b/src/analysis/db/collection.h @@ -109,7 +109,7 @@ bool _g_db_collection_remove_item(GDbCollection *, GDbItem *, bool);  timestamp_t _g_db_collection_compute_inactivity_timestamp(GDbCollection *, bool);  /* Met à jour le statut d'activité d'un élément de collection. */ -bool _g_db_collection_update_item_activity(GDbCollection *, GDbItem *, timestamp_t, bool); +bool _g_db_collection_update_item_activity(GDbCollection *, GDbItem *, timestamp_t *, bool);  #define g_db_collection_add_item(c, i) _g_db_collection_add_item(c, i, true)  #define g_db_collection_remove_item(c, i) _g_db_collection_remove_item(c, i, true) diff --git a/src/analysis/db/item-int.h b/src/analysis/db/item-int.h index fb33c72..c2c8b31 100644 --- a/src/analysis/db/item-int.h +++ b/src/analysis/db/item-int.h @@ -73,10 +73,6 @@ struct _GDbItem      bool is_volatile;                       /* Pas besoin de sauvegarde ?  */ -#ifdef DEBUG -    bool applied;                           /* L'élément a été appliqué    */ -#endif -  };  /* Base d'un élément pour collection générique (classe) */ diff --git a/src/analysis/db/item.c b/src/analysis/db/item.c index 3fc6f6f..013703d 100644 --- a/src/analysis/db/item.c +++ b/src/analysis/db/item.c @@ -403,11 +403,9 @@ bool g_db_item_apply(GDbItem *item, GLoadedBinary *binary)  {      bool result;                            /* Bilan à faire remonter      */ -    result = G_DB_ITEM_GET_CLASS(item)->apply(item, binary); +    assert(g_db_item_is_active(item)); -#ifdef DEBUG -    item->applied = true; -#endif +    result = G_DB_ITEM_GET_CLASS(item)->apply(item, binary);      return result; @@ -431,9 +429,7 @@ bool g_db_item_cancel(GDbItem *item, GLoadedBinary *binary)  {      bool result;                            /* Bilan à faire remonter      */ -#ifdef DEBUG -    assert(item->applied); -#endif +    assert(!g_db_item_is_active(item));      result = G_DB_ITEM_GET_CLASS(item)->cancel(item, binary); @@ -482,23 +478,51 @@ timestamp_t g_db_item_get_timestamp(const GDbItem *item)  /******************************************************************************  *                                                                             * -*  Paramètres  : item  = élément de collection à mettre à jour.               * -*                first = horodatage du premier élément désactivé ou NULL.     * +*  Paramètres  : item   = élément de collection à mettre à jour.              * +*                binary = binaire chargé en mémoire à modifier.               * +*                first  = horodatage du premier élément désactivé ou NULL.    *  *                                                                             *  *  Description : Active ou désactive un élément de collection en place.       *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Bilan de la mise à jour de l'élément.                        *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -void g_db_item_set_activity(GDbItem *item, timestamp_t *first) +bool g_db_item_set_activity(GDbItem *item, GLoadedBinary *binary, timestamp_t *first)  { +    bool result;                            /* Bilan à faire remonter      */ +    bool active;                            /* Etat avant changement       */ + +    active = g_db_item_is_active(item); + +    /* Archivage de l'état */ +      if (first == NULL) +    { +        assert(!active);          item->timestamp = item->created; +    }      else +    { +        assert(active);          item->timestamp = --(*first); +    } + +    /* Application de l'état */ + +    if (binary != NULL) +    { +        if (active) +            result = g_db_item_cancel(item, binary); +        else +            result = g_db_item_apply(item, binary); +    } +    else +        result = true; + +    return result;  } diff --git a/src/analysis/db/item.h b/src/analysis/db/item.h index 7d3392c..2edf594 100644 --- a/src/analysis/db/item.h +++ b/src/analysis/db/item.h @@ -87,7 +87,7 @@ const char *g_db_item_get_label(const GDbItem *);  timestamp_t g_db_item_get_timestamp(const GDbItem *);  /*  Active ou désactive un élément de collection en place. */ -void g_db_item_set_activity(GDbItem *, timestamp_t *); +bool g_db_item_set_activity(GDbItem *, GLoadedBinary *, timestamp_t *);  /* Indique si l'élément est activé ou désactivé. */  bool g_db_item_is_active(const GDbItem *);  | 
