Пример #1
0
static bool performActualUpdate(const QString updates[], QString version,
                                QString &dbver)
{
    MSqlQuery query(MSqlQuery::InitCon());

    LOG(VB_GENERAL, LOG_NOTICE,
        "Upgrading to MythNews schema version " + version);

    int counter = 0;
    QString thequery = updates[counter];

    while (thequery != "")
    {
        if (!query.exec(thequery))
        {
            QString msg =
                QString("DB Error (Performing database upgrade): \n"
                        "Query was: %1 \nError was: %2 \nnew version: %3")
                .arg(thequery)
                .arg(MythDB::DBErrorMessage(query.lastError()))
                .arg(version);
            LOG(VB_GENERAL, LOG_ERR, msg);
            return false;
        }

        counter++;
        thequery = updates[counter];
    }

    if (!UpdateDBVersionNumber(version))
        return false;

    dbver = version;
    return true;
}
Пример #2
0
static bool performActualUpdate(const QStringList updates, QString version,
                                QString &dbver)
{
    VERBOSE(VB_IMPORTANT, "Upgrading to MythWeather schema version " + version);

    MSqlQuery query(MSqlQuery::InitCon());

    QStringList::const_iterator it = updates.begin();

    while (it != updates.end())
    {
        QString thequery = *it;
        if (!query.exec(thequery))
        {
            QString msg =
                QString("DB Error (Performing database upgrade): \n"
                        "Query was: %1 \nError was: %2 \nnew version: %3")
                .arg(thequery)
                .arg(MythDB::DBErrorMessage(query.lastError()))
                .arg(version);
            VERBOSE(VB_IMPORTANT, msg);
            return false;
        }
        ++it;
    }

    if (!UpdateDBVersionNumber(version))
        return false;

    dbver = version;
    return true;
}
Пример #3
0
static bool performActualUpdate(const QStringList &updates,
                                const QString &version,
                                QString &dbver, const QString &field_name)
{
    MSqlQuery query(MSqlQuery::InitCon());

    LOG(VB_GENERAL, LOG_NOTICE,
        QString("Upgrading to MythVideo schema version %1") .arg(version));

    for (QStringList::const_iterator p = updates.begin();
         p != updates.end(); ++p)
    {
        if (!query.exec(*p))
        {
            MythDB::DBError("performActualUpdate", query);
            return false;
        }
    }

    if (!UpdateDBVersionNumber(field_name, version))
        return false;
    dbver = version;
    return true;
}
Пример #4
0
bool doUpgradeVideoDatabaseSchema(void)
{
    QString dbver = gCoreContext->GetSetting("mythvideo.DBSchemaVer");
    if (dbver == finalVideoDatabaseVersion)
    {
        return true;
    }

    QString olddbver = gCoreContext->GetSetting("VideoDBSchemaVer");
    QString dvddbver = gCoreContext->GetSetting("DVDDBSchemaVer");
    if (dbver.isEmpty() && olddbver.isEmpty() && dvddbver.isEmpty())
    {
        if (!InitializeVideoSchema())
            return false;
        dbver = gCoreContext->GetSetting("mythvideo.DBSchemaVer");
    }

    if (dbver.isEmpty() || dbver.toInt() <  minimumVideoDatabaseVersion.toInt())
    {
        LOG(VB_GENERAL, LOG_ERR,
            "Unrecognized video database schema version. "
            "Unable to upgrade database.");
        LOG(VB_GENERAL, LOG_ERR, QString("mythvideo.DBSchemaVer: '%1', "
            "VideoDBSchemaVer: '%2', DVDDBSchemaVer: '%3'").arg(dbver)
                .arg(olddbver).arg(dvddbver));
        return false;
    }

    if (dbver == "1016")
    {
        const QString updates[] = {
"ALTER TABLE dvdbookmark"
"  MODIFY serialid varbinary(16) NOT NULL default '',"
"  MODIFY name varbinary(32) default NULL;",
"ALTER TABLE dvdinput"
"  MODIFY v_format varbinary(16) default NULL;",
"ALTER TABLE dvdtranscode"
"  MODIFY name varbinary(128) NOT NULL,"
"  MODIFY codec varbinary(128) NOT NULL,"
"  MODIFY codec_param varbinary(128) default NULL,"
"  MODIFY tc_param varbinary(128) default NULL;",
"ALTER TABLE filemarkup"
"  MODIFY filename blob NOT NULL;",
"ALTER TABLE videocast"
"  MODIFY cast varbinary(128) NOT NULL;",
"ALTER TABLE videocategory"
"  MODIFY category varbinary(128) NOT NULL;",
"ALTER TABLE videocountry"
"  MODIFY country varbinary(128) NOT NULL;",
"ALTER TABLE videogenre"
"  MODIFY genre varbinary(128) NOT NULL;",
"ALTER TABLE videometadata"
"  MODIFY title varbinary(128) NOT NULL,"
"  MODIFY director varbinary(128) NOT NULL,"
"  MODIFY plot blob,"
"  MODIFY rating varbinary(128) NOT NULL,"
"  MODIFY inetref varbinary(255) NOT NULL,"
"  MODIFY filename blob NOT NULL,"
"  MODIFY coverfile blob NOT NULL,"
"  MODIFY playcommand varbinary(255) default NULL;",
"ALTER TABLE videotypes"
"  MODIFY extension varbinary(128) NOT NULL,"
"  MODIFY playcommand varbinary(255) NOT NULL;",
""
};

        if (!performActualUpdate(updates, "1017", dbver,
                                 MythVideoVersionName))
            return false;
    }


    if (dbver == "1017")
    {
        const QString updates[] = {
"ALTER TABLE dvdbookmark"
"  DEFAULT CHARACTER SET default,"
"  MODIFY serialid varchar(16) CHARACTER SET utf8 NOT NULL default '',"
"  MODIFY name varchar(32) CHARACTER SET utf8 default NULL;",
"ALTER TABLE dvdinput"
"  DEFAULT CHARACTER SET default,"
"  MODIFY v_format varchar(16) CHARACTER SET utf8 default NULL;",
"ALTER TABLE dvdtranscode"
"  DEFAULT CHARACTER SET default,"
"  MODIFY name varchar(128) CHARACTER SET utf8 NOT NULL,"
"  MODIFY codec varchar(128) CHARACTER SET utf8 NOT NULL,"
"  MODIFY codec_param varchar(128) CHARACTER SET utf8 default NULL,"
"  MODIFY tc_param varchar(128) CHARACTER SET utf8 default NULL;",
"ALTER TABLE filemarkup"
"  DEFAULT CHARACTER SET default,"
"  MODIFY filename text CHARACTER SET utf8 NOT NULL;",
"ALTER TABLE videocast"
"  DEFAULT CHARACTER SET default,"
"  MODIFY cast varchar(128) CHARACTER SET utf8 NOT NULL;",
"ALTER TABLE videocategory"
"  DEFAULT CHARACTER SET default,"
"  MODIFY category varchar(128) CHARACTER SET utf8 NOT NULL;",
"ALTER TABLE videocountry"
"  DEFAULT CHARACTER SET default,"
"  MODIFY country varchar(128) CHARACTER SET utf8 NOT NULL;",
"ALTER TABLE videogenre"
"  DEFAULT CHARACTER SET default,"
"  MODIFY genre varchar(128) CHARACTER SET utf8 NOT NULL;",
"ALTER TABLE videometadata"
"  DEFAULT CHARACTER SET default,"
"  MODIFY title varchar(128) CHARACTER SET utf8 NOT NULL,"
"  MODIFY director varchar(128) CHARACTER SET utf8 NOT NULL,"
"  MODIFY plot text CHARACTER SET utf8,"
"  MODIFY rating varchar(128) CHARACTER SET utf8 NOT NULL,"
"  MODIFY inetref varchar(255) CHARACTER SET utf8 NOT NULL,"
"  MODIFY filename text CHARACTER SET utf8 NOT NULL,"
"  MODIFY coverfile text CHARACTER SET utf8 NOT NULL,"
"  MODIFY playcommand varchar(255) CHARACTER SET utf8 default NULL;",
"ALTER TABLE videometadatacast"
"  DEFAULT CHARACTER SET default;",
"ALTER TABLE videometadatacountry"
"  DEFAULT CHARACTER SET default;",
"ALTER TABLE videometadatagenre"
"  DEFAULT CHARACTER SET default;",
"ALTER TABLE videotypes"
"  DEFAULT CHARACTER SET default,"
"  MODIFY extension varchar(128) CHARACTER SET utf8 NOT NULL,"
"  MODIFY playcommand varchar(255) CHARACTER SET utf8 NOT NULL;",
""
};

        if (!performActualUpdate(updates, "1018", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1018")
    {
        QStringList updates;
        updates += "DELETE FROM settings WHERE value="
                   "'MovieListCommandLine' AND data LIKE '%imdb%';";
        updates += "DELETE FROM settings WHERE value="
                   "'MovieDataCommandLine' AND data LIKE '%imdb%';";
        updates += "DELETE FROM settings WHERE value="
                   "'MoviePosterCommandLine' AND data LIKE '%imdb%';";
        if (!performActualUpdate(updates, "1019", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1019")
    {
        QStringList updates(
                "ALTER TABLE videometadata ADD `trailer` TEXT;");
        if (!performActualUpdate(updates, "1020", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1020")
    {
        LOG(VB_GENERAL, LOG_NOTICE,
            "Upgrading to MythVideo schema version 1021");

        AddFileType("mkv");
        AddFileType("mp4");
        AddFileType("m2ts");
        AddFileType("evo");
        AddFileType("divx");
        AddFileType("mov");
        AddFileType("qt");
        AddFileType("wmv");
        AddFileType("3gp");
        AddFileType("asf");
        AddFileType("ogg");
        AddFileType("ogm");
        AddFileType("flv");

        if (!UpdateDBVersionNumber(MythVideoVersionName, "1021"))
            return false;

        dbver = "1021";
    }

    if (dbver == "1021")
    {
         QStringList updates;
         updates += "ALTER TABLE videometadata ADD host text CHARACTER SET utf8 NOT NULL;";

         if (!performActualUpdate(updates, "1022", dbver,
                                  MythVideoVersionName))
            return false;
     }

    if (dbver == "1022")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD `screenshot` TEXT;";
        updates += "ALTER TABLE videometadata ADD `banner` TEXT;";
        updates += "ALTER TABLE videometadata ADD `fanart` TEXT;";
        if (!performActualUpdate(updates, "1023", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1023")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD `subtitle` TEXT "
                   "NOT NULL AFTER `title`;";
        updates += "ALTER TABLE videometadata ADD `season` SMALLINT "
                   "UNSIGNED NOT NULL DEFAULT '0' AFTER `length`;";
        updates += "ALTER TABLE videometadata ADD `episode` SMALLINT "
                   "UNSIGNED NOT NULL DEFAULT '0' AFTER `season`;";
        if (!performActualUpdate(updates, "1024", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1024")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD watched BOOL "
                   "NOT NULL DEFAULT 0 AFTER browse;";
        if (!performActualUpdate(updates, "1025", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1025")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD `insertdate` TIMESTAMP "
                   "NULL DEFAULT CURRENT_TIMESTAMP AFTER `fanart`;";
        if (!performActualUpdate(updates, "1026", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1026")
    {
        QStringList updates;
        updates += "DELETE FROM keybindings "
                   " WHERE action = 'DELETE' AND context = 'Video';";
        if (!performActualUpdate(updates, "1027", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1027")
    {
        LOG(VB_GENERAL, LOG_NOTICE,
            "Upgrading to MythVideo schema version 1028");
        LOG(VB_GENERAL, LOG_INFO,
            "Converting filenames in filemarkup table "
            "from absolute to relative paths.  This may take a long "
            "time if you have a large number of MythVideo seektables.");

        bool ok = true;
        MSqlQuery query(MSqlQuery::InitCon());
        MSqlQuery update(MSqlQuery::InitCon());

        query.prepare("SELECT DISTINCT filename FROM filemarkup;");
        update.prepare("UPDATE filemarkup SET filename = :RELPATH "
                       "    WHERE filename = :FULLPATH;");
        if (query.exec())
        {
            QString origPath;
            QString relPath;
            while (query.next())
            {
                origPath = query.value(0).toString();
                if (origPath.startsWith("dvd:"))
                    continue;

                relPath = StorageGroup::GetRelativePathname(origPath);
                if ((!relPath.isEmpty()) &&
                    (relPath != origPath))
                {
                    update.bindValue(":RELPATH", relPath);
                    update.bindValue(":FULLPATH", origPath);
                    if (!update.exec())
                    {
                        LOG(VB_GENERAL, LOG_ERR,
                            QString("ERROR converting '%1' to '%2' in "
                                    "filemarkup table.")
                                .arg(origPath).arg(relPath));
                        ok = false;
                    }
                }
            }
        }
        else
            ok = false;

        if (!ok)
            return false;

        if (!UpdateDBVersionNumber(MythVideoVersionName, "1028"))
            return false;

        dbver = "1028";
    }

    if (dbver == "1028")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD `releasedate` DATE "
                   "NOT NULL AFTER `year`;";
        updates += "ALTER TABLE videometadata ADD `homepage` TEXT "
                   "NOT NULL AFTER `inetref`;";
        if (!performActualUpdate(updates, "1029", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1029")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD `hash` VARCHAR(128) "
                   "NOT NULL AFTER `filename`;";
        if (!performActualUpdate(updates, "1030", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1030")
    {
        UpdateHashes();
        if (!UpdateDBVersionNumber(MythVideoVersionName, "1031"))
            return false;

        dbver = "1031";
    }

    if (dbver == "1031")
    {
        MSqlQuery query(MSqlQuery::InitCon());
        query.prepare("SHOW INDEX FROM videometadata");

        if (!query.exec())
        {
            MythDB::DBError("Unable to retrieve current indices on "
                            "videometadata.", query);
        }
        else
        {
            while (query.next())
            {
                QString index_name = query.value(2).toString();

                if ("title_2" == index_name)
                {
                    MSqlQuery update(MSqlQuery::InitCon());
                    update.prepare("ALTER TABLE videometadata "
                                   " DROP INDEX title_2");

                    if (!update.exec())
                         MythDB::DBError("Unable to drop duplicate index "
                                         "on videometadata. Ignoring.",
                                         update);
                    break;
                }
            }
        }

        if (!UpdateDBVersionNumber(MythVideoVersionName, "1032"))
            return false;

        dbver = "1032";
    }

    if (dbver == "1032")
    {
        QStringList updates;
        updates += "CREATE TEMPORARY TABLE bad_videometadatacast"
                    "       AS SELECT * FROM videometadatacast;";
        updates += "CREATE TEMPORARY TABLE bad_videometadatagenre"
                   "       AS SELECT * FROM videometadatagenre;";
        updates += "CREATE TEMPORARY TABLE bad_videometadatacountry"
                   "       AS SELECT * FROM videometadatacountry;";
        updates += "TRUNCATE TABLE videometadatacast;";
        updates += "TRUNCATE TABLE videometadatagenre;";
        updates += "TRUNCATE TABLE videometadatacountry;";
        updates += "INSERT videometadatacast SELECT idvideo,idcast"
                   "       FROM bad_videometadatacast GROUP BY idvideo,idcast;";
        updates += "INSERT videometadatagenre SELECT idvideo,idgenre"
                   "       FROM bad_videometadatagenre GROUP BY idvideo,idgenre;";
        updates += "INSERT videometadatacountry SELECT idvideo,idcountry"
                   "       FROM bad_videometadatacountry GROUP BY idvideo,idcountry;";
        updates += "DROP TEMPORARY TABLE bad_videometadatacast;";
        updates += "DROP TEMPORARY TABLE bad_videometadatagenre;";
        updates += "DROP TEMPORARY TABLE bad_videometadatacountry;";
        updates += "ALTER TABLE videometadatacast ADD UNIQUE INDEX (`idvideo`,`idcast`);";
        updates += "ALTER TABLE videometadatagenre ADD UNIQUE INDEX (`idvideo`,`idgenre`);";
        updates +="ALTER TABLE videometadatacountry ADD UNIQUE INDEX (`idvideo`,`idcountry`);";
        if (!performActualUpdate(updates, "1033", dbver,
                                 MythVideoVersionName))
            return false;

        dbver = "1033";
    }

    if (dbver == "1033")
    {
        AddFileType("ogv");
        AddFileType("BDMV");
        AddFileType("nut");
        AddFileType("mxf");
        AddFileType("m4v");
        AddFileType("rm");
        AddFileType("ts");
        AddFileType("swf");
        AddFileType("f4v");
        AddFileType("nuv");

        if (!UpdateDBVersionNumber(MythVideoVersionName, "1034"))
            return false;

        dbver = "1034";
    }

    if (dbver == "1034")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD `tagline` VARCHAR (255) "
                   "AFTER `subtitle`;";

        if (!performActualUpdate(updates, "1035", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1035")
    {
        QStringList updates;
        updates += "ALTER TABLE videometadata ADD processed BOOL "
                   "NOT NULL DEFAULT 0 AFTER watched;";
        if (!performActualUpdate(updates, "1036", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1036")
    {
        QStringList updates;
        updates += "ALTER TABLE  videometadata ADD  `studio` VARCHAR( 128 ) "
                   "AFTER `director`;";
        if (!performActualUpdate(updates, "1037", dbver,
                                 MythVideoVersionName))
            return false;
    }

    if (dbver == "1037")
    {
        QStringList updates;
        updates += "DELETE FROM videotypes WHERE extension = 'VIDEO_TS';";
        updates += "DELETE FROM videotypes WHERE extension = 'BDMV';";
        if (!performActualUpdate(updates, "1038", dbver,
                                 MythVideoVersionName))
            return false;
    }

    return true;
}