/** \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; }
void DatabaseLogger::prepare(MSqlQuery &query) { query.prepare(m_query); query.bindValue(":HOST", gCoreContext->GetHostName()); query.bindValue(":APP", QCoreApplication::applicationName()); query.bindValue(":PID", getpid()); }
void DBUtil::UnlockSchema(MSqlQuery &query) { query.prepare("SELECT RELEASE_LOCK('schemaLock')"); if (!query.exec()) { MythDB::DBError("DBUtil UnlockSchema", query); } }
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); }
void UPnpCDSMusic::BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams ) { int nId = mapParams[ "Id" ].toInt(); QString sSQL = QString( "%1 WHERE song.song_id=:ID " ) .arg( GetItemListSQL() ); query.prepare( sSQL ); query.bindValue( ":ID", (int)nId ); }
uint DBPerson::InsertPersonDB(MSqlQuery &query) const { query.prepare( "INSERT IGNORE INTO people (name) " "VALUES (:NAME);"); query.bindValue(":NAME", name); if (query.exec()) return 1; MythDB::DBError("insert_person", query); return 0; }
void UPnpCDSTv::BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams ) { int nChanId = mapParams[ "ChanId" ].toInt(); QString sStartTime = mapParams[ "StartTime" ]; QString sSQL = QString( "%1 WHERE chanid=:CHANID and starttime=:STARTTIME " ) .arg( GetItemListSQL() ); query.prepare( sSQL ); query.bindValue(":CHANID" , (int)nChanId ); query.bindValue(":STARTTIME", sStartTime ); }
void UPnpCDSVideo::BindValues(MSqlQuery& query, IDTokenMap tokens) { if (tokens["video"].toInt() > 0) query.bindValue(":VIDEO_ID", tokens["video"]); if (!tokens["series"].isEmpty()) query.bindValue(":TITLE", tokens["series"]); if (!tokens["season"].isEmpty() && tokens["season"].toInt() >= 0) // Season 0 is valid query.bindValue(":SEASON", tokens["season"]); if (!tokens["type"].isEmpty()) query.bindValue(":TYPE", tokens["type"]); if (tokens["genre"].toInt() > 0) query.bindValue(":GENRE_ID", tokens["genre"]); }
static bool delete_program(MSqlQuery &query, uint chanid, const QDateTime &st) { query.prepare( "DELETE from program " "WHERE chanid = :CHANID AND " " starttime = :STARTTIME"); query.bindValue(":CHANID", chanid); query.bindValue(":STARTTIME", st); if (!query.exec()) { MythDB::DBError("delete_program", query); return false; } query.prepare( "DELETE from credits " "WHERE chanid = :CHANID AND " " starttime = :STARTTIME"); query.bindValue(":CHANID", chanid); query.bindValue(":STARTTIME", st); if (!query.exec()) { MythDB::DBError("delete_credits", query); return false; } return true; }
/** \fn ImageUtils::LoadDirectoryValues(MSqlQuery &, ImageMetadata *) * \brief Loads the directory information from the database into the dataMap * \param query Information from the database * \param dm Holds the loaded information * \return void */ void ImageUtils::LoadDirectoryValues(MSqlQuery &query, ImageMetadata *dm) { dm->m_id = query.value(0).toInt(); dm->m_fileName = query.value(1).toString(); dm->m_name = query.value(2).toString(); dm->m_path = query.value(3).toString(); dm->m_parentId = query.value(4).toInt(); dm->m_dirCount = query.value(5).toInt(); dm->m_fileCount = query.value(6).toInt(); dm->m_isHidden = query.value(7).toInt(); // preset all directories as subfolders dm->m_type = kSubDirectory; }
bool updateLastRunStatus(MSqlQuery &query, QString &status) { query.prepare("UPDATE settings SET data = :STATUS " "WHERE value='mythfilldatabaseLastRunStatus'"); query.bindValue(":STATUS", status); if (!query.exec()) { MythDB::DBError("updateLastRunStatus", query); return false; } return true; }
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; }
bool updateLastRunStart(MSqlQuery &query) { QDateTime qdtNow = QDateTime::currentDateTime(); query.prepare("UPDATE settings SET data = :STARTTIME " "WHERE value='mythfilldatabaseLastRunStart'"); query.bindValue(":STARTTIME", qdtNow); if (!query.exec()) { MythDB::DBError("updateLastRunStart", query); return false; } return true; }
QString MythDB::GetError(const QString &where, const MSqlQuery &query) { QString str = QString("DB Error (%1):\n").arg(where); str += "Query was:\n"; str += query.executedQuery() + '\n'; QString tmp = toCommaList(query.boundValues()); if (!tmp.isEmpty()) { str += "Bindings were:\n"; str += tmp; } str += DBErrorMessage(query.lastError()); return str; }
/** \fn GalleryDatabaseHelper::LoadDirectoryValues(MSqlQuery &, ImageMetadata *) * \brief Loads the directory information from the database * \param query Information from the database * \param im Holds the loaded information * \return void */ void GalleryDatabaseHelper::LoadDirectoryValues(MSqlQuery &query, ImageMetadata *im) { im->m_id = query.value(0).toInt(); im->m_fileName = query.value(1).toString(); im->m_name = query.value(2).toString(); im->m_path = query.value(3).toString(); im->m_parentId = query.value(4).toInt(); im->m_dirCount = query.value(5).toInt(); im->m_fileCount = query.value(6).toInt(); im->m_isHidden = query.value(7).toInt(); // preset all directories as subfolders im->m_type = kSubDirectory; LoadDirectoryThumbnailValues(im); }
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; }
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; }
/** \fn ImageUtils::LoadFileValues(MSqlQuery &, ImageMetadata *) * \brief Loads the file information from the database into the dataMap * \param query Information from the database * \param dm Holds the loaded information * \return void */ void ImageUtils::LoadFileValues(MSqlQuery &query, ImageMetadata *dm) { dm->m_id = query.value(0).toInt(); dm->m_fileName = query.value(1).toString(); dm->m_name = query.value(2).toString(); dm->m_path = query.value(3).toString(); dm->m_parentId = query.value(4).toInt(); dm->m_type = query.value(5).toInt(); dm->m_modTime = query.value(6).toInt(); dm->m_size = query.value(7).toInt(); dm->m_extension = query.value(8).toString(); dm->SetAngle( query.value(9).toInt()); dm->m_date = query.value(10).toInt(); dm->SetZoom( query.value(11).toInt()); dm->m_isHidden = query.value(12).toInt(); dm->SetOrientation( query.value(13).toInt(), true); }
uint DBPerson::InsertCreditsDB(MSqlQuery &query, uint personid, uint chanid, const QDateTime &starttime) const { if (!personid) return 0; query.prepare( "REPLACE INTO credits " " ( person, chanid, starttime, role) " "VALUES (:PERSON, :CHANID, :STARTTIME, :ROLE) "); query.bindValue(":PERSON", personid); query.bindValue(":CHANID", chanid); query.bindValue(":STARTTIME", starttime); query.bindValue(":ROLE", GetRole()); if (query.exec()) return 1; MythDB::DBError("insert_credits", query); return 0; }
/** * \brief Try to get a lock on the table schemalock. * * To prevent upgrades by different programs of the same schema. * (<I>e.g.</I> when both mythbackend and mythfrontend start at the same time) */ bool DBUtil::lockSchema(MSqlQuery &query) { if (!query.exec("CREATE TABLE IF NOT EXISTS " "schemalock ( schemalock int(1));")) { LOG(VB_GENERAL, LOG_CRIT, QString("ERROR: Unable to create schemalock table: %1") .arg(MythDB::DBErrorMessage(query.lastError()))); return false; } if (!query.exec("LOCK TABLE schemalock WRITE;")) { LOG(VB_GENERAL, LOG_CRIT, QString("ERROR: Unable to acquire database upgrade lock") .arg(MythDB::DBErrorMessage(query.lastError()))); return false; } return true; }
bool DatabaseLogger::logqmsg(MSqlQuery &query, LoggingItem *item) { char timestamp[TIMESTAMP_MAX]; char *threadName = getThreadName(item); strftime( timestamp, TIMESTAMP_MAX-8, "%Y-%m-%d %H:%M:%S", (const struct tm *)&item->tm ); query.bindValue(":THREAD", threadName); query.bindValue(":MSGTIME", timestamp); query.bindValue(":LEVEL", item->level); query.bindValue(":MESSAGE", item->message); if (!query.exec()) { // Suppress Driver not loaded errors that occur at startup. // and suppress additional errors for one second after the // previous error (to avoid spamming the log). QSqlError err = query.lastError(); if ((err.type() != 1 || err.number() != -1) && (!m_errorLoggingTime.isValid() || (m_errorLoggingTime.elapsed() > 1000))) { MythDB::DBError("DBLogging", query); m_errorLoggingTime.start(); } return false; } deleteItem(item); return true; }
/// \brief Actually insert a log message from the queue into the database /// \param query The database insert query to use /// \param item LoggingItem containing the log message to insert bool DatabaseLogger::logqmsg(MSqlQuery &query, LoggingItem *item) { char timestamp[TIMESTAMP_MAX]; time_t epoch = item->epoch(); struct tm tm; localtime_r(&epoch, &tm); strftime(timestamp, TIMESTAMP_MAX-8, "%Y-%m-%d %H:%M:%S", (const struct tm *)&tm); query.bindValue(":TID", item->tid()); query.bindValue(":THREAD", item->threadName()); query.bindValue(":FILENAME", item->file()); query.bindValue(":LINE", item->line()); query.bindValue(":FUNCTION", item->function()); query.bindValue(":MSGTIME", timestamp); query.bindValue(":LEVEL", item->level()); query.bindValue(":MESSAGE", item->message()); query.bindValue(":APP", item->appName()); query.bindValue(":PID", item->pid()); if (!query.exec()) { // Suppress Driver not loaded errors that occur at startup. // and suppress additional errors for one second after the // previous error (to avoid spamming the log). QSqlError err = query.lastError(); if ((err.type() != 1 || err.number() != -1) && (!m_errorLoggingTime.isValid() || (m_errorLoggingTime.elapsed() > 1000))) { MythDB::DBError("DBLogging", query); m_errorLoggingTime.start(); } return false; } return true; }
/** \fn GalleryDatabaseHelper::LoadFileValues(MSqlQuery &, ImageMetadata *) * \brief Loads the file information from the database * \param query Information from the database * \param im Holds the loaded information * \return void */ void GalleryDatabaseHelper::LoadFileValues(MSqlQuery &query, ImageMetadata *im) { im->m_id = query.value(0).toInt(); im->m_fileName = query.value(1).toString(); im->m_name = query.value(2).toString(); im->m_path = query.value(3).toString(); im->m_parentId = query.value(4).toInt(); im->m_type = query.value(5).toInt(); im->m_modTime = query.value(6).toInt(); im->m_size = query.value(7).toInt(); im->m_extension = query.value(8).toString(); im->SetAngle( query.value(9).toInt()); im->m_date = query.value(10).toInt(); im->SetZoom( query.value(11).toInt()); im->m_isHidden = query.value(12).toInt(); im->SetOrientation( query.value(13).toInt(), true); LoadFileThumbnailValues(im); }
void DBUtil::unlockSchema(MSqlQuery &query) { // Should this _just_ unlock schemalock? if (!query.exec("UNLOCK TABLES;")) MythDB::DBError("unlockSchema -- unlocking tables", query); }
uint DBEvent::InsertDB(MSqlQuery &query, uint chanid) const { query.prepare( "REPLACE INTO program (" " chanid, title, subtitle, description, " " category, category_type, " " starttime, endtime, " " closecaptioned, stereo, hdtv, subtitled, " " subtitletypes, audioprop, videoprop, " " stars, partnumber, parttotal, " " syndicatedepisodenumber, " " airdate, originalairdate,listingsource, " " seriesid, programid, previouslyshown ) " "VALUES (" " :CHANID, :TITLE, :SUBTITLE, :DESCRIPTION, " " :CATEGORY, :CATTYPE, " " :STARTTIME, :ENDTIME, " " :CC, :STEREO, :HDTV, :HASSUBTITLES, " " :SUBTYPES, :AUDIOPROP, :VIDEOPROP, " " :STARS, :PARTNUMBER, :PARTTOTAL, " " :SYNDICATENO, " " :AIRDATE, :ORIGAIRDATE, :LSOURCE, " " :SERIESID, :PROGRAMID, :PREVSHOWN) "); QString cattype = myth_category_type_to_string(categoryType); query.bindValue(":CHANID", chanid); query.bindValue(":TITLE", title); query.bindValue(":SUBTITLE", subtitle); query.bindValue(":DESCRIPTION", description); query.bindValue(":CATEGORY", category); query.bindValue(":CATTYPE", cattype); query.bindValue(":STARTTIME", starttime); query.bindValue(":ENDTIME", endtime); query.bindValue(":CC", subtitleType & SUB_HARDHEAR ? true : false); query.bindValue(":STEREO", audioProps & AUD_STEREO ? true : false); query.bindValue(":HDTV", videoProps & VID_HDTV ? true : false); query.bindValue(":HASSUBTITLES",subtitleType & SUB_NORMAL ? true : false); query.bindValue(":SUBTYPES", subtitleType); query.bindValue(":AUDIOPROP", audioProps); query.bindValue(":VIDEOPROP", videoProps); query.bindValue(":STARS", stars); query.bindValue(":PARTNUMBER", partnumber); query.bindValue(":PARTTOTAL", parttotal); query.bindValue(":SYNDICATENO", syndicatedepisodenumber); query.bindValue(":AIRDATE", airdate ? QString::number(airdate):"0000"); query.bindValue(":ORIGAIRDATE", originalairdate); query.bindValue(":LSOURCE", listingsource); query.bindValue(":SERIESID", seriesId); query.bindValue(":PROGRAMID", programId); query.bindValue(":PREVSHOWN", previouslyshown); if (!query.exec()) { MythDB::DBError("InsertDB", query); return 0; } if (credits) { for (uint i = 0; i < credits->size(); i++) (*credits)[i].InsertDB(query, chanid, starttime); } return 1; }
uint ProgInfo::InsertDB(MSqlQuery &query, uint chanid) const { LOG(VB_XMLTV, LOG_INFO, QString("Inserting new program : %1 - %2 %3 %4") .arg(starttime.toString(Qt::ISODate)) .arg(endtime.toString(Qt::ISODate)) .arg(channel) .arg(title)); query.prepare( "REPLACE INTO program (" " chanid, title, subtitle, description, " " category, category_type, " " starttime, endtime, " " closecaptioned, stereo, hdtv, subtitled, " " subtitletypes, audioprop, videoprop, " " partnumber, parttotal, " " syndicatedepisodenumber, " " airdate, originalairdate,listingsource, " " seriesid, programid, previouslyshown, " " stars, showtype, title_pronounce, colorcode ) " "VALUES(" " :CHANID, :TITLE, :SUBTITLE, :DESCRIPTION, " " :CATEGORY, :CATTYPE, " " :STARTTIME, :ENDTIME, " " :CC, :STEREO, :HDTV, :HASSUBTITLES, " " :SUBTYPES, :AUDIOPROP, :VIDEOPROP, " " :PARTNUMBER, :PARTTOTAL, " " :SYNDICATENO, " " :AIRDATE, :ORIGAIRDATE, :LSOURCE, " " :SERIESID, :PROGRAMID, :PREVSHOWN, " " :STARS, :SHOWTYPE, :TITLEPRON, :COLORCODE)"); QString cattype = myth_category_type_to_string(categoryType); query.bindValue(":CHANID", chanid); query.bindValue(":TITLE", title); query.bindValue(":SUBTITLE", subtitle); query.bindValue(":DESCRIPTION", description); query.bindValue(":CATEGORY", category); query.bindValue(":CATTYPE", cattype); query.bindValue(":STARTTIME", starttime); query.bindValue(":ENDTIME", endtime); query.bindValue(":CC", subtitleType & SUB_HARDHEAR ? true : false); query.bindValue(":STEREO", audioProps & AUD_STEREO ? true : false); query.bindValue(":HDTV", videoProps & VID_HDTV ? true : false); query.bindValue(":HASSUBTITLES", subtitleType & SUB_NORMAL ? true : false); query.bindValue(":SUBTYPES", subtitleType); query.bindValue(":AUDIOPROP", audioProps); query.bindValue(":VIDEOPROP", videoProps); query.bindValue(":PARTNUMBER", partnumber); query.bindValue(":PARTTOTAL", parttotal); query.bindValue(":SYNDICATENO", syndicatedepisodenumber); query.bindValue(":AIRDATE", airdate ? QString::number(airdate):"0000"); query.bindValue(":ORIGAIRDATE", originalairdate); query.bindValue(":LSOURCE", listingsource); query.bindValue(":SERIESID", seriesId); query.bindValue(":PROGRAMID", programId); query.bindValue(":PREVSHOWN", previouslyshown); query.bindValue(":STARS", stars); query.bindValue(":SHOWTYPE", showtype); query.bindValue(":TITLEPRON", title_pronounce); query.bindValue(":COLORCODE", colorcode); if (!query.exec()) { MythDB::DBError("program insert", query); return 0; } QList<EventRating>::const_iterator j = ratings.begin(); for (; j != ratings.end(); ++j) { query.prepare( "INSERT INTO programrating " " ( chanid, starttime, system, rating) " "VALUES (:CHANID, :START, :SYS, :RATING)"); query.bindValue(":CHANID", chanid); query.bindValue(":START", starttime); query.bindValue(":SYS", (*j).system); query.bindValue(":RATING", (*j).rating); if (!query.exec()) MythDB::DBError("programrating insert", query); } if (credits) { for (uint i = 0; i < credits->size(); ++i) (*credits)[i].InsertDB(query, chanid, starttime); } return 1; }
void UPnpCDSTv::AddItem( const UPnpCDSRequest *pRequest, const QString &sObjectId, UPnpCDSExtensionResults *pResults, bool bAddRef, MSqlQuery &query ) { int nChanid = query.value( 0).toInt(); QDateTime dtStartTime = query.value( 1).toDateTime(); QDateTime dtEndTime = query.value( 2).toDateTime(); QString sTitle = query.value( 3).toString(); QString sSubtitle = query.value( 4).toString(); QString sDescription = query.value( 5).toString(); QString sCategory = query.value( 6).toString(); QString sHostName = query.value( 7).toString(); QString sRecGroup = query.value( 8).toString(); uint64_t nFileSize = query.value( 9).toULongLong(); QString sBaseName = query.value(10).toString(); QDateTime dtProgStart = query.value(11).toDateTime(); QDateTime dtProgEnd = query.value(12).toDateTime(); QString sStorageGrp = query.value(13).toString(); // ---------------------------------------------------------------------- // Cache Host ip Address & Port // ---------------------------------------------------------------------- if (!m_mapBackendIp.contains( sHostName )) m_mapBackendIp[ sHostName ] = gCoreContext->GetSettingOnHost( "BackendServerIp", sHostName); if (!m_mapBackendPort.contains( sHostName )) m_mapBackendPort[ sHostName ] = gCoreContext->GetSettingOnHost("BackendStatusPort", sHostName); // ---------------------------------------------------------------------- // Build Support Strings // ---------------------------------------------------------------------- QString sName = sTitle + ": " + (sSubtitle.isEmpty() ? sDescription : sSubtitle); QString sURIBase = QString( "http://%1:%2/Myth/" ) .arg( m_mapBackendIp [ sHostName ] ) .arg( m_mapBackendPort[ sHostName ] ); QString sURIParams = QString( "?ChanId=%1&StartTime=%2" ) .arg( nChanid ) .arg( dtStartTime.toString(Qt::ISODate)); QString sId = QString( "RecTv/0/item%1") .arg( sURIParams ); CDSObject *pItem = CDSObject::CreateVideoItem( sId, sName, sObjectId ); pItem->m_bRestricted = false; pItem->m_bSearchable = true; pItem->m_sWriteStatus = "WRITABLE"; if ( bAddRef ) { QString sRefId = QString( "%1/0/item%2") .arg( m_sExtensionId ) .arg( sURIParams ); pItem->SetPropValue( "refID", sRefId ); } pItem->SetPropValue( "genre" , sCategory ); pItem->SetPropValue( "longDescription", sDescription ); pItem->SetPropValue( "description" , sSubtitle ); //pItem->SetPropValue( "producer" , ); //pItem->SetPropValue( "rating" , ); //pItem->SetPropValue( "actor" , ); //pItem->SetPropValue( "director" , ); //pItem->SetPropValue( "publisher" , ); //pItem->SetPropValue( "language" , ); //pItem->SetPropValue( "relation" , ); //pItem->SetPropValue( "region" , ); // ---------------------------------------------------------------------- // Needed for Microsoft Media Player Compatibility // (Won't display correct Title without them) // ---------------------------------------------------------------------- pItem->SetPropValue( "creator" , "[Unknown Author]" ); pItem->SetPropValue( "artist" , "[Unknown Author]" ); pItem->SetPropValue( "album" , "[Unknown Series]" ); pItem->SetPropValue( "actor" , "[Unknown Author]" ); pItem->SetPropValue( "date" , dtStartTime.toString(Qt::ISODate)); pResults->Add( pItem ); // ---------------------------------------------------------------------- // Add Video Resource Element based on File contents/extension (HTTP) // ---------------------------------------------------------------------- StorageGroup sg(sStorageGrp, sHostName); QString sFilePath = sg.FindRecordingFile(sBaseName); QString sMimeType; if ( QFile::exists(sFilePath) ) sMimeType = HTTPRequest::TestMimeType( sFilePath ); else sMimeType = HTTPRequest::TestMimeType( sBaseName ); // If we are dealing with Window Media Player 12 (i.e. Windows 7) // then fake the Mime type to place the recorded TV in the // recorded TV section. if (pRequest->m_eClient == CDS_ClientWMP && pRequest->m_nClientVersion >= 12.0) { sMimeType = "video/x-ms-dvr"; } // DLNA string below is temp fix for ps3 seeking. QString sProtocol = QString( "http-get:*:%1:DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000" ).arg( sMimeType ); QString sURI = QString( "%1GetRecording%2").arg( sURIBase ) .arg( sURIParams ); Resource *pRes = pItem->AddResource( sProtocol, sURI ); uint uiStart = dtProgStart.toTime_t(); uint uiEnd = dtProgEnd.toTime_t(); uint uiDur = uiEnd - uiStart; QString sDur; sDur.sprintf("%02d:%02d:%02d", (uiDur / 3600) % 24, (uiDur / 60) % 60, uiDur % 60); pRes->AddAttribute( "duration" , sDur ); pRes->AddAttribute( "size" , QString::number( nFileSize) ); /* // ---------------------------------------------------------------------- // Add Video Resource Element based on File extension (mythtv) // ---------------------------------------------------------------------- sProtocol = QString( "myth:*:%1:*" ).arg( sMimeType ); sURI = QString( "myth://%1/%2" ) .arg( m_mapBackendIp [ sHostName ] ) .arg( sBaseName ); pRes = pItem->AddResource( sProtocol, sURI ); pRes->AddAttribute( "duration" , sDur ); pRes->AddAttribute( "size" , QString::number( nFileSize) ); */ // ---------------------------------------------------------------------- // Add Preview URI as albumArt // ---------------------------------------------------------------------- sURI = QString( "%1GetPreviewImage%2%3").arg( sURIBase ) .arg( sURIParams ) .arg( "&Width=160" ); pItem->SetPropValue( "albumArtURI", sURI ); Property *pProp = pItem->GetProperty("albumArtURI"); if (pProp) { pProp->AddAttribute("dlna:profileID", "PNG_TN"); pProp->AddAttribute("xmlns:dlna", "urn:schemas-dlna-org:metadata-1-0"); } }
void IconData::ImportIconMap(const QString &filename) { VERBOSE(VB_GENERAL, LOC + QString("Importing icon mapping from %1...").arg(filename)); QFile xml_file; if (dash_open(xml_file, filename, QIODevice::ReadOnly)) { QDomDocument doc; QString de_msg; int de_ln = 0; int de_column = 0; if (doc.setContent(&xml_file, false, &de_msg, &de_ln, &de_column)) { MSqlQuery nm_query(MSqlQuery::InitCon()); nm_query.prepare("REPLACE INTO networkiconmap(network, url) " "VALUES(:NETWORK, :URL)"); MSqlQuery cm_query(MSqlQuery::InitCon()); cm_query.prepare("REPLACE INTO callsignnetworkmap(callsign, " "network) VALUES(:CALLSIGN, :NETWORK)"); MSqlQuery su_query(MSqlQuery::InitCon()); su_query.prepare("UPDATE settings SET data = :URL " "WHERE value = :STUBNAME"); MSqlQuery si_query(MSqlQuery::InitCon()); si_query.prepare("INSERT INTO settings(value, data) " "VALUES(:STUBNAME, :URL)"); QDomElement element = doc.documentElement(); QDomNode node = element.firstChild(); while (!node.isNull()) { try { QDomElement e = nodeToElement(node); if (e.tagName() == IM_NET_TO_URL_TAG) { QString net = getNamedElementText(e, IM_NET_TAG); QString u = getNamedElementText(e, IM_NET_URL_TAG); nm_query.bindValue(":NETWORK", net.trimmed()); nm_query.bindValue(":URL", u.trimmed()); if (!nm_query.exec()) MythDB::DBError( "Inserting network->url mapping", nm_query); } else if (e.tagName() == IM_CS_TO_NET_TAG) { QString cs = getNamedElementText(e, IM_CS_TAG); QString net = getNamedElementText(e, IM_NET_TAG); cm_query.bindValue(":CALLSIGN", cs.trimmed()); cm_query.bindValue(":NETWORK", net.trimmed()); if (!cm_query.exec()) MythDB::DBError("Inserting callsign->network " "mapping", cm_query); } else if (e.tagName() == IM_BASEURL_TAG) { MSqlQuery *qr = &si_query; QString st(BASEURLMAP_START); st += getNamedElementText(e, IM_BASE_STUB_TAG); QString u = getNamedElementText(e, IM_NET_URL_TAG); MSqlQuery qc(MSqlQuery::InitCon()); qc.prepare("SELECT COUNT(*) FROM settings " "WHERE value = :STUBNAME"); qc.bindValue(":STUBNAME", st); if (qc.exec() && qc.next()) { if (qc.value(0).toInt() != 0) { qr = &su_query; } } qr->bindValue(":STUBNAME", st); qr->bindValue(":URL", u); if (!qr->exec()) MythDB::DBError( "Inserting callsign->network mapping", *qr); } } catch (DOMException &e) { VERBOSE(VB_IMPORTANT, LOC_ERR + QString("while processing %1: %2") .arg(node.nodeName()).arg(e.getMessage())); } node = node.nextSibling(); } } else { VERBOSE(VB_IMPORTANT, LOC_ERR + QString("unable to set document content: %1:%2c%3 %4") .arg(filename).arg(de_ln).arg(de_column).arg(de_msg)); } } else { VERBOSE(VB_IMPORTANT, LOC_ERR + QString("unable to open '%1' for reading.").arg(filename)); } }
/// Sets metadata from a DB row void VideoMetadataImp::fromDBRow(MSqlQuery &query) { m_title = query.value(0).toString(); m_director = query.value(1).toString(); m_studio = query.value(2).toString(); m_plot = query.value(3).toString(); m_rating = query.value(4).toString(); m_year = query.value(5).toInt(); m_releasedate = query.value(6).toDate(); m_userrating = (float)query.value(7).toDouble(); if (isnan(m_userrating) || m_userrating < 0) m_userrating = 0.0; if (m_userrating > 10.0) m_userrating = 10.0; m_length = query.value(8).toInt(); m_filename = query.value(9).toString(); m_hash = query.value(10).toString(); m_showlevel = ParentalLevel(query.value(11).toInt()).GetLevel(); m_coverfile = query.value(12).toString(); m_inetref = query.value(13).toString(); m_homepage = query.value(14).toString(); m_childID = query.value(15).toUInt(); m_browse = query.value(16).toBool(); m_watched = query.value(17).toBool(); m_playcommand = query.value(18).toString(); m_categoryID = query.value(19).toInt(); m_id = query.value(20).toInt(); m_trailer = query.value(21).toString(); m_screenshot = query.value(22).toString(); m_banner = query.value(23).toString(); m_fanart = query.value(24).toString(); m_subtitle = query.value(25).toString(); m_tagline = query.value(26).toString(); m_season = query.value(27).toInt(); m_episode = query.value(28).toInt(); m_host = query.value(29).toString(); m_insertdate = query.value(30).toDate(); m_processed = query.value(31).toBool(); VideoCategory::GetCategory().get(m_categoryID, m_category); // Genres fillGenres(); //Countries fillCountries(); // Cast fillCast(); }
/** \brief Try to get a lock on the table schemalock. * Prevents multiple upgrades by different programs of the same schema. */ bool DBUtil::TryLockSchema(MSqlQuery &query, uint timeout_secs) { query.prepare("SELECT GET_LOCK('schemaLock', :TIMEOUT)"); query.bindValue(":TIMEOUT", timeout_secs); return query.exec() && query.first() && query.value(0).toBool(); }