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@…>, 10 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