//----------------------------------------------------------------------------- void QGCCacheWorker::_updateSetTotals(QGCCachedTileSet* set) { if(set->defaultSet()) { _updateTotals(); set->setSavedTiles(_totalCount); set->setSavedSize(_totalSize); set->setNumTiles(_defaultCount); set->setTilesSize(_defaultSize); return; } QSqlQuery subquery(*_db); QString sq = QString("SELECT COUNT(size), SUM(size) FROM Tiles A INNER JOIN SetTiles B on A.tileID = B.tileID WHERE B.setID = %1").arg(set->id()); if(subquery.exec(sq)) { if(subquery.next()) { set->setSavedTiles(subquery.value(0).toUInt()); set->setSavedSize(subquery.value(1).toULongLong()); //-- Update estimated size if(set->savedTiles() > 10 && set->savedSize()) { quint32 avg = set->savedSize() / set->savedTiles(); set->setTilesSize(avg * set->numTiles()); } } } }
//----------------------------------------------------------------------------- void QGCCacheWorker::_updateSetTotals(QGCCachedTileSet* set) { if(set->defaultSet()) { _updateTotals(); set->setSavedTileCount(_totalCount); set->setSavedTileSize(_totalSize); set->setTotalTileCount(_defaultCount); set->setTotalTileSize(_defaultSize); return; } QSqlQuery subquery(*_db); QString sq = QString("SELECT COUNT(size), SUM(size) FROM Tiles A INNER JOIN SetTiles B on A.tileID = B.tileID WHERE B.setID = %1").arg(set->id()); qCDebug(QGCTileCacheLog) << "_updateSetTotals(): " << sq; if(subquery.exec(sq)) { if(subquery.next()) { set->setSavedTileCount(subquery.value(0).toUInt()); set->setSavedTileSize(subquery.value(1).toULongLong()); qCDebug(QGCTileCacheLog) << "Set" << set->id() << "Totals:" << set->savedTileCount() << " " << set->savedTileSize() << "Expected: " << set->totalTileCount() << " " << set->totalTilesSize(); //-- Update (estimated) size quint64 avg = UrlFactory::averageSizeForType(set->type()); if(set->totalTileCount() <= set->savedTileCount()) { //-- We're done so the saved size is the total size set->setTotalTileSize(set->savedTileSize()); } else { //-- Otherwise we need to estimate it. if(set->savedTileCount() > 10 && set->savedTileSize()) { avg = set->savedTileSize() / set->savedTileCount(); } set->setTotalTileSize(avg * set->totalTileCount()); } //-- Now figure out the count for tiles unique to this set quint32 ucount = 0; quint64 usize = 0; sq = QString("SELECT COUNT(size), SUM(size) FROM Tiles WHERE tileID IN (SELECT A.tileID FROM SetTiles A join SetTiles B on A.tileID = B.tileID WHERE B.setID = %1 GROUP by A.tileID HAVING COUNT(A.tileID) = 1)").arg(set->id()); if(subquery.exec(sq)) { if(subquery.next()) { //-- This is only accurate when all tiles are downloaded ucount = subquery.value(0).toUInt(); usize = subquery.value(1).toULongLong(); } } //-- If we haven't downloaded it all, estimate size of unique tiles quint32 expectedUcount = set->totalTileCount() - set->savedTileCount(); if(!ucount) { usize = expectedUcount * avg; } else { expectedUcount = ucount; } set->setUniqueTileCount(expectedUcount); set->setUniqueTileSize(usize); } } }
void ChannelData::handleChannels(int id, QList<ChanInfo> *chanlist) { QString fileprefix = SetupIconCacheDirectory(); QDir::setCurrent(fileprefix); fileprefix += "/"; QList<ChanInfo>::iterator i = chanlist->begin(); for (; i != chanlist->end(); ++i) { QString localfile; if (!(*i).iconpath.isEmpty()) { QDir remotefile = QDir((*i).iconpath); QString filename = remotefile.dirName(); localfile = fileprefix + filename; QFile actualfile(localfile); if (!actualfile.exists() && !HttpComms::getHttpFile(localfile, (*i).iconpath)) { LOG(VB_GENERAL, LOG_ERR, QString("Failed to fetch icon from '%1'") .arg((*i).iconpath)); } } MSqlQuery query(MSqlQuery::InitCon()); if (!(*i).old_xmltvid.isEmpty()) { query.prepare( "SELECT xmltvid " "FROM channel " "WHERE xmltvid = :XMLTVID"); query.bindValue(":XMLTVID", (*i).old_xmltvid); if (!query.exec()) { MythDB::DBError("xmltvid conversion 1", query); } else if (query.next()) { LOG(VB_GENERAL, LOG_INFO, QString("Converting old xmltvid (%1) to new (%2)") .arg((*i).old_xmltvid).arg((*i).xmltvid)); query.prepare("UPDATE channel " "SET xmltvid = :NEWXMLTVID" "WHERE xmltvid = :OLDXMLTVID"); query.bindValue(":NEWXMLTVID", (*i).xmltvid); query.bindValue(":OLDXMLTVID", (*i).old_xmltvid); if (!query.exec()) { MythDB::DBError("xmltvid conversion 2", query); } } } query.prepare( "SELECT chanid, name, callsign, channum, " " finetune, icon, freqid, tvformat " "FROM channel " "WHERE xmltvid = :XMLTVID AND " " sourceid = :SOURCEID"); query.bindValue(":XMLTVID", (*i).xmltvid); query.bindValue(":SOURCEID", id); if (!query.exec()) { MythDB::DBError("handleChannels", query); } else if (query.next()) { QString chanid = query.value(0).toString(); if (interactive) { QString name = query.value(1).toString(); QString callsign = query.value(2).toString(); QString chanstr = query.value(3).toString(); QString finetune = query.value(4).toString(); QString icon = query.value(5).toString(); QString freqid = query.value(6).toString(); QString tvformat = query.value(7).toString(); cout << "### " << endl; cout << "### Existing channel found" << endl; cout << "### " << endl; cout << "### xmltvid = " << (*i).xmltvid.toLocal8Bit().constData() << endl; cout << "### chanid = " << chanid.toLocal8Bit().constData() << endl; cout << "### name = " << name.toLocal8Bit().constData() << endl; cout << "### callsign = " << callsign.toLocal8Bit().constData() << endl; cout << "### channum = " << chanstr.toLocal8Bit().constData() << endl; if (channel_preset) { cout << "### freqid = " << freqid.toLocal8Bit().constData() << endl; } cout << "### finetune = " << finetune.toLocal8Bit().constData() << endl; cout << "### tvformat = " << tvformat.toLocal8Bit().constData() << endl; cout << "### icon = " << icon.toLocal8Bit().constData() << endl; cout << "### " << endl; (*i).name = name; (*i).callsign = callsign; (*i).chanstr = chanstr; (*i).finetune = finetune; (*i).freqid = freqid; (*i).tvformat = tvformat; promptForChannelUpdates(i, chanid.toUInt()); if ((*i).callsign.isEmpty()) (*i).callsign = chanid; if (name != (*i).name || callsign != (*i).callsign || chanstr != (*i).chanstr || finetune != (*i).finetune || freqid != (*i).freqid || icon != localfile || tvformat != (*i).tvformat) { MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE channel SET chanid = :CHANID, " "name = :NAME, callsign = :CALLSIGN, " "channum = :CHANNUM, finetune = :FINE, " "icon = :ICON, freqid = :FREQID, " "tvformat = :TVFORMAT " " WHERE xmltvid = :XMLTVID " "AND sourceid = :SOURCEID;"); subquery.bindValue(":CHANID", chanid); subquery.bindValue(":NAME", (*i).name); subquery.bindValue(":CALLSIGN", (*i).callsign); subquery.bindValue(":CHANNUM", (*i).chanstr); subquery.bindValue(":FINE", (*i).finetune.toInt()); subquery.bindValue(":ICON", localfile); subquery.bindValue(":FREQID", (*i).freqid); subquery.bindValue(":TVFORMAT", (*i).tvformat); subquery.bindValue(":XMLTVID", (*i).xmltvid); subquery.bindValue(":SOURCEID", id); if (!subquery.exec()) { MythDB::DBError("update failed", subquery); } else { cout << "### " << endl; cout << "### Change performed" << endl; cout << "### " << endl; } } else { cout << "### " << endl; cout << "### Nothing changed" << endl; cout << "### " << endl; } } else { if (!non_us_updating && !localfile.isEmpty()) { MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE channel SET icon = :ICON WHERE " "chanid = :CHANID;"); subquery.bindValue(":ICON", localfile); subquery.bindValue(":CHANID", chanid); if (!subquery.exec()) MythDB::DBError("Channel icon change", subquery); } } } else if (insert_chan(id)) // Only insert channels for non-scannable sources { int major, minor = 0; long long freq = 0; get_atsc_stuff((*i).chanstr, id, (*i).freqid.toInt(), major, minor, freq); if (interactive && ((minor == 0) || (freq > 0))) { cout << "### " << endl; cout << "### New channel found" << endl; cout << "### " << endl; cout << "### name = " << (*i).name.toLocal8Bit().constData() << endl; cout << "### callsign = " << (*i).callsign.toLocal8Bit().constData() << endl; cout << "### channum = " << (*i).chanstr.toLocal8Bit().constData() << endl; if (channel_preset) { cout << "### freqid = " << (*i).freqid.toLocal8Bit().constData() << endl; } cout << "### finetune = " << (*i).finetune.toLocal8Bit().constData() << endl; cout << "### tvformat = " << (*i).tvformat.toLocal8Bit().constData() << endl; cout << "### icon = " << localfile.toLocal8Bit().constData() << endl; cout << "### " << endl; uint chanid = promptForChannelUpdates(i,0); if ((*i).callsign.isEmpty()) (*i).callsign = QString::number(chanid); int mplexid = 0; if ((chanid > 0) && (minor > 0)) mplexid = ChannelUtil::CreateMultiplex(id, "atsc", freq, "8vsb"); if (((mplexid > 0) || ((minor == 0) && (chanid > 0))) && ChannelUtil::CreateChannel( mplexid, id, chanid, (*i).callsign, (*i).name, (*i).chanstr, 0 /*service id*/, major, minor, false /*use on air guide*/, false /*hidden*/, false /*hidden in guide*/, (*i).freqid, localfile, (*i).tvformat, (*i).xmltvid)) { cout << "### " << endl; cout << "### Channel inserted" << endl; cout << "### " << endl; } else { cout << "### " << endl; cout << "### Channel skipped" << endl; cout << "### " << endl; } } else if (!non_us_updating && ((minor == 0) || (freq > 0))) { // We only do this if we are not asked to skip it with the // --updating flag. int mplexid = 0, chanid = 0; if (minor > 0) { mplexid = ChannelUtil::CreateMultiplex( id, "atsc", freq, "8vsb"); } if ((mplexid > 0) || (minor == 0)) chanid = ChannelUtil::CreateChanID(id, (*i).chanstr); if ((*i).callsign.isEmpty()) { QStringList words = (*i).name.simplified().toUpper() .split(" "); QString callsign = ""; QString w1 = words.size() > 0 ? words[0] : QString(); QString w2 = words.size() > 1 ? words[1] : QString(); if (w1.isEmpty()) callsign = QString::number(chanid); else if (w2.isEmpty()) callsign = words[0].left(5); else { callsign = w1.left(w2.length() == 1 ? 4:3); callsign += w2.left(5 - callsign.length()); } (*i).callsign = callsign; } if (chanid > 0) { QString cstr = QString((*i).chanstr); if(channel_preset && cstr.isEmpty()) cstr = QString::number(chanid % 1000); bool retval = ChannelUtil::CreateChannel( mplexid, id, chanid, (*i).callsign, (*i).name, cstr, 0 /*service id*/, major, minor, false /*use on air guide*/, false /*hidden*/, false /*hidden in guide*/, (*i).freqid, localfile, (*i).tvformat, (*i).xmltvid ); if (!retval) cout << "Channel " << chanid << " creation failed" << endl; } } } } }
bool GalleryUtil::RenameDirectory(const QString &currDir, const QString &oldName, const QString &newName) { // rename the directory QDir cdir(currDir); if (!cdir.rename(oldName, newName)) return false; // rename the directory's thumbnail if it exists in the parent directory if (QFile::exists(currDir + "/.thumbcache/" + oldName)) { QDir d(currDir + "/cache/gallery-thumbcache/"); d.rename(oldName, newName); } // also look in HOME directory for any thumbnails int prefixLen = gCoreContext->GetSetting("GalleryDir").length(); QString path = GetConfDir() + "/MythGallery"; path += currDir.right(currDir.length() - prefixLen) + '/'; if (QFile::exists(path + oldName)) { QDir d(path); d.rename(oldName, newName); // rename this directory's thumbnail path += QString(".thumbcache/"); if (QFile::exists(path + oldName)) { QDir d(path); d.rename(oldName, newName); } } // fix up the metadata in the database MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT image, angle FROM gallerymetadata " "WHERE image LIKE :IMAGEOLD"); query.bindValue(":IMAGEOLD", QString(currDir + '/' + oldName + '%')); if (query.exec()) { while (query.next()) { QString oldImage = query.value(0).toString(); QString newImage = oldImage; newImage = newImage.replace(currDir + '/' + oldName, currDir + '/' + newName); MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE gallerymetadata " "SET image = :IMAGENEW " "WHERE image = :IMAGEOLD"); subquery.bindValue(":IMAGENEW", newImage); subquery.bindValue(":IMAGEOLD", oldImage); if (!subquery.exec()) MythDB::DBError("GalleryUtil::RenameDirectory - update image", subquery); } } return true; }
void ChannelData::handleChannels(int id, QValueList<ChanInfo> *chanlist) { QString fileprefix = SetupIconCacheDirectory(); QDir::setCurrent(fileprefix); fileprefix += "/"; QValueList<ChanInfo>::iterator i = chanlist->begin(); for (; i != chanlist->end(); i++) { QString localfile = ""; if ((*i).iconpath != "") { QDir remotefile = QDir((*i).iconpath); QString filename = remotefile.dirName(); localfile = fileprefix + filename; QFile actualfile(localfile); if (!actualfile.exists()) { QString command = QString("wget ") + (*i).iconpath; system(command); } } MSqlQuery query(MSqlQuery::InitCon()); QString querystr; if ((*i).old_xmltvid != "") { querystr.sprintf("SELECT xmltvid FROM channel WHERE xmltvid = '%s'", (*i).old_xmltvid.ascii()); query.exec(querystr); if (query.isActive() && query.size() > 0) { VERBOSE(VB_GENERAL, QString("Converting old xmltvid (%1) to " "new (%2)") .arg((*i).old_xmltvid) .arg((*i).xmltvid)); query.exec(QString("UPDATE channel SET xmltvid = '%1' WHERE xmltvid = '%2';") .arg((*i).xmltvid) .arg((*i).old_xmltvid)); if (!query.numRowsAffected()) MythContext::DBError("xmltvid conversion",query); } } querystr.sprintf("SELECT chanid,name,callsign,channum,finetune," "icon,freqid,tvformat FROM channel WHERE " "xmltvid = '%s' AND sourceid = %d;", (*i).xmltvid.ascii(), id); query.exec(querystr); if (query.isActive() && query.size() > 0) { query.next(); QString chanid = query.value(0).toString(); if (interactive) { QString name = QString::fromUtf8(query.value(1).toString()); QString callsign = QString::fromUtf8(query.value(2).toString()); QString chanstr = QString::fromUtf8(query.value(3).toString()); QString finetune = QString::fromUtf8(query.value(4).toString()); QString icon = QString::fromUtf8(query.value(5).toString()); QString freqid = QString::fromUtf8(query.value(6).toString()); QString tvformat = QString::fromUtf8(query.value(7).toString()); cout << "### " << endl; cout << "### Existing channel found" << endl; cout << "### " << endl; cout << "### xmltvid = " << (*i).xmltvid.local8Bit() << endl; cout << "### chanid = " << chanid.local8Bit() << endl; cout << "### name = " << name.local8Bit() << endl; cout << "### callsign = " << callsign.local8Bit() << endl; cout << "### channum = " << chanstr.local8Bit() << endl; if (channel_preset) cout << "### freqid = " << freqid.local8Bit() << endl; cout << "### finetune = " << finetune.local8Bit() << endl; cout << "### tvformat = " << tvformat.local8Bit() << endl; cout << "### icon = " << icon.local8Bit() << endl; cout << "### " << endl; (*i).name = name; (*i).callsign = callsign; (*i).chanstr = chanstr; (*i).finetune = finetune; (*i).freqid = freqid; (*i).tvformat = tvformat; promptForChannelUpdates(i, atoi(chanid.ascii())); if ((*i).callsign == "") (*i).callsign = chanid; if (name != (*i).name || callsign != (*i).callsign || chanstr != (*i).chanstr || finetune != (*i).finetune || freqid != (*i).freqid || icon != localfile || tvformat != (*i).tvformat) { MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE channel SET chanid = :CHANID, " "name = :NAME, callsign = :CALLSIGN, " "channum = :CHANNUM, finetune = :FINE, " "icon = :ICON, freqid = :FREQID, " "tvformat = :TVFORMAT " " WHERE xmltvid = :XMLTVID " "AND sourceid = :SOURCEID;"); subquery.bindValue(":CHANID", chanid); subquery.bindValue(":NAME", (*i).name.utf8()); subquery.bindValue(":CALLSIGN", (*i).callsign.utf8()); subquery.bindValue(":CHANNUM", (*i).chanstr); subquery.bindValue(":FINE", (*i).finetune.toInt()); subquery.bindValue(":ICON", localfile); subquery.bindValue(":FREQID", (*i).freqid); subquery.bindValue(":TVFORMAT", (*i).tvformat); subquery.bindValue(":XMLTVID", (*i).xmltvid); subquery.bindValue(":SOURCEID", id); if (!subquery.exec()) { VERBOSE(VB_IMPORTANT, QString("DB Error: Channel " "update failed, SQL query was: %1") .arg(querystr)); } else { cout << "### " << endl; cout << "### Change performed" << endl; cout << "### " << endl; } } else { cout << "### " << endl; cout << "### Nothing changed" << endl; cout << "### " << endl; } } else { if (!non_us_updating && localfile != "") { MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE channel SET icon = :ICON WHERE " "chanid = :CHANID;"); subquery.bindValue(":ICON", localfile); subquery.bindValue(":CHANID", chanid); if (!subquery.exec()) MythContext::DBError("Channel icon change", subquery); } } } else { int major, minor; long long freq; get_atsc_stuff((*i).chanstr, id, (*i).freqid.toInt(), major, minor, freq); if (interactive && ((minor == 0) || (freq > 0))) { cout << "### " << endl; cout << "### New channel found" << endl; cout << "### " << endl; cout << "### name = " << (*i).name.local8Bit() << endl; cout << "### callsign = " << (*i).callsign.local8Bit() << endl; cout << "### channum = " << (*i).chanstr.local8Bit() << endl; if (channel_preset) cout << "### freqid = " << (*i).freqid.local8Bit() << endl; cout << "### finetune = " << (*i).finetune.local8Bit() << endl; cout << "### tvformat = " << (*i).tvformat.local8Bit() << endl; cout << "### icon = " << localfile.local8Bit() << endl; cout << "### " << endl; uint chanid = promptForChannelUpdates(i,0); if ((*i).callsign == "") (*i).callsign = QString::number(chanid); int mplexid = 0; if ((chanid > 0) && (minor > 0)) mplexid = ChannelUtil::CreateMultiplex(id, "atsc", freq, "8vsb"); if (((mplexid > 0) || ((minor == 0) && (chanid > 0))) && ChannelUtil::CreateChannel( mplexid, id, chanid, (*i).callsign, (*i).name, (*i).chanstr, 0 /*service id*/, major, minor, false /*use on air guide*/, false /*hidden*/, false /*hidden in guide*/, (*i).freqid, localfile, (*i).tvformat, (*i).xmltvid)) { cout << "### " << endl; cout << "### Channel inserted" << endl; cout << "### " << endl; } else { cout << "### " << endl; cout << "### Channel skipped" << endl; cout << "### " << endl; } } else if (!non_us_updating && ((minor == 0) || (freq > 0))) { // We only do this if we are not asked to skip it with the // --updating flag. int mplexid = 0, chanid = 0; if (minor > 0) { mplexid = ChannelUtil::CreateMultiplex( id, "atsc", freq, "8vsb"); } if ((mplexid > 0) || (minor == 0)) chanid = ChannelUtil::CreateChanID(id, (*i).chanstr); if ((*i).callsign.isEmpty()) { QStringList words = QStringList::split(" ",(*i).name.simplifyWhiteSpace().upper()); QString callsign = ""; QString w1 = words.size() > 0 ? words[0] : QString(); QString w2 = words.size() > 1 ? words[1] : QString(); if (w1.isEmpty()) callsign = QString::number(chanid); else if (w2.isEmpty()) callsign = words[0].left(5); else { callsign = w1.left(w2.length() == 1 ? 4:3); callsign += w2.left(5 - callsign.length()); } (*i).callsign = callsign; } if (chanid > 0) { QString cstr = QString((*i).chanstr); if(channel_preset && cstr.isEmpty()) cstr = QString::number(chanid % 1000); ChannelUtil::CreateChannel( mplexid, id, chanid, (*i).callsign, (*i).name, cstr, 0 /*service id*/, major, minor, false /*use on air guide*/, false /*hidden*/, false /*hidden in guide*/, (*i).freqid, localfile, (*i).tvformat, (*i).xmltvid); } } } } }
std::shared_ptr<AbstractExpression> ExistsExpression::deep_copy() const { return std::make_shared<ExistsExpression>(subquery()->deep_copy(), exists_expression_type); }
std::string ExistsExpression::as_column_name() const { std::stringstream stream; stream << (exists_expression_type == ExistsExpressionType::Exists ? "EXISTS" : "NOT EXISTS"); stream << "(" << subquery()->as_column_name() << ")"; return stream.str(); }
void ChannelData::handleChannels(int id, ChannelInfoList *chanlist) { if (m_guideDataOnly) { LOG(VB_GENERAL, LOG_NOTICE, "Skipping Channel Updates"); return; } ChannelList existingChannels = channelList(id); QString fileprefix = SetupIconCacheDirectory(); QDir::setCurrent(fileprefix); fileprefix += "/"; bool insertChan = insert_chan(id); // unscannable source ChannelInfoList::iterator i = chanlist->begin(); for (; i != chanlist->end(); ++i) { if ((*i).xmltvid.isEmpty()) continue; QString localfile; if (!(*i).icon.isEmpty()) { QDir remotefile = QDir((*i).icon); QString filename = remotefile.dirName(); localfile = fileprefix + filename; QFile actualfile(localfile); if (!actualfile.exists() && !GetMythDownloadManager()->download((*i).icon, localfile)) { LOG(VB_GENERAL, LOG_ERR, QString("Failed to fetch icon from '%1'") .arg((*i).icon)); } localfile = filename; } MSqlQuery query(MSqlQuery::InitCon()); if (!(*i).old_xmltvid.isEmpty()) { query.prepare( "SELECT xmltvid " "FROM channel " "WHERE xmltvid = :XMLTVID"); query.bindValue(":XMLTVID", (*i).old_xmltvid); if (!query.exec()) { MythDB::DBError("xmltvid conversion 1", query); } else if (query.next()) { LOG(VB_GENERAL, LOG_INFO, QString("Converting old xmltvid (%1) to new (%2)") .arg((*i).old_xmltvid).arg((*i).xmltvid)); query.prepare("UPDATE channel " "SET xmltvid = :NEWXMLTVID" "WHERE xmltvid = :OLDXMLTVID"); query.bindValue(":NEWXMLTVID", (*i).xmltvid); query.bindValue(":OLDXMLTVID", (*i).old_xmltvid); if (!query.exec()) { MythDB::DBError("xmltvid conversion 2", query); } } } ChannelInfo dbChan = FindMatchingChannel(*i, existingChannels); if (dbChan.chanid > 0) // Channel exists, updating { LOG(VB_XMLTV, LOG_NOTICE, QString("Match found for xmltvid %1 to channel %2 (%3)") .arg((*i).xmltvid).arg(dbChan.name).arg(dbChan.chanid)); if (m_interactive) { cout << "### " << endl; cout << "### Existing channel found" << endl; cout << "### " << endl; cout << "### xmltvid = " << (*i).xmltvid.toLocal8Bit().constData() << endl; cout << "### chanid = " << dbChan.chanid << endl; cout << "### name = " << dbChan.name.toLocal8Bit().constData() << endl; cout << "### callsign = " << dbChan.callsign.toLocal8Bit().constData() << endl; cout << "### channum = " << dbChan.channum.toLocal8Bit().constData() << endl; if (m_channelPreset) { cout << "### freqid = " << dbChan.freqid.toLocal8Bit().constData() << endl; } cout << "### finetune = " << dbChan.finetune << endl; cout << "### tvformat = " << dbChan.tvformat.toLocal8Bit().constData() << endl; cout << "### icon = " << dbChan.icon.toLocal8Bit().constData() << endl; cout << "### " << endl; // The only thing the xmltv data supplies here is the icon (*i).name = dbChan.name; (*i).callsign = dbChan.callsign; (*i).channum = dbChan.channum; (*i).finetune = dbChan.finetune; (*i).freqid = dbChan.freqid; (*i).tvformat = dbChan.tvformat; promptForChannelUpdates(i, dbChan.chanid); if ((*i).callsign.isEmpty()) (*i).callsign = dbChan.name; if (dbChan.name != (*i).name || dbChan.callsign != (*i).callsign || dbChan.channum != (*i).channum || dbChan.finetune != (*i).finetune || dbChan.freqid != (*i).freqid || dbChan.icon != localfile || dbChan.tvformat != (*i).tvformat) { MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE channel SET chanid = :CHANID, " "name = :NAME, callsign = :CALLSIGN, " "channum = :CHANNUM, finetune = :FINE, " "icon = :ICON, freqid = :FREQID, " "tvformat = :TVFORMAT " " WHERE xmltvid = :XMLTVID " "AND sourceid = :SOURCEID;"); subquery.bindValue(":CHANID", dbChan.chanid); subquery.bindValue(":NAME", (*i).name); subquery.bindValue(":CALLSIGN", (*i).callsign); subquery.bindValue(":CHANNUM", (*i).channum); subquery.bindValue(":FINE", (*i).finetune); subquery.bindValue(":ICON", localfile); subquery.bindValue(":FREQID", (*i).freqid); subquery.bindValue(":TVFORMAT", (*i).tvformat); subquery.bindValue(":XMLTVID", (*i).xmltvid); subquery.bindValue(":SOURCEID", id); if (!subquery.exec()) { MythDB::DBError("update failed", subquery); } else { cout << "### " << endl; cout << "### Change performed" << endl; cout << "### " << endl; } } else { cout << "### " << endl; cout << "### Nothing changed" << endl; cout << "### " << endl; } } else if ((dbChan.icon != localfile) || (dbChan.xmltvid != (*i).xmltvid)) { LOG(VB_XMLTV, LOG_NOTICE, QString("Updating channel %1 (%2)") .arg(dbChan.name).arg(dbChan.chanid)); if (localfile.isEmpty()) localfile = dbChan.icon; if (dbChan.xmltvid != (*i).xmltvid) { MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE channel SET icon = :ICON " ", xmltvid:= :XMLTVID WHERE " "chanid = :CHANID;"); subquery.bindValue(":ICON", localfile); subquery.bindValue(":XMLTVID", (*i).xmltvid); subquery.bindValue(":CHANID", dbChan.chanid); if (!subquery.exec()) MythDB::DBError("Channel icon change", subquery); } else { MSqlQuery subquery(MSqlQuery::InitCon()); subquery.prepare("UPDATE channel SET icon = :ICON WHERE " "chanid = :CHANID;"); subquery.bindValue(":ICON", localfile); subquery.bindValue(":CHANID", dbChan.chanid); if (!subquery.exec()) MythDB::DBError("Channel icon change", subquery); } } } else if (insertChan) // Only insert channels for non-scannable sources { int major, minor = 0; long long freq = 0; get_atsc_stuff((*i).channum, id, (*i).freqid.toInt(), major, minor, freq); if (m_interactive && ((minor == 0) || (freq > 0))) { cout << "### " << endl; cout << "### New channel found" << endl; cout << "### " << endl; cout << "### name = " << (*i).name.toLocal8Bit().constData() << endl; cout << "### callsign = " << (*i).callsign.toLocal8Bit().constData() << endl; cout << "### channum = " << (*i).channum.toLocal8Bit().constData() << endl; if (m_channelPreset) { cout << "### freqid = " << (*i).freqid.toLocal8Bit().constData() << endl; } cout << "### finetune = " << (*i).finetune << endl; cout << "### tvformat = " << (*i).tvformat.toLocal8Bit().constData() << endl; cout << "### icon = " << localfile.toLocal8Bit().constData() << endl; cout << "### " << endl; uint chanid = promptForChannelUpdates(i,0); if ((*i).callsign.isEmpty()) (*i).callsign = QString::number(chanid); int mplexid = 0; if ((chanid > 0) && (minor > 0)) mplexid = ChannelUtil::CreateMultiplex(id, "atsc", freq, "8vsb"); if (((mplexid > 0) || ((minor == 0) && (chanid > 0))) && ChannelUtil::CreateChannel( mplexid, id, chanid, (*i).callsign, (*i).name, (*i).channum, 0 /*service id*/, major, minor, false /*use on air guide*/, false /*hidden*/, false /*hidden in guide*/, (*i).freqid, localfile, (*i).tvformat, (*i).xmltvid)) { cout << "### " << endl; cout << "### Channel inserted" << endl; cout << "### " << endl; } else { cout << "### " << endl; cout << "### Channel skipped" << endl; cout << "### " << endl; } } else if ((minor == 0) || (freq > 0)) { // We only do this if we are not asked to skip it with the // --update-guide-only (formerly --update) flag. int mplexid = 0, chanid = 0; if (minor > 0) { mplexid = ChannelUtil::CreateMultiplex( id, "atsc", freq, "8vsb"); } if ((mplexid > 0) || (minor == 0)) chanid = ChannelUtil::CreateChanID(id, (*i).channum); if ((*i).callsign.isEmpty()) { QStringList words = (*i).name.simplified().toUpper() .split(" "); QString callsign = ""; QString w1 = words.size() > 0 ? words[0] : QString(); QString w2 = words.size() > 1 ? words[1] : QString(); if (w1.isEmpty()) callsign = QString::number(chanid); else if (w2.isEmpty()) callsign = words[0].left(5); else { callsign = w1.left(w2.length() == 1 ? 4:3); callsign += w2.left(5 - callsign.length()); } (*i).callsign = callsign; } if (chanid > 0) { QString cstr = QString((*i).channum); if(m_channelPreset && cstr.isEmpty()) cstr = QString::number(chanid % 1000); bool retval = ChannelUtil::CreateChannel( mplexid, id, chanid, (*i).callsign, (*i).name, cstr, 0 /*service id*/, major, minor, false /*use on air guide*/, false /*hidden*/, false /*hidden in guide*/, (*i).freqid, localfile, (*i).tvformat, (*i).xmltvid ); if (!retval) cout << "Channel " << chanid << " creation failed" << endl; } } } } }