[rygel] media-export: Move filesystem to special folder
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] media-export: Move filesystem to special folder
- Date: Sat, 14 Aug 2010 23:32:56 +0000 (UTC)
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]