use separate database files per version for sqlite connections, allowing better ...
authorJonathan Marshall <jmarshall@never.you.mind>
Sat, 26 Feb 2011 02:03:50 +0000 (15:03 +1300)
committerJonathan Marshall <jmarshall@never.you.mind>
Sat, 26 Feb 2011 06:54:12 +0000 (19:54 +1300)
xbmc/TextureDatabase.h
xbmc/ViewDatabase.h
xbmc/addons/AddonDatabase.h
xbmc/dbwrappers/Database.cpp
xbmc/dbwrappers/Database.h
xbmc/music/MusicDatabase.h
xbmc/programs/ProgramDatabase.h
xbmc/video/VideoDatabase.h

index 52c147a..b1257df 100644 (file)
@@ -61,5 +61,5 @@ protected:
   virtual bool CreateTables();
   virtual bool UpdateOldVersion(int version);
   virtual int GetMinVersion() const { return 6; };
-  const char *GetDefaultDBName() const { return "Textures"; };
+  const char *GetBaseDBName() const { return "Textures"; };
 };
index 448dcea..27ee539 100644 (file)
@@ -38,5 +38,5 @@ protected:
   virtual bool CreateTables();
   virtual bool UpdateOldVersion(int version);
   virtual int GetMinVersion() const { return 3; };
-  const char *GetDefaultDBName() const { return "ViewModes"; };
+  const char *GetBaseDBName() const { return "ViewModes"; };
 };
index b5c3cba..744c560 100644 (file)
@@ -99,6 +99,6 @@ protected:
   virtual bool CreateTables();
   virtual bool UpdateOldVersion(int version);
   virtual int GetMinVersion() const { return 12; }
-  const char *GetDefaultDBName() const { return "Addons"; }
+  const char *GetBaseDBName() const { return "Addons"; }
 };
 
index 838fe14..270baff 100644 (file)
 #include "settings/AdvancedSettings.h"
 #include "utils/Crc32.h"
 #include "filesystem/SpecialProtocol.h"
+#include "filesystem/File.h"
 #include "utils/AutoPtrHandle.h"
 #include "utils/log.h"
+#include "utils/URIUtils.h"
 
 using namespace AUTOPTR;
 using namespace dbiplus;
@@ -269,12 +271,53 @@ bool CDatabase::Open(DatabaseSettings &dbSettings)
       CLog::Log(LOGINFO, "essential mysql database information is missing (eg. host, name, user, pass)");
   }
 
-  // always safely fallback to sqlite3
+  // always safely fallback to sqlite3, and use separate, versioned database
   if (m_sqlite)
   {
     dbSettings.type = "sqlite3";
     dbSettings.host = _P(g_settings.GetDatabaseFolder());
-    dbSettings.name = GetDefaultDBName();
+
+    int version = GetMinVersion();
+    CStdString latestDb;
+    latestDb.Format("%s%d.db", GetBaseDBName(), version);
+    while (version >= 0)
+    {
+      if (version)
+        dbSettings.name.Format("%s%d.db", GetBaseDBName(), version);
+      else
+        dbSettings.name.Format("%s.db", GetBaseDBName());
+      if (Connect(dbSettings, false))
+      { 
+        // Database exists, take a copy for our current version (if needed) and reopen that one
+        if (version < GetMinVersion())
+        {
+          CLog::Log(LOGNOTICE, "Old database found - updating from version %i to %i", version, GetMinVersion());
+          Close();
+          CStdString currentDb = URIUtils::AddFileToFolder(dbSettings.host, dbSettings.name);
+          CStdString newPath = URIUtils::AddFileToFolder(dbSettings.host, latestDb);
+          if (!XFILE::CFile::Cache(currentDb, newPath))
+          {
+            CLog::Log(LOGERROR, "Unable to copy old database %s to new version %s", dbSettings.name.c_str(), latestDb.c_str());
+            return false;
+          }
+          dbSettings.name = latestDb;
+          if (!Connect(dbSettings, false))
+          {
+            CLog::Log(LOGERROR, "Unable to open freshly copied database %s", dbSettings.name.c_str());
+            return false;
+          }
+        }
+        // yay - we have a copy of our db, now do our worst with it
+        if (UpdateVersion(dbSettings.name))
+          return true;
+        // update failed - loop around and see if we have another one available
+        Close();
+      }
+      // drop back to the previous version and try that
+      version--;
+    }
+    // unable to open any version fall through to create a new one
+    dbSettings.name = latestDb;
   }
 
   if (Connect(dbSettings, true) && UpdateVersion(dbSettings.name))
index 37c64f6..20ef432 100644 (file)
@@ -112,7 +112,7 @@ protected:
   virtual bool UpdateOldVersion(int version) { return true; };
 
   virtual int GetMinVersion() const=0;
-  virtual const char *GetDefaultDBName() const=0;
+  virtual const char *GetBaseDBName() const=0;
 
   bool UpdateVersion(const CStdString &dbName);
 
index 6a4a3bf..1cbf96f 100644 (file)
@@ -215,7 +215,7 @@ protected:
 
   virtual bool CreateTables();
   virtual int GetMinVersion() const { return 16; };
-  const char *GetDefaultDBName() const { return "MyMusic7"; };
+  const char *GetBaseDBName() const { return "MyMusic"; };
 
   int AddAlbum(const CStdString& strAlbum1, int idArtist, const CStdString &extraArtists, const CStdString &strArtist1, int idThumb, int idGenre, const CStdString &extraGenres, int year);
   int AddGenre(const CStdString& strGenre);
index b119956..4f63216 100644 (file)
@@ -66,7 +66,7 @@ protected:
   virtual bool CreateTables();
   virtual bool UpdateOldVersion(int version);
   virtual int GetMinVersion() const { return 3; };
-  const char *GetDefaultDBName() const { return "MyPrograms6"; };
+  const char *GetBaseDBName() const { return "MyPrograms"; };
 
   FILETIME TimeStampToLocalTime( uint64_t timeStamp );
 };
index 602bd7b..73bf1dd 100644 (file)
@@ -639,7 +639,7 @@ private:
   int RunQuery(const CStdString &sql);
 
   virtual int GetMinVersion() const { return 44; };
-  const char *GetDefaultDBName() const { return "MyVideos34.db"; };
+  const char *GetBaseDBName() const { return "MyVideos"; };
 
   void ConstructPath(CStdString& strDest, const CStdString& strPath, const CStdString& strFileName);
   void SplitPath(const CStdString& strFileNameAndPath, CStdString& strPath, CStdString& strFileName);