MythTV  0.26-pre
mythstorage.cpp
Go to the documentation of this file.
00001 // -*- Mode: c++ -*-
00002 
00003 // Myth headers
00004 #include "mythstorage.h"
00005 #include "mythdb.h"
00006 
00007 void SimpleDBStorage::Load(void)
00008 {
00009     MSqlQuery query(MSqlQuery::InitCon());
00010     MSqlBindings bindings;
00011     query.prepare(
00012         "SELECT " + GetColumnName() +
00013         "  FROM " + GetTableName() +
00014         " WHERE " + GetWhereClause(bindings));
00015     query.bindValues(bindings);
00016 
00017     if (!query.exec() || !query.isActive())
00018     {
00019         MythDB::DBError("SimpleDBStorage::Load()", query);
00020     }
00021     else if (query.next())
00022     {
00023         QString result = query.value(0).toString();
00024         if (!result.isNull())
00025         {
00026             initval = result;
00027             user->SetDBValue(result);
00028         }
00029     }
00030 }
00031 
00032 void SimpleDBStorage::Save(QString _table)
00033 {
00034     if (!IsSaveRequired())
00035         return;
00036 
00037     MSqlBindings bindings;
00038     QString querystr = QString("SELECT * FROM " + _table + " WHERE "
00039                                + GetWhereClause(bindings) + ';');
00040 
00041     MSqlQuery query(MSqlQuery::InitCon());
00042     query.prepare(querystr);
00043     query.bindValues(bindings);
00044 
00045     if (!query.exec())
00046     {
00047         MythDB::DBError("SimpleDBStorage::Save() query", query);
00048         return;
00049     }
00050 
00051     if (query.isActive() && query.next())
00052     {
00053         // Row already exists
00054         // Don"t change this QString. See the CVS logs rev 1.91.
00055         MSqlBindings bindings;
00056 
00057         querystr = QString("UPDATE " + _table + " SET " + GetSetClause(bindings) +
00058                            " WHERE " + GetWhereClause(bindings) + ';');
00059 
00060         query.prepare(querystr);
00061         query.bindValues(bindings);
00062 
00063         if (!query.exec())
00064             MythDB::DBError("SimpleDBStorage::Save() update", query);
00065     }
00066     else
00067     {
00068         // Row does not exist yet
00069         MSqlBindings bindings;
00070 
00071         querystr = QString("INSERT INTO " + _table + " SET "
00072                            + GetSetClause(bindings) + ';');
00073 
00074         query.prepare(querystr);
00075         query.bindValues(bindings);
00076 
00077         if (!query.exec())
00078             MythDB::DBError("SimpleDBStorage::Save() insert", query);
00079     }
00080 }
00081 
00082 void SimpleDBStorage::Save(void)
00083 {
00084     Save(GetTableName());
00085 }
00086 
00087 QString SimpleDBStorage::GetSetClause(MSqlBindings &bindings) const
00088 {
00089     QString tagname(":SET" + GetColumnName().toUpper());
00090     QString clause(GetColumnName() + " = " + tagname);
00091 
00092     bindings.insert(tagname, user->GetDBValue());
00093 
00094     return clause;
00095 }
00096 
00097 bool SimpleDBStorage::IsSaveRequired(void) const
00098 {
00099     return user->GetDBValue() != initval;
00100 }
00101 
00102 void SimpleDBStorage::SetSaveRequired(void)
00103 {
00104     initval.clear();
00105 }
00106 
00108 
00109 QString GenericDBStorage::GetWhereClause(MSqlBindings &bindings) const
00110 {
00111     QString keycolumnTag = ":WHERE" + keycolumn.toUpper();
00112 
00113     bindings.insert(keycolumnTag, keyvalue);
00114 
00115     return keycolumn + " = " + keycolumnTag;
00116 }
00117 
00118 QString GenericDBStorage::GetSetClause(MSqlBindings &bindings) const
00119 {
00120     QString keycolumnTag = ":SETKEY" + keycolumn.toUpper();
00121     QString columnTag    = ":SETCOL" + GetColumnName().toUpper();
00122 
00123     bindings.insert(keycolumnTag, keyvalue);
00124     bindings.insert(columnTag,    user->GetDBValue());
00125 
00126     return keycolumn + " = " + keycolumnTag + ", " +
00127         GetColumnName() + " = " + columnTag;
00128 }
00129 
00131 
00132 HostDBStorage::HostDBStorage(StorageUser *_user, const QString &name) :
00133     SimpleDBStorage(_user, "settings", "data"), settingname(name)
00134 {
00135 }
00136 
00137 QString HostDBStorage::GetWhereClause(MSqlBindings &bindings) const
00138 {
00139     /* Returns a where clause of the form:
00140      * "value = :VALUE AND hostname = :HOSTNAME"
00141      * The necessary bindings are added to the MSQLBindings&
00142      */
00143     QString valueTag(":WHEREVALUE");
00144     QString hostnameTag(":WHEREHOSTNAME");
00145 
00146     QString clause("value = " + valueTag + " AND hostname = " + hostnameTag);
00147 
00148     bindings.insert(valueTag, settingname);
00149     bindings.insert(hostnameTag, MythDB::getMythDB()->GetHostName());
00150 
00151     return clause;
00152 }
00153 
00154 QString HostDBStorage::GetSetClause(MSqlBindings &bindings) const
00155 {
00156     QString valueTag(":SETVALUE");
00157     QString dataTag(":SETDATA");
00158     QString hostnameTag(":SETHOSTNAME");
00159     QString clause("value = " + valueTag + ", data = " + dataTag
00160                    + ", hostname = " + hostnameTag);
00161 
00162     bindings.insert(valueTag, settingname);
00163     bindings.insert(dataTag, user->GetDBValue());
00164     bindings.insert(hostnameTag, MythDB::getMythDB()->GetHostName());
00165 
00166     return clause;
00167 }
00168 
00170 
00171 GlobalDBStorage::GlobalDBStorage(
00172     StorageUser *_user, const QString &name) :
00173     SimpleDBStorage(_user, "settings", "data"), settingname(name)
00174 {
00175 }
00176 
00177 QString GlobalDBStorage::GetWhereClause(MSqlBindings &bindings) const
00178 {
00179     QString valueTag(":WHEREVALUE");
00180     QString clause("value = " + valueTag);
00181 
00182     bindings.insert(valueTag, settingname);
00183 
00184     return clause;
00185 }
00186 
00187 QString GlobalDBStorage::GetSetClause(MSqlBindings &bindings) const
00188 {
00189     QString valueTag(":SETVALUE");
00190     QString dataTag(":SETDATA");
00191 
00192     QString clause("value = " + valueTag + ", data = " + dataTag);
00193 
00194     bindings.insert(valueTag, settingname);
00195     bindings.insert(dataTag, user->GetDBValue());
00196 
00197     return clause;
00198 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends