00001 #include <iostream>
00002 using namespace std;
00003
00004
00005 #include <QString>
00006 #include <QSqlError>
00007
00008
00009 #include <mythcontext.h>
00010 #include <mythdb.h>
00011
00012
00013 #include "dbcheck.h"
00014
00015 const QString currentDatabaseVersion = "1005";
00016
00017 static bool UpdateDBVersionNumber(const QString &newnumber)
00018 {
00019
00020 if (!gCoreContext->SaveSettingOnHost("ArchiveDBSchemaVer",newnumber,NULL))
00021 {
00022 LOG(VB_GENERAL, LOG_ERR,
00023 QString("DB Error (Setting new DB version number): %1\n")
00024 .arg(newnumber));
00025
00026 return false;
00027 }
00028
00029 return true;
00030 }
00031
00032 static bool performActualUpdate(const QString updates[], QString version,
00033 QString &dbver)
00034 {
00035 MSqlQuery query(MSqlQuery::InitCon());
00036
00037 LOG(VB_GENERAL, LOG_NOTICE,
00038 "Upgrading to MythArchive schema version " + version);
00039
00040 int counter = 0;
00041 QString thequery = updates[counter];
00042
00043 while (thequery != "")
00044 {
00045 if (!query.exec(thequery))
00046 {
00047 QString msg =
00048 QString("DB Error (Performing database upgrade): \n"
00049 "Query was: %1 \nError was: %2 \nnew version: %3")
00050 .arg(thequery)
00051 .arg(MythDB::DBErrorMessage(query.lastError()))
00052 .arg(version);
00053 LOG(VB_GENERAL, LOG_ERR, msg);
00054 return false;
00055 }
00056
00057 counter++;
00058 thequery = updates[counter];
00059 }
00060
00061 if (!UpdateDBVersionNumber(version))
00062 return false;
00063
00064 dbver = version;
00065 return true;
00066 }
00067
00068 bool UpgradeArchiveDatabaseSchema(void)
00069 {
00070 QString dbver = gCoreContext->GetSetting("ArchiveDBSchemaVer");
00071
00072 if (dbver == currentDatabaseVersion)
00073 return true;
00074
00075 if (dbver == "")
00076 {
00077 LOG(VB_GENERAL, LOG_INFO,
00078 "Inserting MythArchive initial database information.");
00079
00080 const QString updates[] =
00081 {
00082 "DROP TABLE IF EXISTS archiveitems;",
00083
00084 "CREATE TABLE IF NOT EXISTS archiveitems ("
00085 " intid INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,"
00086 " type set ('Recording','Video','File'),"
00087 " title VARCHAR(128),"
00088 " subtitle VARCHAR(128),"
00089 " description TEXT,"
00090 " startdate VARCHAR(30),"
00091 " starttime VARCHAR(30),"
00092 " size INT UNSIGNED NOT NULL,"
00093 " filename TEXT NOT NULL,"
00094 " hascutlist BOOL NOT NULL DEFAULT 0,"
00095 " cutlist TEXT,"
00096 " INDEX (title)"
00097 ");",
00098 ""
00099 };
00100 if (!performActualUpdate(updates, "1000", dbver))
00101 return false;
00102 }
00103
00104 if (dbver == "1000")
00105 {
00106 const QString updates[] =
00107 {
00108 "ALTER TABLE archiveitems MODIFY size BIGINT UNSIGNED NOT NULL;",
00109 ""
00110 };
00111
00112 if (!performActualUpdate(updates, "1001", dbver))
00113 return false;
00114 }
00115
00116
00117 if (dbver == "1001")
00118 {
00119 const QString updates[] =
00120 {
00121 QString("ALTER DATABASE %1 DEFAULT CHARACTER SET latin1;")
00122 .arg(gContext->GetDatabaseParams().dbName),
00123 "ALTER TABLE archiveitems"
00124 " MODIFY title varbinary(128) default NULL,"
00125 " MODIFY subtitle varbinary(128) default NULL,"
00126 " MODIFY description blob,"
00127 " MODIFY startdate varbinary(30) default NULL,"
00128 " MODIFY starttime varbinary(30) default NULL,"
00129 " MODIFY filename blob,"
00130 " MODIFY cutlist blob;",
00131 ""
00132 };
00133
00134 if (!performActualUpdate(updates, "1002", dbver))
00135 return false;
00136 }
00137
00138
00139 if (dbver == "1002")
00140 {
00141 const QString updates[] =
00142 {
00143 QString("ALTER DATABASE %1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;")
00144 .arg(gContext->GetDatabaseParams().dbName),
00145 "ALTER TABLE archiveitems"
00146 " DEFAULT CHARACTER SET default,"
00147 " MODIFY title varchar(128) CHARACTER SET utf8 default NULL,"
00148 " MODIFY subtitle varchar(128) CHARACTER SET utf8 default NULL,"
00149 " MODIFY description text CHARACTER SET utf8,"
00150 " MODIFY startdate varchar(30) CHARACTER SET utf8 default NULL,"
00151 " MODIFY starttime varchar(30) CHARACTER SET utf8 default NULL,"
00152 " MODIFY filename text CHARACTER SET utf8 NOT NULL,"
00153 " MODIFY cutlist text CHARACTER SET utf8;",
00154 ""
00155 };
00156
00157 if (!performActualUpdate(updates, "1003", dbver))
00158 return false;
00159 }
00160
00161 if (dbver == "1003")
00162 {
00163 const QString updates[] =
00164 {
00165 "ALTER TABLE `archiveitems` "
00166 "ADD duration INT UNSIGNED NOT NULL DEFAULT 0, "
00167 "ADD cutduration INT UNSIGNED NOT NULL DEFAULT 0, "
00168 "ADD videowidth INT UNSIGNED NOT NULL DEFAULT 0, "
00169 "ADD videoheight INT UNSIGNED NOT NULL DEFAULT 0, "
00170 "ADD filecodec VARCHAR(50) NOT NULL DEFAULT '', "
00171 "ADD videocodec VARCHAR(50) NOT NULL DEFAULT '', "
00172 "ADD encoderprofile VARCHAR(50) NOT NULL DEFAULT 'NONE';",
00173 ""
00174 };
00175
00176 if (!performActualUpdate(updates, "1004", dbver))
00177 return false;
00178 }
00179
00180 if (dbver == "1004")
00181 {
00182 const QString updates[] =
00183 {
00184 "DELETE FROM keybindings "
00185 " WHERE action = 'DELETEITEM' AND context = 'Archive';",
00186 ""
00187 };
00188
00189 if (!performActualUpdate(updates, "1005", dbver))
00190 return false;
00191 }
00192
00193 return true;
00194 }
00195