Ticket #7486: mythtv_fix_broken_providers_with_gui.diff

File mythtv_fix_broken_providers_with_gui.diff, 7.9 KB (added by Christian Güdel <cg@…>, 2 years ago)

Updated patch that will not destroy your database schema

  • libs/libmythtv/channelscan/channelscan_sm.cpp

     
    174174    { 
    175175        VERBOSE(VB_CHANSCAN, LOC + "Connecting up DTVSignalMonitor"); 
    176176        ScanStreamData *data = new ScanStreamData(); 
     177         
     178        MSqlQuery query(MSqlQuery::InitCon()); 
     179        query.prepare( 
     180                "SELECT dvb_nit_id " 
     181                "FROM videosource " 
     182                "WHERE videosource.sourceid = :SOURCEID"); 
     183        query.bindValue(":SOURCEID", _sourceID); 
     184        if (!query.exec() || !query.isActive()) 
     185        { 
     186            MythDB::DBError("ChannelScanSM", query); 
     187        } 
     188        else if (query.next()) 
     189        { 
     190            uint nitid = query.value(0).toInt();  
     191            data->SetRealNetworkID(nitid); 
     192            VERBOSE(VB_CHANSCAN, LOC + QString("Setting NIT-ID to %1").arg(nitid));  
     193        } 
    177194 
    178195        dtvSigMon->SetStreamData(data); 
    179196        dtvSigMon->AddFlags(SignalMonitor::kDTVSigMon_WaitForMGT | 
  • libs/libmythtv/dbcheck.cpp

     
    2020/// This is the DB schema version expected by the running MythTV instance. 
    2121const QString currentDatabaseVersion = "1244"; 
    2222 
     23static bool UpgradeDBSchemaInFixes(void); 
    2324static bool UpdateDBVersionNumber(const QString &newnumber); 
    2425static bool performActualUpdate( 
    2526    const char **updates, const char *version, QString &dbver); 
     
    469470    // There may be a race condition where another program (e.g. mythbackend) 
    470471    // is upgrading, so wait up to 5 seconds for a more accurate version: 
    471472    DBup->CompareAndWait(5); 
     473     
     474    if (!gContext->GetNumSetting("have-nit-fix", 0)) 
     475    { 
     476        UpgradeDBSchemaInFixes(); 
     477    } 
    472478 
    473     if (DBup->versionsBehind == 0)  // same schema 
     479    if (DBup->versionsBehind == 0 && 
     480        gContext->GetNumSetting("have-nit-fix", 0))  // same schema 
    474481    { 
    475482        gContext->ActivateSettingsCache(true); 
    476483        GetMythDB()->SetSuppressDBMessages(false); 
     
    49224929    return true; 
    49234930} 
    49244931 
     4932static bool UpgradeDBSchemaInFixes() 
     4933{ 
     4934    QString dbver = gContext->GetSetting("DBSchemaVer"); 
     4935 
     4936    if (!gContext->GetNumSetting("have-nit-fix", 0)) 
     4937    { 
     4938        const char *updates[] = { 
     4939"ALTER TABLE videosource ADD dvb_nit_id INT(6) DEFAULT -1;", 
     4940NULL 
     4941        }; 
     4942 
     4943        if (!performActualUpdate(updates, "1244", dbver)) 
     4944            return false; 
     4945  
     4946        gContext->SaveSetting("have-nit-fix", 1); 
     4947    } 
     4948 
     4949    return true; 
     4950} 
     4951 
    49254952/** 
    49264953 * command to get the the initial database layout from an empty database: 
    49274954 * 
  • libs/libmythtv/mpeg/dvbtables.cpp

     
    7979    return _cached_network_name; 
    8080} 
    8181 
     82bool NetworkInformationTable::Mutate(void) 
     83{ 
     84    if (VerifyCRC()) 
     85    { 
     86        SetTableID((TableID() == TableID::NITo) ? TableID::NIT : TableID::NITo); 
     87        SetCRC(CalcCRC()); 
     88        return true; 
     89    } 
     90    else 
     91        return false; 
     92} 
    8293 
    8394void ServiceDescriptionTable::Parse(void) const 
    8495{ 
  • libs/libmythtv/mpeg/dvbstreamdata.cpp

     
    234234    { 
    235235        case TableID::NIT: 
    236236        { 
     237            if (_dvb_real_network_id >= 0 && psip.TableIDExtension() != (uint)_dvb_real_network_id) 
     238            { 
     239                NetworkInformationTable *nit = new NetworkInformationTable(psip); 
     240                if (!nit->Mutate()) 
     241                { 
     242                    delete nit; 
     243                    return true; 
     244                } 
     245                bool retval = HandleTables(pid, *nit); 
     246                delete nit; 
     247                return retval; 
     248            } 
     249 
    237250            SetVersionNIT(psip.Version(), psip.LastSection()); 
    238251            SetNITSectionSeen(psip.Section()); 
    239252 
     
    291304        } 
    292305        case TableID::NITo: 
    293306        { 
     307            if (_dvb_real_network_id >= 0 && psip.TableIDExtension() == (uint)_dvb_real_network_id) 
     308            { 
     309                NetworkInformationTable *nit = new NetworkInformationTable(psip); 
     310                if (!nit->Mutate()) 
     311                { 
     312                    delete nit; 
     313                    return true; 
     314                } 
     315                bool retval = HandleTables(pid, *nit); 
     316                delete nit; 
     317                return retval; 
     318            } 
     319 
    294320            SetVersionNITo(psip.Version(), psip.LastSection()); 
    295321            SetNIToSectionSeen(psip.Section()); 
    296322            NetworkInformationTable nit(psip); 
  • libs/libmythtv/mpeg/dvbtables.h

     
    7979        { return _ptrs[i]+6; } 
    8080    // } 
    8181 
     82    /// mutates a NITo into a NITa (vice versa) and recalculates the CRC 
     83    bool Mutate(void); 
     84 
    8285    void Parse(void) const; 
    8386    QString toString(void) const; 
    8487    QString NetworkName(void) const; 
     
    154157    // } 
    155158    ServiceDescriptor *GetServiceDescriptor(uint i) const; 
    156159 
    157     /// mutates a SDTo into a SDTa and recalculates the CRC 
     160    /// mutates a SDTo into a SDTa (vice versa) and recalculates the CRC 
    158161    bool Mutate(void); 
    159162 
    160163    void Parse(void) const; 
  • libs/libmythtv/mpeg/dvbstreamdata.h

     
    4040    bool IsRedundant(uint pid, const PSIPTable&) const; 
    4141    void ProcessSDT(uint tsid, const ServiceDescriptionTable*); 
    4242 
     43    // NIT for broken providers 
     44    inline void SetRealNetworkID(int); 
     45 
    4346    // EIT info/processing 
    4447    inline void SetDishNetEIT(bool); 
    4548    inline bool HasAnyEIT(void) const; 
     
    212215    uint                      _desired_netid; 
    213216    uint                      _desired_tsid; 
    214217     
     218    // Real network ID for broken providers 
     219    int               _dvb_real_network_id; 
     220     
    215221    /// Decode DishNet's long-term DVB EIT 
    216222    bool                      _dvb_eit_dishnet_long; 
    217223    /// Tell us if the DVB service has EIT 
     
    251257    _dvb_eit_dishnet_long = use_dishnet_eit; 
    252258} 
    253259 
     260inline void DVBStreamData::SetRealNetworkID(int real_network_id) 
     261{ 
     262    QMutexLocker locker(&_listener_lock); 
     263    _dvb_real_network_id = real_network_id; 
     264} 
     265 
    254266inline bool DVBStreamData::HasAnyEIT(void) const 
    255267{ 
    256268    QMutexLocker locker(&_listener_lock); 
  • libs/libmythtv/videosource.cpp

     
    197197    }; 
    198198}; 
    199199 
     200class DVBNetID : public SpinBoxSetting, public VideoSourceDBStorage 
     201{ 
     202  public: 
     203    DVBNetID(const VideoSource &parent, uint value, signed int min_val) : 
     204        SpinBoxSetting(this, min_val, 100000, 1), 
     205        VideoSourceDBStorage(this, parent, "dvb_nit_id") 
     206    { 
     207        setLabel(QObject::tr("Network ID")); 
     208        setHelpText(QObject::tr("Set this to the actual network ID at your " 
     209                 "location, if you have a provider that broadcasts a broken " 
     210                 "NIT. Leave at -1 if everything works out of the box.")); 
     211    }; 
     212}; 
     213 
    200214FreqTableSelector::FreqTableSelector(const VideoSource &parent) : 
    201215    ComboBoxSetting(this), VideoSourceDBStorage(this, parent, "freqtable") 
    202216{ 
     
    749763    group->addChild(name = new Name(*this)); 
    750764    group->addChild(xmltv = new XMLTVConfig(*this)); 
    751765    group->addChild(new FreqTableSelector(*this)); 
     766    group->addChild(new DVBNetID(*this, -1, -1)); 
    752767    addChild(group); 
    753768} 
    754769