core, media-export: Handle invalid database files
authorJens Georg <mail@jensge.org>
Wed, 12 Aug 2009 11:11:30 +0000 (13:11 +0200)
committerZeeshan Ali (Khattak) <zeeshanak@gnome.org>
Wed, 9 Sep 2009 13:46:28 +0000 (16:46 +0300)
This dummy container is used if the database file
cannot be opened.

src/plugins/media-export/Makefile.am
src/plugins/media-export/rygel-media-export-null-container.vala [new file with mode: 0644]
src/plugins/media-export/rygel-media-export-root-container.vala
src/rygel/rygel-media-db.vala

index 164ec29..83045f5 100644 (file)
@@ -10,6 +10,7 @@ AM_CFLAGS = $(LIBGUPNP_CFLAGS) \
            -I$(top_srcdir)/src/rygel -DDATA_DIR='"$(datadir)"'
 
 librygel_media_export_la_SOURCES = rygel-media-export-plugin.vala \
+                                  rygel-media-export-null-container.vala \
                                   rygel-media-export-root-container.vala \
                                   rygel-media-export-recursive-file-monitor.vala \
                                   rygel-media-export-harvester.vala \
diff --git a/src/plugins/media-export/rygel-media-export-null-container.vala b/src/plugins/media-export/rygel-media-export-null-container.vala
new file mode 100644 (file)
index 0000000..86d8ae8
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2009 Jens Georg <mail@jensge.org>.
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+using Rygel;
+using Gee;
+
+/**
+ * This is an empty container used to satisfy rygel if no mediadb could be
+ * created
+ */
+internal class Rygel.NullContainer : MediaContainer {
+    public NullContainer () {
+        base.root ("MediaExport", 0);
+    }
+
+    public override void get_children (uint               offset,
+                                       uint               max_count,
+                                       Cancellable?       cancellable,
+                                       AsyncReadyCallback callback) {
+        var res = new SimpleAsyncResult<int> (this, callback);
+        res.complete_in_idle ();
+    }
+
+    public override Gee.List<MediaObject>? get_children_finish (AsyncResult res)
+                                                                 throws Error {
+        return new Gee.ArrayList<MediaObject>();
+    }
+
+    public override void find_object (string             id,
+                                      Cancellable?       cancellable,
+                                      AsyncReadyCallback callback) {
+        var res = new SimpleAsyncResult<int> (this, callback);
+        res.complete_in_idle ();
+    }
+
+    public override MediaObject? find_object_finish (AsyncResult res)
+                                                                 throws Error {
+        return null;
+    }
+
+}
index c4b34f8..3e13e8d 100644 (file)
@@ -28,7 +28,7 @@ public class Rygel.MediaExportRootContainer : Rygel.MediaDBContainer {
     private HashMap<File, MediaExportHarvester> harvester;
     private MediaExportRecursiveFileMonitor monitor;
 
-    private static MediaExportRootContainer instance = null;
+    private static MediaContainer instance = null;
 
     private ArrayList<string> get_uris () {
         ArrayList<string> uris;
@@ -60,9 +60,16 @@ public class Rygel.MediaExportRootContainer : Rygel.MediaDBContainer {
         return uris;
     }
 
-    public static MediaExportRootContainer get_instance() {
+    public static MediaContainer get_instance() {
         if (MediaExportRootContainer.instance == null) {
-            MediaExportRootContainer.instance = new MediaExportRootContainer ();
+            try {
+                var db = MediaDB.create("media-export");
+                MediaExportRootContainer.instance =
+                                             new MediaExportRootContainer (db);
+            } catch (MediaDBError err) {
+                warning("Failed to create instance of database");
+                MediaExportRootContainer.instance = new NullContainer ();
+            }
         }
 
         return MediaExportRootContainer.instance;
@@ -71,8 +78,7 @@ public class Rygel.MediaExportRootContainer : Rygel.MediaDBContainer {
     /**
      * Create a new root container.
      */
-    private MediaExportRootContainer () {
-        var db = new MediaDB("media-export");
+    private MediaExportRootContainer (MediaDB db) {
         base (db, "0", "MediaExportRoot");
 
         this.extractor = new MetadataExtractor ();
index 752fe6b..52f6307 100644 (file)
@@ -218,8 +218,17 @@ public class Rygel.MediaDB : Object {
                 if (schema_info[1] == schema_version) {
                     debug ("Media DB schema has current version");
                 } else {
-                    debug ("Schema version differs... checking for upgrade");
-                    // FIXME implement if necessary
+                    int old_version = schema_info[1].to_int();
+                    int new_version = schema_version.to_int();
+                    if (schema_info[1].to_int() < schema_version.to_int()) {
+                        debug ("Older schema detected. Upgrading...");
+                    } else {
+                        // FIXME implement if necessary
+                        warning("The version \"%d\" of the detected database" +
+                                " is newer than our supported version \"%d\"",
+                                old_version, new_version);
+                        db = null;
+                    }
                 }
             } else {
                 warning ("Incompatible schema... cannot proceed");
@@ -236,7 +245,7 @@ public class Rygel.MediaDB : Object {
             if (rc != Sqlite.OK) {
                 warning ("Something weird going on: %s",
                          db.errmsg ());
-                db = null;
+                this.db = null;
                 return;
             }
 
@@ -244,23 +253,40 @@ public class Rygel.MediaDB : Object {
                 debug ("Empty database, creating new schema version %s",
                        schema_version);
                 if (!create_schema ()) {
+                    this.db = null;
                     return;
                 }
             } else {
                 warning ("Incompatible schema... cannot proceed");
+                this.db = null;
                 return;
             }
         }
     }
 
-    public MediaDB (string name) {
+    private MediaDB (string name, MediaDBObjectFactory factory) {
         open_db (name);
-        this.factory = new MediaDBObjectFactory ();
+        this.factory = factory;
     }
 
-    public MediaDB.with_factory (string name, MediaDBObjectFactory factory) {
-        open_db (name);
-        this.factory = factory;
+    public static MediaDB? create (string name) throws MediaDBError {
+        var instance = new MediaDB (name, new MediaDBObjectFactory());
+        if (instance.db != null) {
+            return instance;
+        }
+
+        throw new MediaDBError.GENERAL_ERROR("Invalid database");
+    }
+
+    public static MediaDB? create_with_factory (string               name,
+                                                MediaDBObjectFactory factory)
+                                                throws MediaDBError          {
+        var instance = new MediaDB (name, new MediaDBObjectFactory());
+        if (instance.db != null) {
+            return instance;
+        }
+
+        throw new MediaDBError.GENERAL_ERROR("Invalid database");
     }
 
     private bool sweeper () {