/** \fn DBUtil::CheckRepairStatus(MSqlQuery &query) * \brief Parse the results of a CHECK TABLE or REPAIR TABLE run. * * This function reads the records returned by a CHECK TABLE or REPAIR TABLE * run and determines the status of the table(s). The query should have * columns Table, Msg_type, and Msg_text. * * The function properly handles multiple records for a single table. If the * last record for a given table shows a status (Msg_type) of OK (Msg_text), * the table is considered OK, even if an error or warning appeared before * (this could be the case, for example, when an empty table is crashed). * * \param query An already-executed CHECK TABLE or REPAIR TABLE query whose * results should be parsed. * \return A list of names of not-OK (errored or crashed) tables * \sa DBUtil::CheckTables(const bool, const QString) * \sa DBUtil::RepairTables(const QStringList) */ QStringList DBUtil::CheckRepairStatus(MSqlQuery &query) { QStringList tables; QSqlRecord record = query.record(); int table_index = record.indexOf("Table"); int type_index = record.indexOf("Msg_type"); int text_index = record.indexOf("Msg_text"); QString table, type, text, previous_table; bool ok = true; while (query.next()) { table = query.value(table_index).toString(); type = query.value(type_index).toString(); text = query.value(text_index).toString(); if (table != previous_table) { if (!ok) { tables.append(previous_table); ok = true; } previous_table = table; } // If the final row shows status OK, the table is now good if ("status" == type.toLower() && "ok" == text.toLower()) ok = true; else if ("error" == type.toLower() || ("status" == type.toLower() && "ok" != text.toLower())) ok = false; } // Check the last table in the list if (!ok) tables.append(table); return tables; }
bool ProgramData::DeleteOverlaps( MSqlQuery &query, uint chanid, const ProgInfo &pi) { if (VERBOSE_LEVEL_CHECK(VB_XMLTV, LOG_INFO)) { // Get overlaps.. query.prepare( "SELECT title,starttime,endtime " "FROM program " "WHERE chanid = :CHANID AND " " starttime >= :START AND " " starttime < :END;"); query.bindValue(":CHANID", chanid); query.bindValue(":START", pi.starttime); query.bindValue(":END", pi.endtime); if (!query.exec()) return false; if (!query.next()) return true; do { LOG(VB_XMLTV, LOG_INFO, QString("Removing existing program: %1 - %2 %3 %4") .arg(query.value(1).toDateTime().toString(Qt::ISODate)) .arg(query.value(2).toDateTime().toString(Qt::ISODate)) .arg(pi.channel) .arg(query.value(0).toString())); } while (query.next()); } if (!ClearDataByChannel(chanid, pi.starttime, pi.endtime, false)) { LOG(VB_XMLTV, LOG_ERR, QString("Program delete failed : %1 - %2 %3 %4") .arg(pi.starttime.toString(Qt::ISODate)) .arg(pi.endtime.toString(Qt::ISODate)) .arg(pi.channel) .arg(pi.title)); return false; } return true; }
static void fill_settings( MythSettingList &settings, MSqlQuery &query, MythSetting::SettingType stype) { QMap<QString,QString> map; while (query.next()) map[query.value(0).toString()] = query.value(1).toString(); MythSettingList::const_iterator it = settings.begin(); for (; it != settings.end(); ++it) fill_setting(*it, map, stype); }
uint DBPerson::GetPersonDB(MSqlQuery &query) const { query.prepare( "SELECT person " "FROM people " "WHERE name = :NAME"); query.bindValue(":NAME", name); if (!query.exec()) MythDB::DBError("get_person", query); else if (query.next()) return query.value(0).toUInt(); return 0; }
static bool program_exists(MSqlQuery &query, uint chanid, const QDateTime &st) { query.prepare( "SELECT title FROM program " "WHERE chanid = :CHANID AND " " starttime = :OLDSTART"); query.bindValue(":CHANID", chanid); query.bindValue(":OLDSTART", st); if (!query.exec()) { MythDB::DBError("program_exists", query); } if (query.next()) { return true; } return false; }
uint DBEvent::GetOverlappingPrograms( MSqlQuery &query, uint chanid, vector<DBEvent> &programs) const { uint count = 0; query.prepare( "SELECT title, subtitle, description, " " category, category_type, " " starttime, endtime, " " subtitletypes+0,audioprop+0, videoprop+0, " " seriesid, programid, " " partnumber, parttotal, " " syndicatedepisodenumber, " " airdate, originalairdate, " " previouslyshown,listingsource, " " stars+0 " "FROM program " "WHERE chanid = :CHANID AND " " manualid = 0 AND " " ( ( starttime >= :STIME1 AND starttime < :ETIME1 ) OR " " ( endtime > :STIME2 AND endtime <= :ETIME2 ) )"); query.bindValue(":CHANID", chanid); query.bindValue(":STIME1", starttime); query.bindValue(":ETIME1", endtime); query.bindValue(":STIME2", starttime); query.bindValue(":ETIME2", endtime); if (!query.exec()) { MythDB::DBError("GetOverlappingPrograms 1", query); return 0; } while (query.next()) { MythCategoryType category_type = string_to_myth_category_type(query.value(4).toString()); DBEvent prog( query.value(0).toString(), query.value(1).toString(), query.value(2).toString(), query.value(3).toString(), category_type, query.value(5).toDateTime(), query.value(6).toDateTime(), query.value(7).toUInt(), query.value(8).toUInt(), query.value(9).toUInt(), query.value(19).toDouble(), query.value(10).toString(), query.value(11).toString(), query.value(18).toUInt()); prog.partnumber = query.value(12).toUInt(); prog.parttotal = query.value(13).toUInt(); prog.syndicatedepisodenumber = query.value(14).toString(); prog.airdate = query.value(15).toUInt(); prog.originalairdate = query.value(16).toDate(); prog.previouslyshown = query.value(17).toBool(); ; programs.push_back(prog); count++; } return count; }
bool ProgramData::IsUnchanged( MSqlQuery &query, uint chanid, const ProgInfo &pi) { query.prepare( "SELECT count(*) " "FROM program " "WHERE chanid = :CHANID AND " " starttime = :START AND " " endtime = :END AND " " title = :TITLE AND " " subtitle = :SUBTITLE AND " " description = :DESC AND " " category = :CATEGORY AND " " category_type = :CATEGORY_TYPE AND " " airdate = :AIRDATE AND " " stars >= (:STARS1 - 0.001) AND " " stars <= (:STARS2 + 0.001) AND " " previouslyshown = :PREVIOUSLYSHOWN AND " " title_pronounce = :TITLE_PRONOUNCE AND " " audioprop = :AUDIOPROP AND " " videoprop = :VIDEOPROP AND " " subtitletypes = :SUBTYPES AND " " partnumber = :PARTNUMBER AND " " parttotal = :PARTTOTAL AND " " seriesid = :SERIESID AND " " showtype = :SHOWTYPE AND " " colorcode = :COLORCODE AND " " syndicatedepisodenumber = :SYNDICATEDEPISODENUMBER AND " " programid = :PROGRAMID"); QString cattype = myth_category_type_to_string(pi.categoryType); query.bindValue(":CHANID", chanid); query.bindValue(":START", pi.starttime); query.bindValue(":END", pi.endtime); query.bindValue(":TITLE", pi.title); query.bindValue(":SUBTITLE", pi.subtitle); query.bindValue(":DESC", pi.description); query.bindValue(":CATEGORY", pi.category); query.bindValue(":CATEGORY_TYPE", cattype); query.bindValue(":AIRDATE", pi.airdate); query.bindValue(":STARS1", pi.stars); query.bindValue(":STARS2", pi.stars); query.bindValue(":PREVIOUSLYSHOWN", pi.previouslyshown); query.bindValue(":TITLE_PRONOUNCE", pi.title_pronounce); query.bindValue(":AUDIOPROP", pi.audioProps); query.bindValue(":VIDEOPROP", pi.videoProps); query.bindValue(":SUBTYPES", pi.subtitleType); query.bindValue(":PARTNUMBER", pi.partnumber); query.bindValue(":PARTTOTAL", pi.parttotal); query.bindValue(":SERIESID", pi.seriesId); query.bindValue(":SHOWTYPE", pi.showtype); query.bindValue(":COLORCODE", pi.colorcode); query.bindValue(":SYNDICATEDEPISODENUMBER", pi.syndicatedepisodenumber); query.bindValue(":PROGRAMID", pi.programId); if (query.exec() && query.next()) return query.value(0).toUInt() > 0; return false; }