Ticket #12167: mythtv_poc_improve_caching_of_host_settings_v2.patch

File mythtv_poc_improve_caching_of_host_settings_v2.patch, 8.2 KB (added by Rune Petersen <rune@…>, 10 years ago)
  • mythtv/libs/libmyth/mythcontext.cpp

    diff --git a/mythtv/libs/libmyth/mythcontext.cpp b/mythtv/libs/libmyth/mythcontext.cpp
    index b3dbf24..75b8271 100644
    a b bool MythContext::Init(const bool gui, 
    11781178        return false;
    11791179    }
    11801180
     1181    gCoreContext->ActivateSettingsCache(true);
     1182
    11811183    if (!d->Init(gui, promptForBackend, disableAutoDiscovery, ignoreDB))
    11821184    {
    11831185        return false;
    11841186    }
    11851187
    1186     gCoreContext->ActivateSettingsCache(true);
    1187 
    11881188    return true;
    11891189}
    11901190
  • mythtv/libs/libmyth/settings.h

    diff --git a/mythtv/libs/libmyth/settings.h b/mythtv/libs/libmyth/settings.h
    index 04bf691..d76a535 100644
    a b class MPUBLIC TransListBoxSetting : 
    673673
    674674///////////////////////////////////////////////////////////////////////////////
    675675
    676 class MPUBLIC HostSlider : public SliderSetting, public HostDBStorage
     676class MPUBLIC HostSlider : public SliderSetting, public HostSettingStorage
    677677{
    678678    Q_OBJECT
    679679  public:
    680680    HostSlider(const QString &name, int min, int max, int step) :
    681681        SliderSetting(this, min, max, step),
    682         HostDBStorage(this, name) { }
     682        HostSettingStorage(this, name) { }
    683683};
    684684
    685 class MPUBLIC HostSpinBox: public SpinBoxSetting, public HostDBStorage
     685class MPUBLIC HostSpinBox: public SpinBoxSetting, public HostSettingStorage
    686686{
    687687    Q_OBJECT
    688688  public:
    689689    HostSpinBox(const QString &name, int min, int max, int step,
    690690                bool allow_single_step = false) :
    691691        SpinBoxSetting(this, min, max, step, allow_single_step),
    692         HostDBStorage(this, name) { }
     692        HostSettingStorage(this, name) { }
    693693};
    694694
    695 class MPUBLIC HostCheckBox : public CheckBoxSetting, public HostDBStorage
     695class MPUBLIC HostCheckBox : public CheckBoxSetting, public HostSettingStorage
    696696{
    697697    Q_OBJECT
    698698  public:
    699699    HostCheckBox(const QString &name) :
    700         CheckBoxSetting(this), HostDBStorage(this, name) { }
     700        CheckBoxSetting(this), HostSettingStorage(this, name) { }
    701701    virtual ~HostCheckBox() { ; }
    702702};
    703703
    704 class MPUBLIC HostComboBox : public ComboBoxSetting, public HostDBStorage
     704class MPUBLIC HostComboBox : public ComboBoxSetting, public HostSettingStorage
    705705{
    706706    Q_OBJECT
    707707  public:
    708708    HostComboBox(const QString &name, bool rw = false) :
    709         ComboBoxSetting(this, rw), HostDBStorage(this, name) { }
     709        ComboBoxSetting(this, rw), HostSettingStorage(this, name) { }
    710710    virtual ~HostComboBox() { ; }
    711711};
    712712
    class MPUBLIC HostRefreshRateComboBox : public HostComboBox 
    725725    static const vector<double> GetRefreshRates(const QString &resolution);
    726726};
    727727
    728 class MPUBLIC HostTimeBox : public ComboBoxSetting, public HostDBStorage
     728class MPUBLIC HostTimeBox : public ComboBoxSetting, public HostSettingStorage
    729729{
    730730    Q_OBJECT
    731731  public:
    732732    HostTimeBox(const QString &name, const QString &defaultTime = "00:00",
    733733                const int interval = 1) :
    734734        ComboBoxSetting(this, false, 30 / interval),
    735         HostDBStorage(this, name)
     735        HostSettingStorage(this, name)
    736736    {
    737737        int hour;
    738738        int minute;
    class MPUBLIC HostTimeBox : public ComboBoxSetting, public HostDBStorage 
    750750    }
    751751};
    752752
    753 class MPUBLIC HostLineEdit: public LineEditSetting, public HostDBStorage
     753class MPUBLIC HostLineEdit: public LineEditSetting, public HostSettingStorage
    754754{
    755755    Q_OBJECT
    756756  public:
    757757    HostLineEdit(const QString &name, bool rw = true) :
    758         LineEditSetting(this, rw), HostDBStorage(this, name) { }
     758        LineEditSetting(this, rw), HostSettingStorage(this, name) { }
    759759};
    760760
    761761///////////////////////////////////////////////////////////////////////////////
  • mythtv/libs/libmythbase/mythdb.cpp

    diff --git a/mythtv/libs/libmythbase/mythdb.cpp b/mythtv/libs/libmythbase/mythdb.cpp
    index e60fce0..a857321 100644
    a b QString MythDB::GetSetting(const QString &_key, const QString &defaultval) 
    376376            d->settingsCacheLock.unlock();
    377377            return value;
    378378        }
     379        d->settingsCacheLock.unlock();
     380        return defaultval;
    379381    }
    380382    SettingsMap::const_iterator it = d->overriddenSettings.find(key);
    381383    if (it != d->overriddenSettings.end())
    QString MythDB::GetSettingOnHost(const QString &_key, const QString &_host, 
    609611            d->settingsCacheLock.unlock();
    610612            return value;
    611613        }
     614        d->settingsCacheLock.unlock();
     615        return defaultval;
    612616    }
    613617    SettingsMap::const_iterator it = d->overriddenSettings.find(myKey);
    614618    if (it != d->overriddenSettings.end())
    void MythDB::ClearSettingsCache(const QString &_key) 
    855859            d->settingsCache[it.key()] = *it;
    856860            d->settingsCache[mk2] = *it;
    857861        }
     862
     863        if (!d->useSettingsCache || d->ignoreDatabase || !HaveValidDatabase())
     864        {
     865            d->settingsCacheLock.unlock();
     866            return;
     867        }
     868
     869        MSqlQuery query(MSqlQuery::InitCon());
     870        if (!query.isConnected())
     871        {
     872            d->settingsCacheLock.unlock();
     873            return;
     874        }
     875
     876        query.prepare(
     877            "SELECT value, data "
     878            "FROM settings "
     879            "WHERE hostname = :HOSTNAME");
     880        query.bindValue(":HOSTNAME", d->m_localhostname);
     881
     882        QString value;
     883        QString data;
     884        if (query.exec())
     885            while (query.next())
     886            {
     887                value = query.value(0).toString();
     888                data = query.value(1).toString();
     889
     890                QString &cacheValue = d->settingsCache[value.toLower()];
     891                if( cacheValue.isEmpty() )
     892                {
     893                    cacheValue = data;
     894                }
     895            }
     896
     897        if (!query.isConnected())
     898        {
     899            d->settingsCacheLock.unlock();
     900            return;
     901        }
     902
     903        query.prepare(
     904            "SELECT value, data "
     905            "FROM settings "
     906            "WHERE hostname IS NULL");
     907
     908        if (query.exec())
     909            while (query.next())
     910            {
     911                value = query.value(0).toString();
     912                data = query.value(1).toString();
     913
     914                QString &cacheValue = d->settingsCache[value.toLower()];
     915                if( cacheValue.isEmpty() )
     916                {
     917                    cacheValue = data;
     918                }
     919            }
    858920    }
    859921    else
    860922    {
  • mythtv/libs/libmythbase/mythstorage.cpp

    diff --git a/mythtv/libs/libmythbase/mythstorage.cpp b/mythtv/libs/libmythbase/mythstorage.cpp
    index d53e8f7..048d36f 100644
    a b QString GlobalDBStorage::GetSetClause(MSqlBindings &bindings) const 
    196196
    197197    return clause;
    198198}
     199
     200void HostSettingStorage::Load(void)
     201{
     202    QString result = GetMythDB()->GetSetting(key, QString());
     203    if (!result.isNull())
     204    {
     205        initval = result;
     206        user->SetDBValue(result);
     207    }
     208}
     209
     210void HostSettingStorage::Save(QString _table)
     211{
     212    // not implementable, and not needed for settings
     213}
     214
     215void HostSettingStorage::Save(void)
     216{
     217    if (!IsSaveRequired())
     218        return;
     219
     220    GetMythDB()->SaveSetting(key, user->GetDBValue());
     221}
     222
     223bool HostSettingStorage::IsSaveRequired(void) const
     224{
     225    return user->GetDBValue() != initval;
     226}
     227
     228void HostSettingStorage::SetSaveRequired(void)
     229{
     230    initval.clear();
     231}
  • mythtv/libs/libmythbase/mythstorage.h

    diff --git a/mythtv/libs/libmythbase/mythstorage.h b/mythtv/libs/libmythbase/mythstorage.h
    index 120ebc5..db0aa70 100644
    a b class MBASE_PUBLIC GlobalDBStorage : public SimpleDBStorage 
    129129    QString settingname;
    130130};
    131131
     132class MBASE_PUBLIC HostSettingStorage : public Storage
     133{
     134  public:
     135    HostSettingStorage(StorageUser *_user,
     136                    QString _key) : user(_user), key(_key)
     137        {}
     138    virtual ~HostSettingStorage() { }
     139
     140    virtual void Load(void);
     141    virtual void Save(void);
     142    virtual void Save(QString destination);
     143    virtual bool IsSaveRequired(void) const;
     144    virtual void SetSaveRequired(void);
     145
     146  protected:
     147    StorageUser *user;
     148    QString key;
     149    QString initval;
     150};
    132151///////////////////////////////////////////////////////////////////////////////
    133152
    134153#endif // MYTHSTORAGE_H