QString GetSetClause(MSqlBindings &bindings) const override // SimpleStorage { bindings.insert(":SETPLAYERID", m_id.Value()); bindings.insert(":SETCOLUMN", m_user->GetDBValue()); return QString("gameplayerid = :SETPLAYERID, " "%2 = :SETCOLUMN").arg(GetColumnName()); }
void MSqlQuery::bindValues(const MSqlBindings &bindings) { MSqlBindings::const_iterator it; for (it = bindings.begin(); it != bindings.end(); ++it) { bindValue(it.key(), it.value()); } }
void MSqlAddMoreBindings(MSqlBindings &output, MSqlBindings &addfrom) { MSqlBindings::Iterator it; for (it = addfrom.begin(); it != addfrom.end(); ++it) { output.insert(it.key(), it.value()); } }
QString GenericDBStorage::GetSetClause(MSqlBindings &bindings) const { QString keycolumnTag = ":SETKEY" + keycolumn.toUpper(); QString columnTag = ":SETCOL" + GetColumnName().toUpper(); bindings.insert(keycolumnTag, keyvalue); bindings.insert(columnTag, user->GetDBValue()); return keycolumn + " = " + keycolumnTag + ", " + GetColumnName() + " = " + columnTag; }
QString GlobalDBStorage::setClause(MSqlBindings &bindings) { QString valueTag(":SETVALUE"); QString dataTag(":SETDATA"); QString clause("value = " + valueTag + ", data = " + dataTag); bindings.insert(valueTag, setting->getName()); bindings.insert(dataTag, setting->getValue().utf8()); return clause; }
QString GlobalDBStorage::GetSetClause(MSqlBindings &bindings) const { QString valueTag(":SETVALUE"); QString dataTag(":SETDATA"); QString clause("value = " + valueTag + ", data = " + dataTag); bindings.insert(valueTag, settingname); bindings.insert(dataTag, user->GetDBValue()); return clause; }
QString MuxDBStorage::GetSetClause(MSqlBindings &bindings) const { QString muxTag = ":SET" + mplexid->GetColumnName().toUpper(); QString nameTag = ":SET" + GetColumnName().toUpper(); bindings.insert(muxTag, mplexid->getValue()); bindings.insert(nameTag, user->GetDBValue()); // return query return (mplexid->GetColumnName() + " = " + muxTag + ", " + GetColumnName() + " = " + nameTag); }
QString ProfileGroupStorage::GetSetClause(MSqlBindings &bindings) const { QString idTag(":SETID"); QString colTag(":SET" + GetColumnName().toUpper()); QString query("id = " + idTag + ", " + GetColumnName() + " = " + colTag); bindings.insert(idTag, m_parent.getProfileNum()); bindings.insert(colTag, user->GetDBValue()); return query; }
QString GameDBStorage::GetSetClause(MSqlBindings &bindings) const { QString playerID(":SETPLAYERID"); QString colTag(":SET" + GetColumnName().toUpper()); QString query("gameplayerid = " + playerID + ", " + GetColumnName() + " = " + colTag); bindings.insert(playerID, parent.getGamePlayerID()); bindings.insert(colTag, user->GetDBValue()); return query; }
QString ChannelDBStorage::GetSetClause(MSqlBindings &bindings) const { QString fieldTag = (":SET" + id.getField().toUpper()); QString nameTag = (":SET" + GetColumnName().toUpper()); QString query(id.getField() + " = " + fieldTag + ", " + GetColumnName() + " = " + nameTag); bindings.insert(fieldTag, id.getValue()); bindings.insert(nameTag, user->GetDBValue()); return query; }
QString ChannelDBStorage::setClause(MSqlBindings &bindings) { QString fieldTag = (":SET" + id.getField().upper()); QString nameTag = (":SET" + setting->getName().upper()); QString query(id.getField() + " = " + fieldTag + ", " + setting->getName() + " = " + nameTag); bindings.insert(fieldTag, id.getValue()); bindings.insert(nameTag, setting->getValue()); return query; }
QString HostDBStorage::GetSetClause(MSqlBindings &bindings) const { QString valueTag(":SETVALUE"); QString dataTag(":SETDATA"); QString hostnameTag(":SETHOSTNAME"); QString clause("value = " + valueTag + ", data = " + dataTag + ", hostname = " + hostnameTag); bindings.insert(valueTag, settingname); bindings.insert(dataTag, user->GetDBValue()); bindings.insert(hostnameTag, MythDB::getMythDB()->GetHostName()); return clause; }
QString HostDBStorage::setClause(MSqlBindings &bindings) { QString valueTag(":SETVALUE"); QString dataTag(":SETDATA"); QString hostnameTag(":SETHOSTNAME"); QString clause("value = " + valueTag + ", data = " + dataTag + ", hostname = " + hostnameTag); bindings.insert(valueTag, setting->getName()); bindings.insert(dataTag, setting->getValue().utf8()); bindings.insert(hostnameTag, gContext->GetHostName()); return clause; }
QString HostDBStorage::GetWhereClause(MSqlBindings &bindings) const { /* Returns a where clause of the form: * "value = :VALUE AND hostname = :HOSTNAME" * The necessary bindings are added to the MSQLBindings& */ QString valueTag(":WHEREVALUE"); QString hostnameTag(":WHEREHOSTNAME"); QString clause("value = " + valueTag + " AND hostname = " + hostnameTag); bindings.insert(valueTag, settingname); bindings.insert(hostnameTag, MythDB::getMythDB()->GetHostName()); return clause; }
QString GenericDBStorage::GetWhereClause(MSqlBindings &bindings) const { QString keycolumnTag = ":WHERE" + keycolumn.toUpper(); bindings.insert(keycolumnTag, keyvalue); return keycolumn + " = " + keycolumnTag; }
QString ChannelDBStorage::GetWhereClause(MSqlBindings &bindings) const { QString fieldTag = (":WHERE" + id.getField().toUpper()); QString query(id.getField() + " = " + fieldTag); bindings.insert(fieldTag, id.getValue()); return query; }
QString PlayGroupDBStorage::GetWhereClause(MSqlBindings &bindings) const { QString nameTag(":WHERENAME"); QString query("name = " + nameTag); bindings.insert(nameTag, parent.getName()); return query; }
QString SimpleDBStorage::GetSetClause(MSqlBindings &bindings) const { QString tagname(":SET" + GetColumnName().toUpper()); QString clause(GetColumnName() + " = " + tagname); bindings.insert(tagname, user->GetDBValue()); return clause; }
QString GlobalDBStorage::whereClause(MSqlBindings &bindings) { QString valueTag(":WHEREVALUE"); QString clause("value = " + valueTag); bindings.insert(valueTag, setting->getName()); return clause; }
QString GlobalDBStorage::GetWhereClause(MSqlBindings &bindings) const { QString valueTag(":WHEREVALUE"); QString clause("value = " + valueTag); bindings.insert(valueTag, settingname); return clause; }
QString ProfileGroupStorage::GetWhereClause(MSqlBindings &bindings) const { QString idTag(":WHEREID"); QString query("id = " + idTag); bindings.insert(idTag, m_parent.getProfileNum()); return query; }
// Player Settings QString GameDBStorage::GetWhereClause(MSqlBindings &bindings) const { QString playerId(":PLAYERID"); QString query("gameplayerid = " + playerId); bindings.insert(playerId, parent.getGamePlayerID()); return query; }
QString MuxDBStorage::GetWhereClause(MSqlBindings &bindings) const { QString muxTag = ":WHERE" + mplexid->GetColumnName().toUpper(); bindings.insert(muxTag, mplexid->getValue()); // return query return mplexid->GetColumnName() + " = " + muxTag; }
QString SimpleDBStorage::setClause(MSqlBindings &bindings) { QString tagname(":SET" + column.upper()); QString clause(column + " = " + tagname); bindings.insert(tagname, setting->getValue().utf8()); return clause; }
/** \brief Fills RecordingInfo for the program that airs at * "desiredts" on "chanid". * \param chanid %Channel ID on which to search for program. * \param desiredts Date and Time for which we desire the program. * \param genUnknown Generate a full entry for live-tv if unknown * \param maxHours Clamp the maximum time to X hours from dtime. * \return LoadStatus describing what happened. */ RecordingInfo::RecordingInfo( uint _chanid, const QDateTime &desiredts, bool genUnknown, uint maxHours, LoadStatus *status) : oldrecstatus(rsUnknown), savedrecstatus(rsUnknown), future(false), schedorder(0), mplexid(0), desiredrecstartts(), desiredrecendts(), record(NULL) { ProgramList schedList; ProgramList progList; MSqlBindings bindings; QString querystr = "WHERE program.chanid = :CHANID AND " " program.starttime < :STARTTS1 AND " " program.endtime > :STARTTS2 "; bindings[":CHANID"] = QString::number(_chanid); QDateTime query_startts = desiredts.addSecs(50 - desiredts.time().second()); bindings[":STARTTS1"] = query_startts; bindings[":STARTTS2"] = query_startts; ::LoadFromScheduler(schedList); LoadFromProgram(progList, querystr, bindings, schedList); if (!progList.empty()) { ProgramInfo *pginfo = progList[0]; if (maxHours > 0) { if (desiredts.secsTo( pginfo->GetScheduledEndTime()) > (int)maxHours * 3600) { pginfo->SetScheduledEndTime(desiredts.addSecs(maxHours * 3600)); pginfo->SetRecordingEndTime(pginfo->GetScheduledEndTime()); } } *this = *pginfo; if (status) *status = kFoundProgram; return; } recstartts = startts = desiredts; recendts = endts = desiredts; lastmodified = desiredts; MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT chanid, channum, callsign, name, " "commmethod, outputfilters " "FROM channel " "WHERE chanid = :CHANID"); query.bindValue(":CHANID", _chanid); if (!query.exec()) { MythDB::DBError("Loading Program overlapping a datetime", query); if (status) *status = kNoProgram; return; } if (!query.next()) { if (status) *status = kNoProgram; return; } chanid = query.value(0).toUInt(); chanstr = query.value(1).toString(); chansign = query.value(2).toString(); channame = query.value(3).toString(); programflags &= ~FL_CHANCOMMFREE; programflags |= (query.value(4).toInt() == COMM_DETECT_COMMFREE) ? FL_CHANCOMMFREE : 0; chanplaybackfilters = query.value(5).toString(); { QMutexLocker locker(&staticDataLock); if (unknownTitle.isEmpty()) unknownTitle = gCoreContext->GetSetting("UnknownTitle"); title = unknownTitle; title.detach(); } if (!genUnknown) { if (status) *status = kFakedZeroMinProgram; return; } // Round endtime up to the next half-hour. endts = QDateTime( endts.date(), QTime(endts.time().hour(), endts.time().minute() / kUnknownProgramLength * kUnknownProgramLength), Qt::UTC); endts = endts.addSecs(kUnknownProgramLength * 60); // if under a minute, bump it up to the next half hour if (startts.secsTo(endts) < 60) endts = endts.addSecs(kUnknownProgramLength * 60); recendts = endts; // Find next program starttime bindings.clear(); QDateTime nextstart = startts; querystr = "WHERE program.chanid = :CHANID AND " " program.starttime > :STARTTS " "GROUP BY program.starttime ORDER BY program.starttime LIMIT 1 "; bindings[":CHANID"] = QString::number(_chanid); bindings[":STARTTS"] = desiredts.addSecs(50 - desiredts.time().second()); LoadFromProgram(progList, querystr, bindings, schedList); if (!progList.empty()) nextstart = (*progList.begin())->GetScheduledStartTime(); if (nextstart > startts && nextstart < recendts) recendts = endts = nextstart; if (status) *status = kFakedLiveTVProgram; desiredrecstartts = startts; desiredrecendts = endts; }
bool MSqlQuery::exec() { if (!m_db) { // Database structure's been deleted return false; } if (m_last_prepared_query.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, "MSqlQuery::exec(void) called without a prepared query."); return false; } #if DEBUG_RECONNECT if (random() < RAND_MAX / 50) { LOG(VB_GENERAL, LOG_INFO, "MSqlQuery disconnecting DB to test reconnection logic"); m_db->m_db.close(); } #endif // Database connection down. Try to restart it, give up if it's still // down if (!m_db->isOpen() && !Reconnect()) { LOG(VB_GENERAL, LOG_INFO, "MySQL server disconnected"); return false; } QElapsedTimer timer; timer.start(); bool result = QSqlQuery::exec(); qint64 elapsed = timer.elapsed(); // if the query failed with "MySQL server has gone away" // Close and reopen the database connection and retry the query if it // connects again if (!result && QSqlQuery::lastError().number() == 2006 && Reconnect()) result = QSqlQuery::exec(); if (!result) { QString err = MythDB::GetError("MSqlQuery", *this); MSqlBindings tmp = QSqlQuery::boundValues(); bool has_null_strings = false; for (MSqlBindings::iterator it = tmp.begin(); it != tmp.end(); ++it) { if (it->type() != QVariant::String) continue; if (it->isNull() || it->toString().isNull()) { has_null_strings = true; *it = QVariant(QString("")); } } if (has_null_strings) { bindValues(tmp); timer.restart(); result = QSqlQuery::exec(); elapsed = timer.elapsed(); } if (result) { LOG(VB_GENERAL, LOG_ERR, QString("Original query failed, but resend with empty " "strings in place of NULL strings worked. ") + "\n" + err); } } if (VERBOSE_LEVEL_CHECK(VB_DATABASE, LOG_INFO)) { QString str = lastQuery(); // Database logging will cause an infinite loop here if not filtered // out if (!str.startsWith("INSERT INTO logging ")) { // Sadly, neither executedQuery() nor lastQuery() display // the values in bound queries against a MySQL5 database. // So, replace the named placeholders with their values. QMapIterator<QString, QVariant> b = boundValues(); while (b.hasNext()) { b.next(); str.replace(b.key(), '\'' + b.value().toString() + '\''); } LOG(VB_DATABASE, LOG_INFO, QString("MSqlQuery::exec(%1) %2%3%4") .arg(m_db->MSqlDatabase::GetConnectionName()).arg(str) .arg(QString(" <<<< Took %1ms").arg(QString::number(elapsed))) .arg(isSelect() ? QString(", Returned %1 row(s)") .arg(size()) : QString())); } } return result; }
QString GetWhereClause(MSqlBindings &bindings) const override // SimpleStorage { bindings.insert(":PLAYERID", m_id.Value()); return "gameplayerid = :PLAYERID"; }