[rygel] media-export: Move filesystem to special folder



commit 0dc5e58e8dffcc060bc89f258d2af21a5bf959fa
Author: Jens Georg <mail jensge org>
Date:   Sat Aug 14 14:10:14 2010 +0300

    media-export: Move filesystem to special folder
    
    With the default virtual containers the root-folder's content was way to
    cluttered

 .../rygel-media-export-media-cache-upgrader.vala   |   60 ++++++++++++++++++++
 .../rygel-media-export-query-container.vala        |    4 +-
 .../rygel-media-export-root-container.vala         |   24 ++++++--
 .../rygel-media-export-sql-factory.vala            |    2 +-
 4 files changed, 81 insertions(+), 9 deletions(-)
---
diff --git a/src/plugins/media-export/rygel-media-export-media-cache-upgrader.vala b/src/plugins/media-export/rygel-media-export-media-cache-upgrader.vala
index 723198e..346a080 100644
--- a/src/plugins/media-export/rygel-media-export-media-cache-upgrader.vala
+++ b/src/plugins/media-export/rygel-media-export-media-cache-upgrader.vala
@@ -109,6 +109,9 @@ internal class Rygel.MediaExport.MediaCacheUpgrader {
                     case 8:
                         update_v8_v9 ();
                         break;
+                    case 9:
+                        update_v9_v10 ();
+                        break;
                     default:
                         warning ("Cannot upgrade");
                         database = null;
@@ -274,4 +277,61 @@ internal class Rygel.MediaExport.MediaCacheUpgrader {
             database = null;
         }
     }
+
+    // This isn't really a schema update but a semantics update
+    private void update_v9_v10 () {
+        try {
+            var queue = new LinkedList<string> ();
+            this.database.begin ();
+            this.database.exec ("DROP TRIGGER trgr_update_closure");
+            this.database.exec ("DROP TRIGGER trgr_delete_closure");
+            this.database.exec ("DROP INDEX idx_parent");
+            this.database.exec ("DROP INDEX idx_meta_data_fk");
+            this.database.exec ("DROP INDEX idx_closure");
+            this.database.exec ("DROP TABLE Closure");
+
+            // keep meta-data although we're deleting loads of objects
+            this.database.exec ("DROP TRIGGER trgr_delete_metadata");
+
+            this.database.exec ("INSERT INTO Object (parent, upnp_id, type_fk, " +
+                                "title, timestamp) VALUES ('0', 'Filesystem', " +
+                                "0, 'Filesystem', 0)");
+            this.database.exec ("UPDATE Object SET parent = 'Filesystem' " +
+                                "WHERE parent = '0' AND upnp_id " +
+                                "NOT LIKE 'virtual-%' AND upnp_id " +
+                                "<> 'Filesystem'");
+            this.database.exec ("ALTER TABLE Object RENAME TO _Object");
+            this.database.exec ("CREATE TABLE Object AS SELECT * FROM _Object");
+            this.database.exec ("DELETE FROM Object");
+            this.database.exec (this.sql.make (SQLString.TABLE_CLOSURE));
+            this.database.exec (this.sql.make (SQLString.TRIGGER_CLOSURE));
+            queue.offer ("0");
+            while (!queue.is_empty) {
+                GLib.Value[] args = { queue.poll () };
+                database.exec ("SELECT upnp_id FROM _Object WHERE parent = ?",
+                               args,
+                               (statement) => {
+                                   queue.offer (statement.column_text (0));
+
+                                   return true;
+                              });
+
+                database.exec ("INSERT INTO Object SELECT * FROM _Object " +
+                               "WHERE parent = ?",
+                               args);
+            }
+            database.exec ("DROP TABLE Object");
+            this.database.exec ("ALTER TABLE _Object RENAME TO Object");
+            database.exec (this.sql.make (SQLString.INDEX_COMMON));
+            database.exec (this.sql.make (SQLString.TRIGGER_COMMON));
+            database.exec ("UPDATE schema_info SET version = '10'");
+            database.commit ();
+            database.exec ("VACUUM");
+            database.analyze ();
+        } catch (DatabaseError error) {
+            database.rollback ();
+            warning ("Database upgrade failed: %s", error.message);
+            database = null;
+        }
+    }
 }
diff --git a/src/plugins/media-export/rygel-media-export-query-container.vala b/src/plugins/media-export/rygel-media-export-query-container.vala
index ff23774..6d7723a 100644
--- a/src/plugins/media-export/rygel-media-export-query-container.vala
+++ b/src/plugins/media-export/rygel-media-export-query-container.vala
@@ -85,7 +85,7 @@ internal class Rygel.MediaExport.QueryContainer : DBContainer {
             if (this.pattern == "") {
                 return (int) this.media_db.get_object_count_by_search_expression (
                                         this.expression,
-                                        "0");
+                                        "Filesystem");
             } else {
                 var data = this.media_db.get_object_attribute_by_search_expression (
                                         this.attribute,
@@ -123,7 +123,7 @@ internal class Rygel.MediaExport.QueryContainer : DBContainer {
         try {
             children = this.media_db.get_objects_by_search_expression (
                                             combined_expression,
-                                            "0",
+                                            "Filesystem",
                                             offset,
                                             max_count,
                                             out total_matches);
diff --git a/src/plugins/media-export/rygel-media-export-root-container.vala b/src/plugins/media-export/rygel-media-export-root-container.vala
index 03eac11..798b912 100644
--- a/src/plugins/media-export/rygel-media-export-root-container.vala
+++ b/src/plugins/media-export/rygel-media-export-root-container.vala
@@ -41,9 +41,10 @@ const Rygel.MediaExport.FolderDefinition[] virtual_folders_music = {
  * Represents the root container.
  */
 public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
-    private DBusService service;
-    private Harvester   harvester;
-    private Cancellable cancellable;
+    private DBusService    service;
+    private Harvester      harvester;
+    private Cancellable    cancellable;
+    private MediaContainer filesystem_container;
 
     private static MediaContainer instance = null;
 
@@ -68,7 +69,9 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
 
     public void add_uri (string uri) {
         var file = File.new_for_commandline_arg (uri);
-        this.harvester.schedule (file, this, "DBUS");
+        this.harvester.schedule (file,
+                                 this.filesystem_container,
+                                 "DBUS");
     }
 
     public void remove_uri (string uri) {
@@ -297,9 +300,17 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
             this.media_db.save_container (this);
         } catch (Error error) { } // do nothing
 
+        try {
+            this.filesystem_container = new NullContainer ();
+            this.filesystem_container.parent = this;
+            this.filesystem_container.title = "Filesystem";
+            this.filesystem_container.id = "Filesystem";
+            this.media_db.save_container (this.filesystem_container);
+        } catch (Error error) { }
+
         ArrayList<string> ids;
         try {
-            ids = media_db.get_child_ids ("0");
+            ids = media_db.get_child_ids ("Filesystem");
         } catch (DatabaseError e) {
             ids = new ArrayList<string> ();
         }
@@ -309,7 +320,8 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
             var file = File.new_for_commandline_arg (uri);
             if (file.query_exists (null)) {
                 ids.remove (MediaCache.get_id (file));
-                this.harvester.schedule (file, this);
+                this.harvester.schedule (file,
+                                         this.filesystem_container);
             }
         }
 
diff --git a/src/plugins/media-export/rygel-media-export-sql-factory.vala b/src/plugins/media-export/rygel-media-export-sql-factory.vala
index 1cc7a91..3ef1a61 100644
--- a/src/plugins/media-export/rygel-media-export-sql-factory.vala
+++ b/src/plugins/media-export/rygel-media-export-sql-factory.vala
@@ -154,7 +154,7 @@ internal class Rygel.MediaExport.SQLFactory : Object {
     "SELECT DISTINCT %s FROM meta_data AS m " +
         "WHERE %s IS NOT NULL %s ORDER BY %s LIMIT ?,?";
 
-    internal const string schema_version = "9";
+    internal const string schema_version = "10";
     internal const string CREATE_META_DATA_TABLE_STRING =
     "CREATE TABLE meta_data (size INTEGER NOT NULL, " +
                             "mime_type TEXT NOT NULL, " +



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