MythTV  0.26-pre
browserdbutil.cpp
Go to the documentation of this file.
00001 // Qt
00002 #include <QSqlError>
00003 
00004 // myth
00005 #include <mythcontext.h>
00006 #include <mythdb.h>
00007 
00008 // mythbrowser
00009 #include "browserdbutil.h"
00010 #include "bookmarkmanager.h"
00011 
00012 const QString currentDatabaseVersion = "1002";
00013 
00014 static bool UpdateDBVersionNumber(const QString &newnumber)
00015 {
00016 
00017     if (!gCoreContext->SaveSettingOnHost("BrowserDBSchemaVer", newnumber, NULL))
00018     {
00019         LOG(VB_GENERAL, LOG_ERR,
00020             QString("DB Error (Setting new DB version number): %1\n")
00021                 .arg(newnumber));
00022 
00023         return false;
00024     }
00025 
00026     return true;
00027 }
00028 
00029 static bool performActualUpdate(const QString updates[], QString version,
00030                                 QString &dbver)
00031 {
00032     MSqlQuery query(MSqlQuery::InitCon());
00033 
00034     LOG(VB_GENERAL, LOG_NOTICE,
00035         "Upgrading to MythBrowser schema version " + version);
00036 
00037     int counter = 0;
00038     QString thequery = updates[counter];
00039 
00040     while (thequery != "")
00041     {
00042         if (!query.exec(thequery))
00043         {
00044             QString msg =
00045                 QString("DB Error (Performing database upgrade): \n"
00046                         "Query was: %1 \nError was: %2 \nnew version: %3")
00047                 .arg(thequery)
00048                 .arg(MythDB::DBErrorMessage(query.lastError()))
00049                 .arg(version);
00050             LOG(VB_GENERAL, LOG_ERR, msg);
00051             return false;
00052         }
00053 
00054         counter++;
00055         thequery = updates[counter];
00056     }
00057 
00058     if (!UpdateDBVersionNumber(version))
00059         return false;
00060 
00061     dbver = version;
00062     return true;
00063 }
00064 
00065 bool UpgradeBrowserDatabaseSchema(void)
00066 {
00067     QString dbver = gCoreContext->GetSetting("BrowserDBSchemaVer");
00068 
00069     if (dbver == currentDatabaseVersion)
00070         return true;
00071 
00072     if (dbver == "")
00073     {
00074         LOG(VB_GENERAL, LOG_NOTICE,
00075             "Inserting MythBrowser initial database information.");
00076 
00077         const QString updates[] =
00078         {
00079             "DROP TABLE IF EXISTS websites;",
00080             "CREATE TABLE websites ("
00081             "id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, "
00082             "category VARCHAR(100) NOT NULL, "
00083             "name VARCHAR(100) NOT NULL, "
00084             "url VARCHAR(255) NOT NULL);",
00085             ""
00086         };
00087         if (!performActualUpdate(updates, "1000", dbver))
00088             return false;
00089     }
00090 
00091     if (dbver == "1000") 
00092     { 
00093         const QString updates[] =
00094         {
00095             "UPDATE settings SET data = 'Internal' WHERE data LIKE '%mythbrowser' AND value = 'WebBrowserCommand';", 
00096             "" 
00097         };
00098         if (!performActualUpdate(updates, "1001", dbver))
00099             return false;
00100     }
00101 
00102     if (dbver == "1001")
00103     {
00104         const QString updates[] =
00105         {
00106             "DELETE FROM keybindings "
00107             " WHERE action = 'DELETETAB' AND context = 'Browser';",
00108             ""
00109         };
00110         if (!performActualUpdate(updates, "1002", dbver))
00111             return false;
00112     }
00113 
00114     return true;
00115 }
00116 
00117 bool FindInDB(const QString &category, const QString& name)
00118 {
00119     MSqlQuery query(MSqlQuery::InitCon());
00120     query.prepare("SELECT name FROM websites "
00121                   "WHERE category = :CATEGORY AND name = :NAME ;");
00122     query.bindValue(":CATEGORY", category);
00123     query.bindValue(":NAME", name);
00124     if (!query.exec())
00125     {
00126         MythDB::DBError("mythbrowser: find in db", query);
00127         return false;
00128     }
00129 
00130     return (query.size() > 0);
00131 }
00132 
00133 bool InsertInDB(Bookmark* site)
00134 {
00135     if (!site)
00136         return false;
00137 
00138     return InsertInDB(site->category, site->name, site->url);
00139 }
00140 
00141 bool InsertInDB(const QString &category,
00142                 const QString &name, const QString &url)
00143 {
00144     if (category.isEmpty() || name.isEmpty() || url.isEmpty())
00145         return false;
00146 
00147     if (FindInDB(category, name))
00148         return false;
00149 
00150     QString _url = url.trimmed();
00151     if (!_url.startsWith("http://") && !_url.startsWith("https://") &&
00152             !_url.startsWith("file:/"))
00153         _url.prepend("http://");
00154 
00155     _url.replace("&amp;","&");
00156 
00157     MSqlQuery query(MSqlQuery::InitCon());
00158     query.prepare("INSERT INTO websites (category, name, url) "
00159                   "VALUES(:CATEGORY, :NAME, :URL);");
00160     query.bindValue(":CATEGORY", category);
00161     query.bindValue(":NAME", name);
00162     query.bindValue(":URL", _url);
00163     if (!query.exec())
00164     {
00165         MythDB::DBError("mythbrowser: inserting in DB", query);
00166         return false;
00167     }
00168 
00169     return (query.numRowsAffected() > 0);
00170 }
00171 
00172 bool RemoveFromDB(Bookmark *site)
00173 {
00174     if (!site)
00175         return false;
00176 
00177     return RemoveFromDB(site->category, site->name);
00178 }
00179 
00180 bool RemoveFromDB(const QString &category, const QString &name)
00181 {
00182     MSqlQuery query(MSqlQuery::InitCon());
00183     query.prepare("DELETE FROM websites "
00184                   "WHERE category = :CATEGORY AND name = :NAME;");
00185     query.bindValue(":CATEGORY", category);
00186     query.bindValue(":NAME", name);
00187     if (!query.exec())
00188     {
00189         MythDB::DBError("mythbrowser: delete from db", query);
00190         return false;
00191     }
00192 
00193     return (query.numRowsAffected() > 0);
00194 }
00195 
00196 int GetCategoryList(QStringList &list)
00197 {
00198     MSqlQuery query(MSqlQuery::InitCon());
00199     query.prepare("SELECT DISTINCT category FROM websites "
00200                   "ORDER BY category;");
00201 
00202     if (!query.exec())
00203     {
00204         MythDB::DBError("mythbrowser: get category list", query);
00205         return false;
00206     }
00207     else
00208     {
00209         while (query.next())
00210         {
00211             list << query.value(0).toString();
00212         }
00213     }
00214 
00215     return list.size();
00216 }
00217 
00218 int GetSiteList(QList<Bookmark*>  &siteList)
00219 {
00220     while (!siteList.isEmpty())
00221         delete siteList.takeFirst();
00222 
00223     MSqlQuery query(MSqlQuery::InitCon());
00224 
00225     if (!query.exec("SELECT category, name, url FROM websites "
00226                "ORDER BY category, name"))
00227     {
00228         LOG(VB_GENERAL, LOG_ERR, "BookmarkManager: Error in loading from DB");
00229     }
00230     else
00231     {
00232         while (query.next())
00233         {
00234             Bookmark *site = new Bookmark();
00235             site->category = query.value(0).toString();
00236             site->name = query.value(1).toString();
00237             site->url = query.value(2).toString();
00238             site->selected = false;
00239             siteList.append(site);
00240         }
00241     }
00242 
00243     return siteList.size();
00244 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends