MythTV  0.26-pre
dbcheck.cpp
Go to the documentation of this file.
00001 #include <iostream>
00002 using namespace std;
00003 
00004 // Qt
00005 #include <QString>
00006 #include <QSqlError>
00007 
00008 // MythTV
00009 #include <mythcontext.h>
00010 #include <mythdb.h>
00011 
00012 // mytharchive
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends