From cd76ae5f545c5489f2dcd35486ba0a994add947d Mon Sep 17 00:00:00 2001 From: Jens Georg Date: Sat, 17 Aug 2013 09:04:44 +0200 Subject: [PATCH] media-export: Remove container-search hack https://bugzilla.gnome.org/show_bug.cgi?id=706059 --- .../rygel-media-export-media-cache-upgrader.vala | 24 ++++++++- .../rygel-media-export-media-cache.vala | 57 ++++++++++++++-------- .../rygel-media-export-sql-factory.vala | 2 +- 3 files changed, 60 insertions(+), 23 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 c8eade2..aea5075 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 @@ -123,7 +123,10 @@ internal class Rygel.MediaExport.MediaCacheUpgrader { this.update_v13_v14 (); break; case 14: - this.update_v14_v15(); + this.update_v14_v15 (); + break; + case 15: + this.update_v15_v16 (); break; default: warning ("Cannot upgrade"); @@ -520,4 +523,23 @@ internal class Rygel.MediaExport.MediaCacheUpgrader { database = null; } } + + private void update_v15_v16 () { + try { + this.database.begin (); + this.database.exec ("INSERT INTO meta_data (size, mime_type, " + + "class, object_fk) SELECT 0, " + + "'inode/directory', 'object.container', " + + "o.upnp_id FROM object AS o WHERE " + + "o.type_fk=0;"); + this.database.exec ("UPDATE schema_info SET version = '16'"); + 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-media-cache.vala b/src/plugins/media-export/rygel-media-export-media-cache.vala index 853c97a..e4c4eb7 100644 --- a/src/plugins/media-export/rygel-media-export-media-cache.vala +++ b/src/plugins/media-export/rygel-media-export-media-cache.vala @@ -106,7 +106,8 @@ public class Rygel.MediaExport.MediaCache : Object { public void save_container (MediaContainer container) throws Error { try { db.begin (); - create_object (container); + this.save_container_metadata (container); + this.create_object (container); db.commit (); } catch (DatabaseError error) { db.rollback (); @@ -122,8 +123,8 @@ public class Rygel.MediaExport.MediaCache : Object { bool override_guarded = false) throws Error { try { db.begin (); - save_metadata (item); - create_object (item, override_guarded); + this.save_item_metadata (item); + this.create_object (item, override_guarded); db.commit (); } catch (DatabaseError error) { warning (_("Failed to add item with ID %s: %s"), @@ -665,7 +666,34 @@ public class Rygel.MediaExport.MediaCache : Object { } } - private void save_metadata (Rygel.MediaItem item) throws Error { + private void save_container_metadata (MediaContainer container) throws Error { + // Fill common properties + GLib.Value[] values = { 0, + "inode/directory", + -1, + -1, + container.upnp_class, + Database.null (), + Database.null (), + Database.null (), + -1, + -1, + -1, + -1, + -1, + -1, + -1, + container.id, + Database.null (), + Database.null (), + -1, + Database.null ()}; + + this.db.exec (this.sql.make (SQLString.SAVE_METADATA), values); + } + + + private void save_item_metadata (Rygel.MediaItem item) throws Error { // Fill common properties GLib.Value[] values = { item.size, item.mime_type, @@ -1097,16 +1125,9 @@ public class Rygel.MediaExport.MediaCache : Object { case SearchCriteriaOp.LEQ: case SearchCriteriaOp.GREATER: case SearchCriteriaOp.GEQ: - if (column == "m.class" && - exp.op == SearchCriteriaOp.EQ && - exp.operand2 == "object.container") { - operator = new SqlOperator ("=", "o.type_fk"); - v = (int) ObjectType.CONTAINER; - } else { - v = exp.operand2; - operator = new SqlOperator.from_search_criteria_op + v = exp.operand2; + operator = new SqlOperator.from_search_criteria_op (exp.op, column, collate); - } break; case SearchCriteriaOp.CONTAINS: operator = new SqlFunction ("contains", column); @@ -1117,14 +1138,8 @@ public class Rygel.MediaExport.MediaCache : Object { v = exp.operand2; break; case SearchCriteriaOp.DERIVED_FROM: - if (column == "m.class" && - exp.operand2.has_prefix("object.container")) { - operator = new SqlOperator ("=", "o.type_fk"); - v = (int) ObjectType.CONTAINER; - } else { - operator = new SqlOperator ("LIKE", column); - v = "%s%%".printf (exp.operand2); - } + operator = new SqlOperator ("LIKE", column); + v = "%s%%".printf (exp.operand2); break; default: warning ("Unsupported op %d", exp.op); 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 3aaff50..e74c811 100644 --- a/src/plugins/media-export/rygel-media-export-sql-factory.vala +++ b/src/plugins/media-export/rygel-media-export-sql-factory.vala @@ -188,7 +188,7 @@ internal class Rygel.MediaExport.SQLFactory : Object { "WHERE _column IS NOT NULL %s %s" + "LIMIT ?,?"; - internal const string SCHEMA_VERSION = "15"; + internal const string SCHEMA_VERSION = "16"; internal const string CREATE_META_DATA_TABLE_STRING = "CREATE TABLE meta_data (size INTEGER NOT NULL, " + "mime_type TEXT NOT NULL, " + -- 2.7.4