diff options
author | Jonathan Marshall <jmarshall@never.you.mind> | 2011-02-26 15:03:50 +1300 |
---|---|---|
committer | Jonathan Marshall <jmarshall@never.you.mind> | 2011-02-26 19:54:12 +1300 |
commit | 50ecc775d78ea3572e448f527281f867d59da114 (patch) | |
tree | 812c0f7402f0380c32569f0850e1cb38b5b4db8f | |
parent | c67d8cfcd55da7721066daa59c693df78639f269 (diff) |
use separate database files per version for sqlite connections, allowing better "safe updating/falling back" between XBMC versions.
-rw-r--r-- | xbmc/TextureDatabase.h | 2 | ||||
-rw-r--r-- | xbmc/ViewDatabase.h | 2 | ||||
-rw-r--r-- | xbmc/addons/AddonDatabase.h | 2 | ||||
-rw-r--r-- | xbmc/dbwrappers/Database.cpp | 47 | ||||
-rw-r--r-- | xbmc/dbwrappers/Database.h | 2 | ||||
-rw-r--r-- | xbmc/music/MusicDatabase.h | 2 | ||||
-rw-r--r-- | xbmc/programs/ProgramDatabase.h | 2 | ||||
-rw-r--r-- | xbmc/video/VideoDatabase.h | 2 |
8 files changed, 52 insertions, 9 deletions
diff --git a/xbmc/TextureDatabase.h b/xbmc/TextureDatabase.h index 52c147ab7a..b1257df7e4 100644 --- a/xbmc/TextureDatabase.h +++ b/xbmc/TextureDatabase.h @@ -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"; }; }; diff --git a/xbmc/ViewDatabase.h b/xbmc/ViewDatabase.h index 448dcea957..27ee539019 100644 --- a/xbmc/ViewDatabase.h +++ b/xbmc/ViewDatabase.h @@ -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"; }; }; diff --git a/xbmc/addons/AddonDatabase.h b/xbmc/addons/AddonDatabase.h index b5c3cbaca9..744c560133 100644 --- a/xbmc/addons/AddonDatabase.h +++ b/xbmc/addons/AddonDatabase.h @@ -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"; } }; diff --git a/xbmc/dbwrappers/Database.cpp b/xbmc/dbwrappers/Database.cpp index 838fe1497b..270baff4f0 100644 --- a/xbmc/dbwrappers/Database.cpp +++ b/xbmc/dbwrappers/Database.cpp @@ -25,8 +25,10 @@ #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)) diff --git a/xbmc/dbwrappers/Database.h b/xbmc/dbwrappers/Database.h index 37c64f6adf..20ef4320e8 100644 --- a/xbmc/dbwrappers/Database.h +++ b/xbmc/dbwrappers/Database.h @@ -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); diff --git a/xbmc/music/MusicDatabase.h b/xbmc/music/MusicDatabase.h index 6a4a3bf9dd..1cbf96fedf 100644 --- a/xbmc/music/MusicDatabase.h +++ b/xbmc/music/MusicDatabase.h @@ -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); diff --git a/xbmc/programs/ProgramDatabase.h b/xbmc/programs/ProgramDatabase.h index b119956278..4f63216241 100644 --- a/xbmc/programs/ProgramDatabase.h +++ b/xbmc/programs/ProgramDatabase.h @@ -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 ); }; diff --git a/xbmc/video/VideoDatabase.h b/xbmc/video/VideoDatabase.h index 602bd7bc16..73bf1dd1c3 100644 --- a/xbmc/video/VideoDatabase.h +++ b/xbmc/video/VideoDatabase.h @@ -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); |