[rygel] media-export: Don't keep empty containers in DB



commit e1edff6d41e6e57643e340b014f8f32f15e38e77
Author: Jens Georg <mail jensge org>
Date:   Sat Feb 12 23:27:06 2011 +0100

    media-export: Don't keep empty containers in DB

 .../media-export/rygel-media-export-harvester.vala |   47 ++++++++++++++------
 .../rygel-media-export-harvesting-task.vala        |   12 +++++-
 2 files changed, 44 insertions(+), 15 deletions(-)
---
diff --git a/src/plugins/media-export/rygel-media-export-harvester.vala b/src/plugins/media-export/rygel-media-export-harvester.vala
index a1f7013..0f92646 100644
--- a/src/plugins/media-export/rygel-media-export-harvester.vala
+++ b/src/plugins/media-export/rygel-media-export-harvester.vala
@@ -147,13 +147,21 @@ internal class Rygel.MediaExport.Harvester : GLib.Object {
                         debug ("Trying to harvest %s because of %s",
                                file.get_uri (),
                                event.to_string ());
-                        var id = MediaCache.get_id (file.get_parent ());
+                        string id;
                         try {
-                               var parent_container = cache.get_object (id)
-                                            as MediaContainer;
-                                assert (parent_container != null);
-
-                                this.schedule (file, parent_container);
+                            MediaContainer parent_container = null;
+                            var current = file;
+                            do {
+                                var parent = current.get_parent ();
+                                id = MediaCache.get_id (parent);
+                                parent_container = cache.get_object (id)
+                                        as MediaContainer;
+                                if (parent_container == null) {
+                                    current = parent;
+                                }
+                            } while (parent_container == null);
+
+                            this.schedule (current, parent_container);
                         } catch (DatabaseError error) {
                             warning (_("Error fetching object '%s' from database: %s"),
                                      id,
@@ -168,15 +176,26 @@ internal class Rygel.MediaExport.Harvester : GLib.Object {
                         // exists because we need the parent to signalize the
                         // change
                         var id = MediaCache.get_id (file);
-                        var obj = cache.get_object (id);
-
-                        // it may be that files removed are files that are not
-                        // in the database, because they're not media files
-                        if (obj != null) {
-                            cache.remove_object (obj);
-                            if (obj.parent != null) {
-                                obj.parent.updated ();
+                        var object = cache.get_object (id);
+                        var parent = object.parent;
+
+                        while (object != null) {
+                            parent = object.parent;
+                            cache.remove_object (object);
+                            if (parent == null) {
+                                break;
+                            }
+
+                            parent.child_count--;
+                            if (parent.child_count != 0) {
+                                break;
                             }
+
+                            object = parent;
+                        }
+
+                        if (parent != null) {
+                            parent.updated ();
                         }
                     } catch (Error error) {
                         warning (_("Error removing object from database: %s"),
diff --git a/src/plugins/media-export/rygel-media-export-harvesting-task.vala b/src/plugins/media-export/rygel-media-export-harvesting-task.vala
index 86c155c..7c52abd 100644
--- a/src/plugins/media-export/rygel-media-export-harvesting-task.vala
+++ b/src/plugins/media-export/rygel-media-export-harvesting-task.vala
@@ -272,6 +272,8 @@ public class Rygel.MediaExport.HarvestingTask : Rygel.StateMachine,
                                             this.flag);
                 } catch (Error error) {};
             }
+            parent.updated ();
+
             this.completed ();
         }
 
@@ -351,7 +353,15 @@ public class Rygel.MediaExport.HarvestingTask : Rygel.StateMachine,
     private void do_update () {
         if (this.files.size == 0 &&
             this.containers.get_length () != 0) {
-            this.containers.peek_head ().updated ();
+            var container = this.containers.peek_head ();
+            try {
+                var cache = MediaCache.get_default ();
+                if (cache.get_child_count (container.id) > 0) {
+                    this.containers.peek_head ().updated ();
+                } else {
+                    cache.remove_by_id (container.id);
+                }
+            } catch (Error error) { }
             this.containers.pop_head ();
         }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]