aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Marshall <jmarshall@never.you.mind>2011-02-26 15:03:50 +1300
committerJonathan Marshall <jmarshall@never.you.mind>2011-02-26 19:54:12 +1300
commit50ecc775d78ea3572e448f527281f867d59da114 (patch)
tree812c0f7402f0380c32569f0850e1cb38b5b4db8f
parentc67d8cfcd55da7721066daa59c693df78639f269 (diff)
use separate database files per version for sqlite connections, allowing better "safe updating/falling back" between XBMC versions.
-rw-r--r--xbmc/TextureDatabase.h2
-rw-r--r--xbmc/ViewDatabase.h2
-rw-r--r--xbmc/addons/AddonDatabase.h2
-rw-r--r--xbmc/dbwrappers/Database.cpp47
-rw-r--r--xbmc/dbwrappers/Database.h2
-rw-r--r--xbmc/music/MusicDatabase.h2
-rw-r--r--xbmc/programs/ProgramDatabase.h2
-rw-r--r--xbmc/video/VideoDatabase.h2
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);