MythTV  0.26-pre
videodbcheck.cpp
Go to the documentation of this file.
00001 /* Integrates the MythVideo DB schema into the core MythTV DB schema.  Used
00002  * only by DB update 1267.  Any further changes to the core MythTV schema,
00003  * including changes to those parts that were previously MythVideo, should
00004  * be done in mythtv/libs/libmythtv/dbcheck.cpp. */
00005 
00006 #include <QString>
00007 #include <QStringList>
00008 
00009 #include "videodbcheck.h"
00010 #include "mythdb.h"
00011 #include "mythcorecontext.h"
00012 #include "mythlogging.h"
00013 #include "remotefile.h"
00014 #include "mythmiscutil.h"
00015 #include "libmythmetadata/videoutils.h"
00016 
00017 const QString minimumVideoDatabaseVersion = "1016";
00018 const QString finalVideoDatabaseVersion = "1038";
00019 const QString MythVideoVersionName = "mythvideo.DBSchemaVer";
00020 
00021 static bool UpdateDBVersionNumber(const QString &field_name,
00022                                   const QString &newnumber)
00023 {
00024     MSqlQuery query(MSqlQuery::InitCon());
00025 
00026     if (!query.exec(QString("DELETE FROM settings WHERE value='%1';")
00027                     .arg(field_name)))
00028     {
00029         MythDB::DBError("UpdateDBVersionNumber - delete", query);
00030         return false;
00031     }
00032 
00033     if (!query.exec(QString("INSERT INTO settings (value, data, hostname) "
00034                             "VALUES ('%1', %2, NULL);")
00035                     .arg(field_name).arg(newnumber)))
00036     {
00037         MythDB::DBError("UpdateDBVersionNumber - insert", query);
00038         return false;
00039     }
00040 
00041     LOG(VB_GENERAL, LOG_NOTICE,
00042         QString("Upgraded to MythVideo schema version %1") .arg(newnumber));
00043     return true;
00044 }
00045 
00046 static bool performActualUpdate(const QStringList &updates,
00047                                 const QString &version,
00048                                 QString &dbver, const QString &field_name)
00049 {
00050     MSqlQuery query(MSqlQuery::InitCon());
00051 
00052     LOG(VB_GENERAL, LOG_NOTICE,
00053         QString("Upgrading to MythVideo schema version %1") .arg(version));
00054 
00055     for (QStringList::const_iterator p = updates.begin();
00056          p != updates.end(); ++p)
00057     {
00058         if (!query.exec(*p))
00059         {
00060             MythDB::DBError("performActualUpdate", query);
00061             return false;
00062         }
00063     }
00064 
00065     if (!UpdateDBVersionNumber(field_name, version))
00066         return false;
00067     dbver = version;
00068     return true;
00069 }
00070 
00071 static bool performActualUpdate(const QString updates[], const QString &version,
00072                                 QString &dbver, const QString &field_name)
00073 {
00074     QStringList upQuery;
00075     for (int i = 0; ; ++i)
00076     {
00077         QString q = updates[i];
00078         if (q == "") break;
00079         upQuery.append(q);
00080     }
00081     return performActualUpdate(upQuery, version, dbver, field_name);
00082 }
00083 
00084 static void AddFileType(const QString &extension,
00085                         const QString &playCommand = QString("Internal"),
00086                         bool ignored = false, bool useDefault = false)
00087 {
00088     MSqlQuery query(MSqlQuery::InitCon());
00089     query.prepare("SELECT * FROM videotypes WHERE "
00090                   "LOWER(extension) = LOWER(:EXTENSION) LIMIT 1");
00091     query.bindValue(":EXTENSION", extension);
00092     if (query.exec() && !query.size())
00093     {
00094         query.prepare("INSERT INTO videotypes (extension, playcommand, "
00095                 "f_ignore, use_default) VALUES (:EXTENSION, :PLAYCOMMAND, "
00096                 ":IGNORE, :USEDEFAULT)");
00097         query.bindValue(":EXTENSION", extension);
00098         query.bindValue(":PLAYCOMMAND", playCommand);
00099         query.bindValue(":IGNORE", ignored);
00100         query.bindValue(":USEDEFAULT", useDefault);
00101         if (!query.exec())
00102             MythDB::DBError(QObject::tr("Error: failed to add new file "
00103                                         "type '%1'").arg(extension), query);
00104     }
00105 }
00106 
00107 static void UpdateHashes(void)
00108 {
00109     MSqlQuery query(MSqlQuery::InitCon());
00110     query.prepare("SELECT `filename`, `host` FROM videometadata WHERE "
00111                   "`hash` = \"\"");
00112     if (query.exec() && query.size())
00113     {
00114         while (query.next())
00115         {
00116             QString filename = query.value(0).toString();
00117             QString host = query.value(1).toString();
00118             QString hash;
00119 
00120             if (!host.isEmpty())
00121             {
00122                 QString url = generate_file_url("Videos", host, filename);
00123                 hash =  RemoteFile::GetFileHash(url);
00124             }
00125             else
00126                 hash = FileHash(filename);
00127 
00128             if (hash == "NULL")
00129                 hash = QString();
00130 
00131             MSqlQuery updatequery(MSqlQuery::InitCon());
00132 
00133             updatequery.prepare("UPDATE videometadata set `hash` = :HASH "
00134                           "WHERE `filename` = :FILENAME AND "
00135                           "`host` = :HOST");
00136             updatequery.bindValue(":HASH", hash);
00137             updatequery.bindValue(":FILENAME", filename);
00138             updatequery.bindValue(":HOST", host);
00139             if (!updatequery.exec())
00140                 MythDB::DBError(QObject::tr("Error: failed to hash file "
00141                                             "'%1'").arg(filename), updatequery);
00142             else
00143                 LOG(VB_GENERAL, LOG_INFO,
00144                     QString("Hash (%1) generated for file (%2)")
00145                         .arg(hash).arg(filename));
00146         }
00147     }
00148 }
00149 
00150 static bool InitializeVideoSchema(void)
00151 {
00152     MSqlQuery query(MSqlQuery::InitCon());
00153     LOG(VB_GENERAL, LOG_NOTICE,
00154         "Inserting initial video database information.");
00155 
00156     const QString updates[] = {
00157 "CREATE TABLE dvdinput ("
00158 "  intid int(10) unsigned NOT NULL,"
00159 "  hsize int(10) unsigned DEFAULT NULL,"
00160 "  vsize int(10) unsigned DEFAULT NULL,"
00161 "  ar_num int(10) unsigned DEFAULT NULL,"
00162 "  ar_denom int(10) unsigned DEFAULT NULL,"
00163 "  fr_code int(10) unsigned DEFAULT NULL,"
00164 "  letterbox tinyint(1) DEFAULT NULL,"
00165 "  v_format varchar(16) DEFAULT NULL,"
00166 "  PRIMARY KEY (intid)"
00167 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00168 "CREATE TABLE dvdtranscode ("
00169 "  intid int(11) NOT NULL AUTO_INCREMENT,"
00170 "  input int(10) unsigned DEFAULT NULL,"
00171 "  `name` varchar(128) NOT NULL,"
00172 "  sync_mode int(10) unsigned DEFAULT NULL,"
00173 "  use_yv12 tinyint(1) DEFAULT NULL,"
00174 "  cliptop int(11) DEFAULT NULL,"
00175 "  clipbottom int(11) DEFAULT NULL,"
00176 "  clipleft int(11) DEFAULT NULL,"
00177 "  clipright int(11) DEFAULT NULL,"
00178 "  f_resize_h int(11) DEFAULT NULL,"
00179 "  f_resize_w int(11) DEFAULT NULL,"
00180 "  hq_resize_h int(11) DEFAULT NULL,"
00181 "  hq_resize_w int(11) DEFAULT NULL,"
00182 "  grow_h int(11) DEFAULT NULL,"
00183 "  grow_w int(11) DEFAULT NULL,"
00184 "  clip2top int(11) DEFAULT NULL,"
00185 "  clip2bottom int(11) DEFAULT NULL,"
00186 "  clip2left int(11) DEFAULT NULL,"
00187 "  clip2right int(11) DEFAULT NULL,"
00188 "  codec varchar(128) NOT NULL,"
00189 "  codec_param varchar(128) DEFAULT NULL,"
00190 "  bitrate int(11) DEFAULT NULL,"
00191 "  a_sample_r int(11) DEFAULT NULL,"
00192 "  a_bitrate int(11) DEFAULT NULL,"
00193 "  two_pass tinyint(1) DEFAULT NULL,"
00194 "  tc_param varchar(128) DEFAULT NULL,"
00195 "  PRIMARY KEY (intid)"
00196 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00197 "CREATE TABLE filemarkup ("
00198 "  filename text NOT NULL,"
00199 "  mark mediumint(8) unsigned NOT NULL DEFAULT '0',"
00200 "  `offset` bigint(20) unsigned DEFAULT NULL,"
00201 "  `type` tinyint(4) NOT NULL DEFAULT '0',"
00202 "  KEY filename (filename(255))"
00203 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00204 "CREATE TABLE videocast ("
00205 "  intid int(10) unsigned NOT NULL AUTO_INCREMENT,"
00206 "  cast varchar(128) NOT NULL,"
00207 "  PRIMARY KEY (intid)"
00208 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00209 "CREATE TABLE videocategory ("
00210 "  intid int(10) unsigned NOT NULL AUTO_INCREMENT,"
00211 "  category varchar(128) NOT NULL,"
00212 "  PRIMARY KEY (intid)"
00213 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00214 "CREATE TABLE videocountry ("
00215 "  intid int(10) unsigned NOT NULL AUTO_INCREMENT,"
00216 "  country varchar(128) NOT NULL,"
00217 "  PRIMARY KEY (intid)"
00218 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00219 "CREATE TABLE videogenre ("
00220 "  intid int(10) unsigned NOT NULL AUTO_INCREMENT,"
00221 "  genre varchar(128) NOT NULL,"
00222 "  PRIMARY KEY (intid)"
00223 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00224 "CREATE TABLE videometadata ("
00225 "  intid int(10) unsigned NOT NULL AUTO_INCREMENT,"
00226 "  title varchar(128) NOT NULL,"
00227 "  subtitle text NOT NULL,"
00228 "  tagline varchar(255) DEFAULT NULL,"
00229 "  director varchar(128) NOT NULL,"
00230 "  studio varchar(128) DEFAULT NULL,"
00231 "  plot text,"
00232 "  rating varchar(128) NOT NULL,"
00233 "  inetref varchar(255) NOT NULL,"
00234 "  homepage text NOT NULL,"
00235 "  `year` int(10) unsigned NOT NULL,"
00236 "  releasedate date NOT NULL,"
00237 "  userrating float NOT NULL,"
00238 "  length int(10) unsigned NOT NULL,"
00239 "  season smallint(5) unsigned NOT NULL DEFAULT '0',"
00240 "  episode smallint(5) unsigned NOT NULL DEFAULT '0',"
00241 "  showlevel int(10) unsigned NOT NULL,"
00242 "  filename text NOT NULL,"
00243 "  `hash` varchar(128) NOT NULL,"
00244 "  coverfile text NOT NULL,"
00245 "  childid int(11) NOT NULL DEFAULT '-1',"
00246 "  browse tinyint(1) NOT NULL DEFAULT '1',"
00247 "  watched tinyint(1) NOT NULL DEFAULT '0',"
00248 "  processed tinyint(1) NOT NULL DEFAULT '0',"
00249 "  playcommand varchar(255) DEFAULT NULL,"
00250 "  category int(10) unsigned NOT NULL DEFAULT '0',"
00251 "  trailer text,"
00252 "  `host` text NOT NULL,"
00253 "  screenshot text,"
00254 "  banner text,"
00255 "  fanart text,"
00256 "  insertdate timestamp NULL DEFAULT CURRENT_TIMESTAMP,"
00257 "  PRIMARY KEY (intid),"
00258 "  KEY director (director),"
00259 "  KEY title (title)"
00260 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00261 "CREATE TABLE videometadatacast ("
00262 "  idvideo int(10) unsigned NOT NULL,"
00263 "  idcast int(10) unsigned NOT NULL,"
00264 "  UNIQUE KEY idvideo (idvideo,idcast)"
00265 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00266 "CREATE TABLE videometadatacountry ("
00267 "  idvideo int(10) unsigned NOT NULL,"
00268 "  idcountry int(10) unsigned NOT NULL,"
00269 "  UNIQUE KEY idvideo_2 (idvideo,idcountry),"
00270 "  KEY idvideo (idvideo),"
00271 "  KEY idcountry (idcountry)"
00272 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00273 "CREATE TABLE videometadatagenre ("
00274 "  idvideo int(10) unsigned NOT NULL,"
00275 "  idgenre int(10) unsigned NOT NULL,"
00276 "  UNIQUE KEY idvideo_2 (idvideo,idgenre),"
00277 "  KEY idvideo (idvideo),"
00278 "  KEY idgenre (idgenre)"
00279 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00280 "CREATE TABLE videotypes ("
00281 "  intid int(10) unsigned NOT NULL AUTO_INCREMENT,"
00282 "  extension varchar(128) NOT NULL,"
00283 "  playcommand varchar(255) NOT NULL,"
00284 "  f_ignore tinyint(1) DEFAULT NULL,"
00285 "  use_default tinyint(1) DEFAULT NULL,"
00286 "  PRIMARY KEY (intid)"
00287 ") ENGINE=MyISAM DEFAULT CHARSET=utf8;",
00288 "INSERT INTO dvdinput VALUES (1,720,480,16,9,1,1,'ntsc');",
00289 "INSERT INTO dvdinput VALUES (2,720,480,16,9,1,0,'ntsc');",
00290 "INSERT INTO dvdinput VALUES (3,720,480,4,3,1,1,'ntsc');",
00291 "INSERT INTO dvdinput VALUES (4,720,480,4,3,1,0,'ntsc');",
00292 "INSERT INTO dvdinput VALUES (5,720,576,16,9,3,1,'pal');",
00293 "INSERT INTO dvdinput VALUES (6,720,576,16,9,3,0,'pal');",
00294 "INSERT INTO dvdinput VALUES (7,720,576,4,3,3,1,'pal');",
00295 "INSERT INTO dvdinput VALUES (8,720,576,4,3,3,0,'pal');",
00296 "INSERT INTO dvdtranscode VALUES (1,1,'Good',2,1,16,16,0,0,2,0,0,0,0,0,32,32,8,8,'divx5',NULL,1618,NULL,NULL,0,NULL);",
00297 "INSERT INTO dvdtranscode VALUES (2,2,'Excellent',2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'divx5',NULL,0,NULL,NULL,1,NULL);",
00298 "INSERT INTO dvdtranscode VALUES (3,2,'Good',2,1,0,0,8,8,0,0,0,0,0,0,0,0,0,0,'divx5',NULL,1618,NULL,NULL,0,NULL);",
00299 "INSERT INTO dvdtranscode VALUES (4,2,'Medium',2,1,0,0,8,8,5,5,0,0,0,0,0,0,0,0,'divx5',NULL,1200,NULL,NULL,0,NULL);",
00300 "INSERT INTO dvdtranscode VALUES (5,3,'Good',2,1,0,0,0,0,0,0,0,0,2,0,80,80,8,8,'divx5',NULL,0,NULL,NULL,0,NULL);",
00301 "INSERT INTO dvdtranscode VALUES (6,4,'Excellent',2,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,'divx5',NULL,0,NULL,NULL,1,NULL);",
00302 "INSERT INTO dvdtranscode VALUES (7,4,'Good',2,1,0,0,8,8,0,2,0,0,0,0,0,0,0,0,'divx5',NULL,1618,NULL,NULL,0,NULL);",
00303 "INSERT INTO dvdtranscode VALUES (8,5,'Good',1,1,16,16,0,0,5,0,0,0,0,0,40,40,8,8,'divx5',NULL,1618,NULL,NULL,0,NULL);",
00304 "INSERT INTO dvdtranscode VALUES (9,6,'Good',1,1,0,0,16,16,5,0,0,0,0,0,0,0,0,0,'divx5',NULL,1618,NULL,NULL,0,NULL);",
00305 "INSERT INTO dvdtranscode VALUES (10,7,'Good',1,1,0,0,0,0,1,0,0,0,0,0,76,76,8,8,'divx5',NULL,1618,NULL,NULL,0,NULL);",
00306 "INSERT INTO dvdtranscode VALUES (11,8,'Good',1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,'divx5',NULL,1618,NULL,NULL,0,NULL);",
00307 "INSERT INTO videotypes VALUES (1,'txt','',1,0);",
00308 "INSERT INTO videotypes VALUES (2,'log','',1,0);",
00309 "INSERT INTO videotypes VALUES (3,'mpg','Internal',0,0);",
00310 "INSERT INTO videotypes VALUES (4,'avi','',0,1);",
00311 "INSERT INTO videotypes VALUES (5,'vob','Internal',0,0);",
00312 "INSERT INTO videotypes VALUES (6,'mpeg','Internal',0,0);",
00313 "INSERT INTO videotypes VALUES (8,'iso','Internal',0,0);",
00314 "INSERT INTO videotypes VALUES (9,'img','Internal',0,0);",
00315 "INSERT INTO videotypes VALUES (10,'mkv','Internal',0,0);",
00316 "INSERT INTO videotypes VALUES (11,'mp4','Internal',0,0);",
00317 "INSERT INTO videotypes VALUES (12,'m2ts','Internal',0,0);",
00318 "INSERT INTO videotypes VALUES (13,'evo','Internal',0,0);",
00319 "INSERT INTO videotypes VALUES (14,'divx','Internal',0,0);",
00320 "INSERT INTO videotypes VALUES (15,'mov','Internal',0,0);",
00321 "INSERT INTO videotypes VALUES (16,'qt','Internal',0,0);",
00322 "INSERT INTO videotypes VALUES (17,'wmv','Internal',0,0);",
00323 "INSERT INTO videotypes VALUES (18,'3gp','Internal',0,0);",
00324 "INSERT INTO videotypes VALUES (19,'asf','Internal',0,0);",
00325 "INSERT INTO videotypes VALUES (20,'ogg','Internal',0,0);",
00326 "INSERT INTO videotypes VALUES (21,'ogm','Internal',0,0);",
00327 "INSERT INTO videotypes VALUES (22,'flv','Internal',0,0);",
00328 "INSERT INTO videotypes VALUES (23,'ogv','Internal',0,0);",
00329 "INSERT INTO videotypes VALUES (25,'nut','Internal',0,0);",
00330 "INSERT INTO videotypes VALUES (26,'mxf','Internal',0,0);",
00331 "INSERT INTO videotypes VALUES (27,'m4v','Internal',0,0);",
00332 "INSERT INTO videotypes VALUES (28,'rm','Internal',0,0);",
00333 "INSERT INTO videotypes VALUES (29,'ts','Internal',0,0);",
00334 "INSERT INTO videotypes VALUES (30,'swf','Internal',0,0);",
00335 "INSERT INTO videotypes VALUES (31,'f4v','Internal',0,0);",
00336 "INSERT INTO videotypes VALUES (32,'nuv','Internal',0,0);",
00337 NULL
00338 };
00339 
00340     QString dbver = "";
00341     if (!performActualUpdate(updates, finalVideoDatabaseVersion, dbver,
00342                              MythVideoVersionName))
00343         return false;
00344 
00345     return true;
00346 }
00347 
00348 bool doUpgradeVideoDatabaseSchema(void)
00349 {
00350     QString dbver = gCoreContext->GetSetting("mythvideo.DBSchemaVer");
00351     if (dbver == finalVideoDatabaseVersion)
00352     {
00353         return true;
00354     }
00355 
00356     QString olddbver = gCoreContext->GetSetting("VideoDBSchemaVer");
00357     QString dvddbver = gCoreContext->GetSetting("DVDDBSchemaVer");
00358     if (dbver.isEmpty() && olddbver.isEmpty() && dvddbver.isEmpty())
00359     {
00360         if (!InitializeVideoSchema())
00361             return false;
00362         dbver = gCoreContext->GetSetting("mythvideo.DBSchemaVer");
00363     }
00364 
00365     if (dbver.isEmpty() || dbver.toInt() <  minimumVideoDatabaseVersion.toInt())
00366     {
00367         LOG(VB_GENERAL, LOG_ERR,
00368             "Unrecognized video database schema version. "
00369             "Unable to upgrade database.");
00370         LOG(VB_GENERAL, LOG_ERR, QString("mythvideo.DBSchemaVer: '%1', "
00371             "VideoDBSchemaVer: '%2', DVDDBSchemaVer: '%3'").arg(dbver)
00372                 .arg(olddbver).arg(dvddbver));
00373         return false;
00374     }
00375 
00376     if (dbver == "1016")
00377     {
00378         const QString updates[] = {
00379 "ALTER TABLE dvdbookmark"
00380 "  MODIFY serialid varbinary(16) NOT NULL default '',"
00381 "  MODIFY name varbinary(32) default NULL;",
00382 "ALTER TABLE dvdinput"
00383 "  MODIFY v_format varbinary(16) default NULL;",
00384 "ALTER TABLE dvdtranscode"
00385 "  MODIFY name varbinary(128) NOT NULL,"
00386 "  MODIFY codec varbinary(128) NOT NULL,"
00387 "  MODIFY codec_param varbinary(128) default NULL,"
00388 "  MODIFY tc_param varbinary(128) default NULL;",
00389 "ALTER TABLE filemarkup"
00390 "  MODIFY filename blob NOT NULL;",
00391 "ALTER TABLE videocast"
00392 "  MODIFY cast varbinary(128) NOT NULL;",
00393 "ALTER TABLE videocategory"
00394 "  MODIFY category varbinary(128) NOT NULL;",
00395 "ALTER TABLE videocountry"
00396 "  MODIFY country varbinary(128) NOT NULL;",
00397 "ALTER TABLE videogenre"
00398 "  MODIFY genre varbinary(128) NOT NULL;",
00399 "ALTER TABLE videometadata"
00400 "  MODIFY title varbinary(128) NOT NULL,"
00401 "  MODIFY director varbinary(128) NOT NULL,"
00402 "  MODIFY plot blob,"
00403 "  MODIFY rating varbinary(128) NOT NULL,"
00404 "  MODIFY inetref varbinary(255) NOT NULL,"
00405 "  MODIFY filename blob NOT NULL,"
00406 "  MODIFY coverfile blob NOT NULL,"
00407 "  MODIFY playcommand varbinary(255) default NULL;",
00408 "ALTER TABLE videotypes"
00409 "  MODIFY extension varbinary(128) NOT NULL,"
00410 "  MODIFY playcommand varbinary(255) NOT NULL;",
00411 ""
00412 };
00413 
00414         if (!performActualUpdate(updates, "1017", dbver,
00415                                  MythVideoVersionName))
00416             return false;
00417     }
00418 
00419 
00420     if (dbver == "1017")
00421     {
00422         const QString updates[] = {
00423 "ALTER TABLE dvdbookmark"
00424 "  DEFAULT CHARACTER SET default,"
00425 "  MODIFY serialid varchar(16) CHARACTER SET utf8 NOT NULL default '',"
00426 "  MODIFY name varchar(32) CHARACTER SET utf8 default NULL;",
00427 "ALTER TABLE dvdinput"
00428 "  DEFAULT CHARACTER SET default,"
00429 "  MODIFY v_format varchar(16) CHARACTER SET utf8 default NULL;",
00430 "ALTER TABLE dvdtranscode"
00431 "  DEFAULT CHARACTER SET default,"
00432 "  MODIFY name varchar(128) CHARACTER SET utf8 NOT NULL,"
00433 "  MODIFY codec varchar(128) CHARACTER SET utf8 NOT NULL,"
00434 "  MODIFY codec_param varchar(128) CHARACTER SET utf8 default NULL,"
00435 "  MODIFY tc_param varchar(128) CHARACTER SET utf8 default NULL;",
00436 "ALTER TABLE filemarkup"
00437 "  DEFAULT CHARACTER SET default,"
00438 "  MODIFY filename text CHARACTER SET utf8 NOT NULL;",
00439 "ALTER TABLE videocast"
00440 "  DEFAULT CHARACTER SET default,"
00441 "  MODIFY cast varchar(128) CHARACTER SET utf8 NOT NULL;",
00442 "ALTER TABLE videocategory"
00443 "  DEFAULT CHARACTER SET default,"
00444 "  MODIFY category varchar(128) CHARACTER SET utf8 NOT NULL;",
00445 "ALTER TABLE videocountry"
00446 "  DEFAULT CHARACTER SET default,"
00447 "  MODIFY country varchar(128) CHARACTER SET utf8 NOT NULL;",
00448 "ALTER TABLE videogenre"
00449 "  DEFAULT CHARACTER SET default,"
00450 "  MODIFY genre varchar(128) CHARACTER SET utf8 NOT NULL;",
00451 "ALTER TABLE videometadata"
00452 "  DEFAULT CHARACTER SET default,"
00453 "  MODIFY title varchar(128) CHARACTER SET utf8 NOT NULL,"
00454 "  MODIFY director varchar(128) CHARACTER SET utf8 NOT NULL,"
00455 "  MODIFY plot text CHARACTER SET utf8,"
00456 "  MODIFY rating varchar(128) CHARACTER SET utf8 NOT NULL,"
00457 "  MODIFY inetref varchar(255) CHARACTER SET utf8 NOT NULL,"
00458 "  MODIFY filename text CHARACTER SET utf8 NOT NULL,"
00459 "  MODIFY coverfile text CHARACTER SET utf8 NOT NULL,"
00460 "  MODIFY playcommand varchar(255) CHARACTER SET utf8 default NULL;",
00461 "ALTER TABLE videometadatacast"
00462 "  DEFAULT CHARACTER SET default;",
00463 "ALTER TABLE videometadatacountry"
00464 "  DEFAULT CHARACTER SET default;",
00465 "ALTER TABLE videometadatagenre"
00466 "  DEFAULT CHARACTER SET default;",
00467 "ALTER TABLE videotypes"
00468 "  DEFAULT CHARACTER SET default,"
00469 "  MODIFY extension varchar(128) CHARACTER SET utf8 NOT NULL,"
00470 "  MODIFY playcommand varchar(255) CHARACTER SET utf8 NOT NULL;",
00471 ""
00472 };
00473 
00474         if (!performActualUpdate(updates, "1018", dbver,
00475                                  MythVideoVersionName))
00476             return false;
00477     }
00478 
00479     if (dbver == "1018")
00480     {
00481         QStringList updates;
00482         updates += "DELETE FROM settings WHERE value="
00483                    "'MovieListCommandLine' AND data LIKE '%imdb%';";
00484         updates += "DELETE FROM settings WHERE value="
00485                    "'MovieDataCommandLine' AND data LIKE '%imdb%';";
00486         updates += "DELETE FROM settings WHERE value="
00487                    "'MoviePosterCommandLine' AND data LIKE '%imdb%';";
00488         if (!performActualUpdate(updates, "1019", dbver,
00489                                  MythVideoVersionName))
00490             return false;
00491     }
00492 
00493     if (dbver == "1019")
00494     {
00495         QStringList updates(
00496                 "ALTER TABLE videometadata ADD `trailer` TEXT;");
00497         if (!performActualUpdate(updates, "1020", dbver,
00498                                  MythVideoVersionName))
00499             return false;
00500     }
00501 
00502     if (dbver == "1020")
00503     {
00504         LOG(VB_GENERAL, LOG_NOTICE,
00505             "Upgrading to MythVideo schema version 1021");
00506 
00507         AddFileType("mkv");
00508         AddFileType("mp4");
00509         AddFileType("m2ts");
00510         AddFileType("evo");
00511         AddFileType("divx");
00512         AddFileType("mov");
00513         AddFileType("qt");
00514         AddFileType("wmv");
00515         AddFileType("3gp");
00516         AddFileType("asf");
00517         AddFileType("ogg");
00518         AddFileType("ogm");
00519         AddFileType("flv");
00520 
00521         if (!UpdateDBVersionNumber(MythVideoVersionName, "1021"))
00522             return false;
00523 
00524         dbver = "1021";
00525     }
00526 
00527     if (dbver == "1021")
00528     {
00529          QStringList updates;
00530          updates += "ALTER TABLE videometadata ADD host text CHARACTER SET utf8 NOT NULL;";
00531 
00532          if (!performActualUpdate(updates, "1022", dbver,
00533                                   MythVideoVersionName))
00534             return false;
00535      }
00536 
00537     if (dbver == "1022")
00538     {
00539         QStringList updates;
00540         updates += "ALTER TABLE videometadata ADD `screenshot` TEXT;";
00541         updates += "ALTER TABLE videometadata ADD `banner` TEXT;";
00542         updates += "ALTER TABLE videometadata ADD `fanart` TEXT;";
00543         if (!performActualUpdate(updates, "1023", dbver,
00544                                  MythVideoVersionName))
00545             return false;
00546     }
00547 
00548     if (dbver == "1023")
00549     {
00550         QStringList updates;
00551         updates += "ALTER TABLE videometadata ADD `subtitle` TEXT "
00552                    "NOT NULL AFTER `title`;";
00553         updates += "ALTER TABLE videometadata ADD `season` SMALLINT "
00554                    "UNSIGNED NOT NULL DEFAULT '0' AFTER `length`;";
00555         updates += "ALTER TABLE videometadata ADD `episode` SMALLINT "
00556                    "UNSIGNED NOT NULL DEFAULT '0' AFTER `season`;";
00557         if (!performActualUpdate(updates, "1024", dbver,
00558                                  MythVideoVersionName))
00559             return false;
00560     }
00561 
00562     if (dbver == "1024")
00563     {
00564         QStringList updates;
00565         updates += "ALTER TABLE videometadata ADD watched BOOL "
00566                    "NOT NULL DEFAULT 0 AFTER browse;";
00567         if (!performActualUpdate(updates, "1025", dbver,
00568                                  MythVideoVersionName))
00569             return false;
00570     }
00571 
00572     if (dbver == "1025")
00573     {
00574         QStringList updates;
00575         updates += "ALTER TABLE videometadata ADD `insertdate` TIMESTAMP "
00576                    "NULL DEFAULT CURRENT_TIMESTAMP AFTER `fanart`;";
00577         if (!performActualUpdate(updates, "1026", dbver,
00578                                  MythVideoVersionName))
00579             return false;
00580     }
00581 
00582     if (dbver == "1026")
00583     {
00584         QStringList updates;
00585         updates += "DELETE FROM keybindings "
00586                    " WHERE action = 'DELETE' AND context = 'Video';";
00587         if (!performActualUpdate(updates, "1027", dbver,
00588                                  MythVideoVersionName))
00589             return false;
00590     }
00591 
00592     if (dbver == "1027")
00593     {
00594         LOG(VB_GENERAL, LOG_NOTICE,
00595             "Upgrading to MythVideo schema version 1028");
00596         LOG(VB_GENERAL, LOG_INFO,
00597             "Converting filenames in filemarkup table "
00598             "from absolute to relative paths.  This may take a long "
00599             "time if you have a large number of MythVideo seektables.");
00600 
00601         bool ok = true;
00602         MSqlQuery query(MSqlQuery::InitCon());
00603         MSqlQuery update(MSqlQuery::InitCon());
00604 
00605         query.prepare("SELECT DISTINCT filename FROM filemarkup;");
00606         update.prepare("UPDATE filemarkup SET filename = :RELPATH "
00607                        "    WHERE filename = :FULLPATH;");
00608         if (query.exec())
00609         {
00610             QString origPath;
00611             QString relPath;
00612             while (query.next())
00613             {
00614                 origPath = query.value(0).toString();
00615                 if (origPath.startsWith("dvd:"))
00616                     continue;
00617 
00618                 relPath = StorageGroup::GetRelativePathname(origPath);
00619                 if ((!relPath.isEmpty()) &&
00620                     (relPath != origPath))
00621                 {
00622                     update.bindValue(":RELPATH", relPath);
00623                     update.bindValue(":FULLPATH", origPath);
00624                     if (!update.exec())
00625                     {
00626                         LOG(VB_GENERAL, LOG_ERR,
00627                             QString("ERROR converting '%1' to '%2' in "
00628                                     "filemarkup table.")
00629                                 .arg(origPath).arg(relPath));
00630                         ok = false;
00631                     }
00632                 }
00633             }
00634         }
00635         else
00636             ok = false;
00637 
00638         if (!ok)
00639             return false;
00640 
00641         if (!UpdateDBVersionNumber(MythVideoVersionName, "1028"))
00642             return false;
00643 
00644         dbver = "1028";
00645     }
00646 
00647     if (dbver == "1028")
00648     {
00649         QStringList updates;
00650         updates += "ALTER TABLE videometadata ADD `releasedate` DATE "
00651                    "NOT NULL AFTER `year`;";
00652         updates += "ALTER TABLE videometadata ADD `homepage` TEXT "
00653                    "NOT NULL AFTER `inetref`;";
00654         if (!performActualUpdate(updates, "1029", dbver,
00655                                  MythVideoVersionName))
00656             return false;
00657     }
00658 
00659     if (dbver == "1029")
00660     {
00661         QStringList updates;
00662         updates += "ALTER TABLE videometadata ADD `hash` VARCHAR(128) "
00663                    "NOT NULL AFTER `filename`;";
00664         if (!performActualUpdate(updates, "1030", dbver,
00665                                  MythVideoVersionName))
00666             return false;
00667     }
00668 
00669     if (dbver == "1030")
00670     {
00671         UpdateHashes();
00672         if (!UpdateDBVersionNumber(MythVideoVersionName, "1031"))
00673             return false;
00674 
00675         dbver = "1031";
00676     }
00677 
00678     if (dbver == "1031")
00679     {
00680         MSqlQuery query(MSqlQuery::InitCon());
00681         query.prepare("SHOW INDEX FROM videometadata");
00682 
00683         if (!query.exec())
00684         {
00685             MythDB::DBError("Unable to retrieve current indices on "
00686                             "videometadata.", query);
00687         }
00688         else
00689         {
00690             while (query.next())
00691             {
00692                 QString index_name = query.value(2).toString();
00693 
00694                 if ("title_2" == index_name)
00695                 {
00696                     MSqlQuery update(MSqlQuery::InitCon());
00697                     update.prepare("ALTER TABLE videometadata "
00698                                    " DROP INDEX title_2");
00699 
00700                     if (!update.exec())
00701                          MythDB::DBError("Unable to drop duplicate index "
00702                                          "on videometadata. Ignoring.",
00703                                          update);
00704                     break;
00705                 }
00706             }
00707         }
00708 
00709         if (!UpdateDBVersionNumber(MythVideoVersionName, "1032"))
00710             return false;
00711 
00712         dbver = "1032";
00713     }
00714 
00715     if (dbver == "1032")
00716     {
00717         QStringList updates;
00718         updates += "CREATE TEMPORARY TABLE bad_videometadatacast"
00719                     "       AS SELECT * FROM videometadatacast;";
00720         updates += "CREATE TEMPORARY TABLE bad_videometadatagenre"
00721                    "       AS SELECT * FROM videometadatagenre;";
00722         updates += "CREATE TEMPORARY TABLE bad_videometadatacountry"
00723                    "       AS SELECT * FROM videometadatacountry;";
00724         updates += "TRUNCATE TABLE videometadatacast;";
00725         updates += "TRUNCATE TABLE videometadatagenre;";
00726         updates += "TRUNCATE TABLE videometadatacountry;";
00727         updates += "INSERT videometadatacast SELECT idvideo,idcast"
00728                    "       FROM bad_videometadatacast GROUP BY idvideo,idcast;";
00729         updates += "INSERT videometadatagenre SELECT idvideo,idgenre"
00730                    "       FROM bad_videometadatagenre GROUP BY idvideo,idgenre;";
00731         updates += "INSERT videometadatacountry SELECT idvideo,idcountry"
00732                    "       FROM bad_videometadatacountry GROUP BY idvideo,idcountry;";
00733         updates += "DROP TEMPORARY TABLE bad_videometadatacast;";
00734         updates += "DROP TEMPORARY TABLE bad_videometadatagenre;";
00735         updates += "DROP TEMPORARY TABLE bad_videometadatacountry;";
00736         updates += "ALTER TABLE videometadatacast ADD UNIQUE INDEX (`idvideo`,`idcast`);";
00737         updates += "ALTER TABLE videometadatagenre ADD UNIQUE INDEX (`idvideo`,`idgenre`);";
00738         updates +="ALTER TABLE videometadatacountry ADD UNIQUE INDEX (`idvideo`,`idcountry`);";
00739         if (!performActualUpdate(updates, "1033", dbver,
00740                                  MythVideoVersionName))
00741             return false;
00742 
00743         dbver = "1033";
00744     }
00745 
00746     if (dbver == "1033")
00747     {
00748         AddFileType("ogv");
00749         AddFileType("BDMV");
00750         AddFileType("nut");
00751         AddFileType("mxf");
00752         AddFileType("m4v");
00753         AddFileType("rm");
00754         AddFileType("ts");
00755         AddFileType("swf");
00756         AddFileType("f4v");
00757         AddFileType("nuv");
00758 
00759         if (!UpdateDBVersionNumber(MythVideoVersionName, "1034"))
00760             return false;
00761 
00762         dbver = "1034";
00763     }
00764 
00765     if (dbver == "1034")
00766     {
00767         QStringList updates;
00768         updates += "ALTER TABLE videometadata ADD `tagline` VARCHAR (255) "
00769                    "AFTER `subtitle`;";
00770 
00771         if (!performActualUpdate(updates, "1035", dbver,
00772                                  MythVideoVersionName))
00773             return false;
00774     }
00775 
00776     if (dbver == "1035")
00777     {
00778         QStringList updates;
00779         updates += "ALTER TABLE videometadata ADD processed BOOL "
00780                    "NOT NULL DEFAULT 0 AFTER watched;";
00781         if (!performActualUpdate(updates, "1036", dbver,
00782                                  MythVideoVersionName))
00783             return false;
00784     }
00785 
00786     if (dbver == "1036")
00787     {
00788         QStringList updates;
00789         updates += "ALTER TABLE  videometadata ADD  `studio` VARCHAR( 128 ) "
00790                    "AFTER `director`;";
00791         if (!performActualUpdate(updates, "1037", dbver,
00792                                  MythVideoVersionName))
00793             return false;
00794     }
00795 
00796     if (dbver == "1037")
00797     {
00798         QStringList updates;
00799         updates += "DELETE FROM videotypes WHERE extension = 'VIDEO_TS';";
00800         updates += "DELETE FROM videotypes WHERE extension = 'BDMV';";
00801         if (!performActualUpdate(updates, "1038", dbver,
00802                                  MythVideoVersionName))
00803             return false;
00804     }
00805 
00806     return true;
00807 }
00808 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends