Index: libs/libmythtv/tvosdmenuentry.h =================================================================== --- libs/libmythtv/tvosdmenuentry.h (revision 22742) +++ libs/libmythtv/tvosdmenuentry.h (working copy) @@ -63,7 +63,7 @@ TVOSDMenuEntry* FindEntry(QString category); private: - void GetEntriesFromDB(void); + int GetEntriesFromDB(void); void InitDefaultEntries(void); QList curMenuEntries; Index: libs/libmythtv/tvosdmenuentry.cpp =================================================================== --- libs/libmythtv/tvosdmenuentry.cpp (revision 22742) +++ libs/libmythtv/tvosdmenuentry.cpp (working copy) @@ -238,54 +238,67 @@ curMenuEntries.append(new TVOSDMenuEntry( "SLEEP", 1, 1, 1, 1, "Sleep")); - GetEntriesFromDB(); - if (GetCount() != curMenuEntries.count()) + int preload_cnt = curMenuEntries.size(); + int loaded_cnt = GetEntriesFromDB(); + if (preload_cnt != loaded_cnt) UpdateDB(); } int TVOSDMenuEntryList::GetCount(void) { - MSqlQuery query(MSqlQuery::InitCon()); - if (!query.isConnected()) - return curMenuEntries.count(); + return (int) curMenuEntries.size(); +} - query.prepare ("SELECT COUNT(osdcategory) FROM tvosdmenu;"); - if (query.exec() && query.isActive() && query.size() > 0) +// Returns the number of entries intialized from database. +int TVOSDMenuEntryList::GetEntriesFromDB(void) +{ + typedef QList::iterator Lit; + QMap catmap; + Lit it = curMenuEntries.begin(); + QString catlist(""); + for (; it != curMenuEntries.end(); ++it) { - query.next(); - return query.value(0).toUInt(); + QString cat = (*it)->GetCategory(); + catlist += QString("'%1',").arg(cat); + catmap[cat] = it; } - MythDB::DBError(LOC + "GetCount()", query); - return 0; -} + if (catlist.isEmpty()) + return 0; -void TVOSDMenuEntryList::GetEntriesFromDB(void) -{ + catlist = catlist.left(catlist.length() - 1); MSqlQuery query(MSqlQuery::InitCon()); - if (!query.isConnected()) - return; + query.prepare( + QString( + "SELECT osdcategory, livetv, recorded, video, dvd " + "FROM tvosdmenu " + "WHERE osdcategory IN (%1)").arg(catlist)); - TVOSDMenuEntry *entry = NULL; - QString osdcategory; - QListIterator cm = GetIterator(); - while (cm.hasNext()) + if (!query.exec()) { - entry = cm.next(); - osdcategory = entry->GetCategory(); - query.prepare("SELECT livetv, recorded, video, dvd " - "FROM tvosdmenu WHERE osdcategory = :OSDCATEGORY;"); - query.bindValue(":OSDCATEGORY", osdcategory); + MythDB::DBError("TVOSDMenuEntryList::GetEntriesFromDB()", query); + return 0; + } - if (query.exec() && query.isActive() && query.size() == 1) + int cnt = 0; + while (query.next()) + { + QString cat = query.value(0).toString(); + QMap::iterator mit = catmap.find(cat); + if (mit == catmap.end()) { - query.next(); - entry->UpdateEntry(query.value(0).toInt(), - query.value(1).toInt(), - query.value(2).toInt(), - query.value(3).toInt()); + VERBOSE(VB_IMPORTANT, QString("TVOSDMenuEntryList, Error: ") + + QString("Unable to find category '%1'").arg(cat)); + continue; } + + (**mit)->UpdateEntry(query.value(1).toInt(), + query.value(2).toInt(), + query.value(3).toInt(), + query.value(4).toInt()); + cnt++; } + return cnt; } void TVOSDMenuEntryList::UpdateDB(void)