[rygel] media-export: Persist ServiceResetToken



commit 091afe87d40ab12a2e719239f1946bbd4d7e200f
Author: Jens Georg <jensg openismus com>
Date:   Thu Dec 6 14:10:56 2012 +0100

    media-export: Persist ServiceResetToken
    
    https://bugzilla.gnome.org/show_bug.cgi?id=689134

 src/plugins/media-export/Makefile.am               |    1 +
 .../rygel-media-export-media-cache-upgrader.vala   |   21 +++++++++++++++++
 .../rygel-media-export-media-cache.vala            |   24 ++++++++++++++++++++
 .../rygel-media-export-root-container.vala         |   20 +++++++++++++++-
 .../rygel-media-export-sql-factory.vala            |   11 +++++++-
 5 files changed, 74 insertions(+), 3 deletions(-)
---
diff --git a/src/plugins/media-export/Makefile.am b/src/plugins/media-export/Makefile.am
index 5ef84c4..013f42c 100644
--- a/src/plugins/media-export/Makefile.am
+++ b/src/plugins/media-export/Makefile.am
@@ -48,6 +48,7 @@ librygel_media_export_la_VALAFLAGS = \
 	--pkg gstreamer-tag-1.0 \
 	--pkg gstreamer-app-1.0 \
 	--pkg sqlite3 \
+	--pkg uuid \
 	$(RYGEL_COMMON_SERVER_PLUGIN_VALAFLAGS)
 
 librygel_media_export_la_LIBADD = \
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 c1f540e..47d6c10 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
@@ -110,6 +110,9 @@ internal class Rygel.MediaExport.MediaCacheUpgrader {
                     case 10:
                         update_v10_v11 ();
                         break;
+                    case 11:
+                        update_v11_v12 ();
+                        break;
                     default:
                         warning ("Cannot upgrade");
                         database = null;
@@ -365,4 +368,22 @@ internal class Rygel.MediaExport.MediaCacheUpgrader {
             database = null;
         }
     }
+
+    private void update_v11_v12 () {
+        try {
+            this.database.begin ();
+            this.database.exec ("ALTER TABLE schema_info " +
+                                "ADD COLUMN reset_token TEXT");
+            this.database.exec ("UPDATE schema_info SET reset_token = '" +
+                                UUID.get () + "'");
+            this.database.exec ("UPDATE schema_info SET version = '12'");
+            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 a07584c..6b2f537 100644
--- a/src/plugins/media-export/rygel-media-export-media-cache.vala
+++ b/src/plugins/media-export/rygel-media-export-media-cache.vala
@@ -430,6 +430,29 @@ public class Rygel.MediaExport.MediaCache : Object {
         return uris;
     }
 
+    public string get_reset_token () {
+        try {
+            var cursor = this.exec_cursor (SQLString.RESET_TOKEN);
+            var statement = cursor.next ();
+
+            return statement->column_text (0);
+        } catch (DatabaseError error) {
+            warning ("Failed to get reset token");
+
+            return UUID.get ();
+        }
+    }
+
+    public void save_reset_token (string token) {
+        try {
+            GLib.Value[] args = { token };
+
+            this.db.exec ("UPDATE schema_info SET reset_token = ?", args);
+        } catch (DatabaseError error) {
+            warning ("Failed to persist ServiceResetToken: %s", error.message);
+        }
+    }
+
     // Private functions
     private void get_exists_cache () throws DatabaseError {
         this.exists_cache = new HashMap<string, ExistsCacheEntry?> ();
@@ -602,6 +625,7 @@ public class Rygel.MediaExport.MediaCache : Object {
             db.exec (this.sql.make (SQLString.TRIGGER_CLOSURE));
             db.commit ();
             db.analyze ();
+            this.save_reset_token (UUID.get ());
 
             return true;
         } catch (Error err) {
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 f3af66b..8bcbcfb 100644
--- a/src/plugins/media-export/rygel-media-export-root-container.vala
+++ b/src/plugins/media-export/rygel-media-export-root-container.vala
@@ -40,7 +40,8 @@ const Rygel.MediaExport.FolderDefinition[] VIRTUAL_FOLDERS_MUSIC = {
 /**
  * Represents the root container.
  */
-public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
+public class Rygel.MediaExport.RootContainer : Rygel.TrackableContainer,
+                                               Rygel.MediaExport.DBContainer {
     private DBusService    service;
     private Harvester      harvester;
     private Cancellable    cancellable;
@@ -190,7 +191,14 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
         }
     }
 
+    // TrackableContainer overrides
+    public string get_service_reset_token () {
+        return this.media_db.get_reset_token ();
+    }
 
+    public void set_service_reset_token (string token) {
+        this.media_db.save_reset_token (token);
+    }
 
     private ArrayList<File> get_shared_uris () {
         ArrayList<string> uris;
@@ -483,4 +491,14 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
             container.updated ();
         }
     }
+
+    public async void add_child (MediaObject object) {
+        // TODO: Implement
+        assert_not_reached ();
+    }
+
+    public async void remove_child (MediaObject object) {
+        // TODO: Implement
+        assert_not_reached ();
+    }
 }
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 a7a7b08..35e808c 100644
--- a/src/plugins/media-export/rygel-media-export-sql-factory.vala
+++ b/src/plugins/media-export/rygel-media-export-sql-factory.vala
@@ -69,6 +69,7 @@ internal enum Rygel.MediaExport.SQLString {
     SCHEMA,
     EXISTS_CACHE,
     STATISTICS,
+    RESET_TOKEN
 }
 
 internal class Rygel.MediaExport.SQLFactory : Object {
@@ -161,7 +162,7 @@ internal class Rygel.MediaExport.SQLFactory : Object {
         "WHERE _column IS NOT NULL %s ORDER BY _column COLLATE CASEFOLD " +
     "LIMIT ?,?";
 
-    internal const string SCHEMA_VERSION = "11";
+    internal const string SCHEMA_VERSION = "12";
     internal const string CREATE_META_DATA_TABLE_STRING =
     "CREATE TABLE meta_data (size INTEGER NOT NULL, " +
                             "mime_type TEXT NOT NULL, " +
@@ -186,7 +187,8 @@ internal class Rygel.MediaExport.SQLFactory : Object {
                                     "ON DELETE CASCADE);";
 
     private const string SCHEMA_STRING =
-    "CREATE TABLE schema_info (version TEXT NOT NULL); " +
+    "CREATE TABLE schema_info (version TEXT NOT NULL, " +
+                              "reset_token TEXT); " +
     CREATE_META_DATA_TABLE_STRING +
     "CREATE TABLE object (parent TEXT CONSTRAINT parent_fk_id " +
                                 "REFERENCES Object(upnp_id), " +
@@ -254,6 +256,9 @@ internal class Rygel.MediaExport.SQLFactory : Object {
     private const string STATISTICS_STRING =
     "SELECT class, count(1) FROM meta_data GROUP BY class";
 
+    private const string RESET_TOKEN_STRING =
+    "SELECT reset_token FROM schema_info";
+
     public unowned string make (SQLString query) {
         switch (query) {
             case SQLString.SAVE_METADATA:
@@ -298,6 +303,8 @@ internal class Rygel.MediaExport.SQLFactory : Object {
                 return CREATE_CLOSURE_TABLE;
             case SQLString.STATISTICS:
                 return STATISTICS_STRING;
+            case SQLString.RESET_TOKEN:
+                return RESET_TOKEN_STRING;
             default:
                 assert_not_reached ();
         }



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