|
MythTV
0.26-pre
|
00001 // POSIX headers 00002 #include <stdint.h> 00003 00004 // Qt headers 00005 #include <QString> 00006 00007 // MythTV headers 00008 #include "mythdb.h" 00009 #include "scaninfo.h" 00010 #include "mythdbcon.h" 00011 #include "mythlogging.h" 00012 00013 ScanInfo::ScanInfo() : scanid(0), cardid(0), sourceid(0), processed(false) { } 00014 00015 ScanInfo::ScanInfo(uint _scanid, uint _cardid, uint _sourceid, 00016 bool _processed, const QDateTime &_scandate) : 00017 scanid(_scanid), cardid(_cardid), sourceid(_sourceid), 00018 processed(_processed), scandate(_scandate) 00019 { 00020 } 00021 00022 uint SaveScan(const ScanDTVTransportList &scan) 00023 { 00024 LOG(VB_CHANSCAN, LOG_INFO, QString("SaveScan() scan.size(): %1") 00025 .arg(scan.size())); 00026 00027 uint scanid = 0; 00028 if (scan.empty() || scan[0].channels.empty()) 00029 return scanid; 00030 00031 uint sourceid = scan[0].channels[0].source_id; 00032 uint cardid = scan[0].cardid; 00033 00034 // Delete very old scans 00035 const vector<ScanInfo> list = LoadScanList(); 00036 for (uint i = 0; i < list.size(); i++) 00037 { 00038 if (list[i].scandate > QDateTime::currentDateTime().addDays(-14)) 00039 continue; 00040 if ((list[i].cardid == cardid) && (list[i].sourceid == sourceid)) 00041 ScanInfo::DeleteScan(list[i].scanid); 00042 } 00043 00044 MSqlQuery query(MSqlQuery::InitCon()); 00045 query.prepare( 00046 "INSERT INTO channelscan ( cardid, sourceid, scandate) " 00047 "VALUES (:CARDID, :SOURCEID, :SCANDATE) "); 00048 query.bindValue(":CARDID", cardid); 00049 query.bindValue(":SOURCEID", sourceid); 00050 query.bindValue(":SCANDATE", QDateTime::currentDateTime()); 00051 00052 if (!query.exec()) 00053 { 00054 MythDB::DBError("SaveScan 1", query); 00055 return scanid; 00056 } 00057 00058 query.prepare("SELECT MAX(scanid) FROM channelscan"); 00059 if (!query.exec()) 00060 MythDB::DBError("SaveScan 2", query); 00061 else if (query.next()) 00062 scanid = query.value(0).toUInt(); 00063 00064 if (!scanid) 00065 return scanid; 00066 00067 for (uint i = 0; i < scan.size(); i++) 00068 scan[i].SaveScan(scanid); 00069 00070 return scanid; 00071 } 00072 00073 ScanDTVTransportList LoadScan(uint scanid) 00074 { 00075 ScanDTVTransportList list; 00076 MSqlQuery query(MSqlQuery::InitCon()); 00077 MSqlQuery query2(MSqlQuery::InitCon()); 00078 query.prepare( 00079 "SELECT frequency, inversion, symbolrate, " 00080 " fec, polarity, " 00081 " hp_code_rate, lp_code_rate, modulation, " 00082 " transmission_mode, guard_interval, hierarchy, " 00083 " modulation, bandwidth, sistandard, " 00084 " tuner_type, transportid, mod_sys, " 00085 " rolloff " 00086 "FROM channelscan_dtv_multiplex " 00087 "WHERE scanid = :SCANID"); 00088 query.bindValue(":SCANID", scanid); 00089 if (!query.exec()) 00090 { 00091 MythDB::DBError("LoadScan 1", query); 00092 return list; 00093 } 00094 00095 while (query.next()) 00096 { 00097 ScanDTVTransport mux; 00098 mux.ParseTuningParams( 00099 (DTVTunerType) query.value(14).toUInt(), 00100 query.value(0).toString(), query.value(1).toString(), 00101 query.value(2).toString(), query.value(3).toString(), 00102 query.value(4).toString(), query.value(5).toString(), 00103 query.value(6).toString(), query.value(7).toString(), 00104 query.value(8).toString(), query.value(9).toString(), 00105 query.value(10).toString(), query.value(11).toString(), 00106 query.value(12).toString(), query.value(13).toString(), 00107 query.value(14).toString()); 00108 00109 query2.prepare( 00110 "SELECT " 00111 " mplex_id, source_id, channel_id, " 00112 " callsign, service_name, chan_num, " 00113 " service_id, atsc_major_channel, atsc_minor_channel, " 00114 " use_on_air_guide, hidden, hidden_in_guide, " 00115 " freqid, icon, tvformat, " 00116 " xmltvid, pat_tsid, vct_tsid, " 00117 " vct_chan_tsid, sdt_tsid, orig_netid, " 00118 " netid, si_standard, in_channels_conf, " 00119 " in_pat, in_pmt, in_vct, " 00120 " in_nit, in_sdt, is_encrypted, " 00121 " is_data_service, is_audio_service, is_opencable, " 00122 " could_be_opencable, decryption_status, default_authority " 00123 "FROM channelscan_channel " 00124 "WHERE transportid = :TRANSPORTID"); 00125 query2.bindValue(":TRANSPORTID", query.value(15).toUInt()); 00126 00127 if (!query2.exec()) 00128 { 00129 MythDB::DBError("LoadScan 2", query2); 00130 continue; 00131 } 00132 00133 while (query2.next()) 00134 { 00135 QString si_standard = query2.value(22).toString(); 00136 si_standard = (si_standard.isEmpty()) ? 00137 query.value(13).toString() : si_standard; 00138 00139 ChannelInsertInfo chan( 00140 query2.value(0).toUInt()/*mplex_id*/, 00141 query2.value(1).toUInt()/*source_id*/, 00142 query2.value(2).toUInt()/*channel_id*/, 00143 query2.value(3).toString()/*callsign*/, 00144 query2.value(4).toString()/*service_name*/, 00145 query2.value(5).toString()/*chan_num*/, 00146 query2.value(6).toUInt()/*service_id*/, 00147 00148 query2.value(7).toUInt()/*atsc_major_channel*/, 00149 query2.value(8).toUInt()/*atsc_minor_channel*/, 00150 query2.value(9).toBool()/*use_on_air_guide*/, 00151 query2.value(10).toBool()/*hidden*/, 00152 query2.value(11).toBool()/*hidden_in_guide*/, 00153 00154 query2.value(12).toString()/*freqid*/, 00155 query2.value(13).toString()/*icon*/, 00156 query2.value(14).toString()/*tvformat*/, 00157 query2.value(15).toString()/*xmltvid*/, 00158 00159 query2.value(16).toUInt()/*pat_tsid*/, 00160 query2.value(17).toUInt()/*vct_tsid*/, 00161 query2.value(18).toUInt()/*vct_chan_tsid*/, 00162 query2.value(19).toUInt()/*sdt_tsid*/, 00163 00164 query2.value(20).toUInt()/*orig_netid*/, 00165 query2.value(21).toUInt()/*netid*/, 00166 00167 si_standard, 00168 00169 query2.value(23).toBool()/*in_channels_conf*/, 00170 query2.value(24).toBool()/*in_pat*/, 00171 query2.value(25).toBool()/*in_pmt*/, 00172 query2.value(26).toBool()/*in_vct*/, 00173 query2.value(27).toBool()/*in_nit*/, 00174 query2.value(28).toBool()/*in_sdt*/, 00175 00176 query2.value(29).toBool()/*is_encrypted*/, 00177 query2.value(30).toBool()/*is_data_service*/, 00178 query2.value(31).toBool()/*is_audio_service*/, 00179 query2.value(32).toBool()/*is_opencable*/, 00180 query2.value(33).toBool()/*could_be_opencable*/, 00181 query2.value(34).toInt()/*decryption_status*/, 00182 query2.value(35).toString()/*default_authority*/); 00183 00184 mux.channels.push_back(chan); 00185 } 00186 00187 list.push_back(mux); 00188 } 00189 00190 return list; 00191 } 00192 00193 bool ScanInfo::MarkProcessed(uint scanid) 00194 { 00195 MSqlQuery query(MSqlQuery::InitCon()); 00196 query.prepare( 00197 "UPDATE channelscan " 00198 "SET processed = 1 " 00199 "WHERE scanid = :SCANID"); 00200 query.bindValue(":SCANID", scanid); 00201 00202 if (!query.exec()) 00203 { 00204 MythDB::DBError("MarkProcessed", query); 00205 return false; 00206 } 00207 00208 return true; 00209 } 00210 00211 bool ScanInfo::DeleteScan(uint scanid) 00212 { 00213 MSqlQuery query(MSqlQuery::InitCon()); 00214 query.prepare( 00215 "DELETE FROM channelscan_channel " 00216 "WHERE scanid = :SCANID"); 00217 query.bindValue(":SCANID", scanid); 00218 00219 if (!query.exec()) 00220 { 00221 MythDB::DBError("DeleteScan", query); 00222 return false; 00223 } 00224 00225 query.prepare( 00226 "DELETE FROM channelscan_dtv_multiplex " 00227 "WHERE scanid = :SCANID"); 00228 query.bindValue(":SCANID", scanid); 00229 00230 if (!query.exec()) 00231 { 00232 MythDB::DBError("DeleteScan", query); 00233 return false; 00234 } 00235 00236 query.prepare( 00237 "DELETE FROM channelscan " 00238 "WHERE scanid = :SCANID"); 00239 query.bindValue(":SCANID", scanid); 00240 00241 if (!query.exec()) 00242 { 00243 MythDB::DBError("DeleteScan", query); 00244 return false; 00245 } 00246 00247 return true; 00248 } 00249 00250 vector<ScanInfo> LoadScanList(void) 00251 { 00252 vector<ScanInfo> list; 00253 00254 MSqlQuery query(MSqlQuery::InitCon()); 00255 query.prepare( 00256 "SELECT scanid, cardid, sourceid, processed, scandate " 00257 "FROM channelscan " 00258 "ORDER BY scanid, sourceid, cardid, scandate"); 00259 00260 if (!query.exec()) 00261 { 00262 MythDB::DBError("LoadScanList", query); 00263 return list; 00264 } 00265 00266 while (query.next()) 00267 { 00268 list.push_back( 00269 ScanInfo(query.value(0).toUInt(), 00270 query.value(1).toUInt(), 00271 query.value(2).toUInt(), 00272 (bool) query.value(3).toUInt(), 00273 query.value(4).toDateTime())); 00274 } 00275 00276 return list; 00277 }
1.7.6.1