00001
00002 #include <QSqlError>
00003
00004
00005 #include <mythcontext.h>
00006 #include <mythdb.h>
00007
00008
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("&","&");
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 }