Go to the documentation of this file.
3 #include <QReadWriteLock>
101 LOG(VB_DATABASE, LOG_INFO,
"Destroying MythDBPrivate");
122 QMap<QString, QVariant>::const_iterator it = bindings.begin();
123 if (it == bindings.end())
127 QString str = QString(
"%1").arg(
"",
indent);
128 for (; it != bindings.end(); ++it)
130 QString val = (*it).toString();
135 else if (it->type() == QVariant::String)
137 val = (it->toString().isNull()) ?
138 "NULL" : QString(
"\"%1\"").arg(val);
140 const QString curBinding = it.key() +
'=' + val +
',';
141 if ((curColumn >
indent) &&
142 ((curBinding.length() + curColumn) > maxColumn))
145 str += QString(
"%1").arg(
"",
indent);
154 curColumn += curBinding.length();
156 str = str.left(str.length() - 1);
164 QString str = QString(
"DB Error (%1):\n").arg(where);
166 str +=
"Query was:\n";
171 str +=
"Bindings were:\n";
186 return "No error type from QSqlError? Strange...";
188 return QString(
"Driver error was [%1/%2]:\n"
190 "Database error was:\n"
193 .arg(err.nativeErrorCode())
194 .arg(err.driverText())
195 .arg(err.databaseText());
254 const QString &newValueRaw,
257 QString loc = QString(
"SaveSettingOnHost('%1') ").arg(key);
260 LOG(VB_GENERAL, LOG_ERR, loc +
"- Illegal null key");
264 QString newValue = (newValueRaw.isNull()) ?
"" : newValueRaw;
283 LOG(VB_GENERAL, LOG_ERR, loc +
"- No database yet");
292 bool success =
false;
300 query.
prepare(
"DELETE FROM settings WHERE value = :KEY "
301 "AND hostname = :HOSTNAME ;");
305 query.
prepare(
"DELETE FROM settings WHERE value = :KEY "
306 "AND hostname is NULL;");
328 query.
prepare(
"INSERT INTO settings (value,data,hostname) "
329 "VALUES ( :VALUE, :DATA, :HOSTNAME );");
334 "VALUES ( :VALUE, :DATA );");
351 LOG(VB_GENERAL, LOG_ERR, loc +
"- database not open");
371 QString key = _key.toLower();
372 QString value = defaultval;
404 "WHERE value = :KEY AND hostname = :HOSTNAME");
417 "WHERE value = :KEY AND hostname IS NULL");
443 QMap<QString,bool> done;
444 using KVIt = QMap<QString,QString>::iterator;
445 KVIt kvit = _key_value_pairs.begin();
446 for (; kvit != _key_value_pairs.end(); ++kvit)
447 done[kvit.key().toLower()] =
false;
449 QMap<QString,bool>::iterator dit = done.begin();
450 kvit = _key_value_pairs.begin();
457 for (; kvit != _key_value_pairs.end(); ++dit, ++kvit)
468 for (; kvit != _key_value_pairs.end(); ++dit, ++kvit)
470 SettingsMap::const_iterator it =
488 kvit = _key_value_pairs.begin();
491 QMap<QString,KVIt> keymap;
492 for (; kvit != _key_value_pairs.end(); ++dit, ++kvit)
497 const QString& key = dit.key();
498 if (!key.contains(
"'"))
500 keylist += QString(
"'%1',").arg(key);
510 if (keylist.isEmpty())
513 keylist = keylist.left(keylist.length() - 1);
518 "SELECT value, data, hostname "
520 "WHERE (hostname = '%1' OR hostname IS NULL) AND "
522 "ORDER BY hostname DESC")
532 QString key =
query.
value(0).toString().toLower();
533 QMap<QString,KVIt>::const_iterator it = keymap.constFind(key);
534 if (it != keymap.constEnd())
541 for (
auto it = keymap.cbegin(); it != keymap.cend(); ++it)
543 QString key = it.key();
544 QString value = **it;
564 QString val = QString::number(
static_cast<int>(defaultval));
567 return retval.toInt() > 0;
572 QString val = QString::number(defaultval);
575 return retval.toInt();
580 QString val = QString::number(defaultval);
583 return retval.toDouble();
590 return (retval == sentinel) ?
"" : retval;
597 if (retval == sentinel)
599 return retval.toInt() > 0;
606 return (retval == sentinel) ? 0 : retval.toInt();
613 return (retval == sentinel) ? 0.0 : retval.toDouble();
617 const QString &defaultval)
619 QString key = _key.toLower();
620 QString host = _host.toLower();
621 QString value = defaultval;
622 QString myKey = host +
' ' + key;
652 LOG(VB_GENERAL, LOG_ERR,
653 QString(
"Database not open while trying to "
654 "load setting: %1").
arg(key));
662 "WHERE value = :VALUE AND hostname = :HOSTNAME");
687 QString val = QString::number(defaultval);
690 return retval.toInt();
694 const QString &key,
const QString &host,
double defaultval)
696 QString val = QString::number(defaultval);
699 return retval.toDouble();
706 return (retval == sentinel) ?
"" : retval;
713 return (retval == sentinel) ? 0 : retval.toInt();
720 return (retval == sentinel) ? 0.0 : retval.toDouble();
724 int &width,
int &height,
725 double &forced_aspect,
726 double &refresh_rate,
732 QString sRes = QString(
"%1Resolution").arg(
type);
733 QString sRR = QString(
"%1RefreshRate").arg(
type);
734 QString sAspect = QString(
"%1ForceAspect").arg(
type);
735 QString sWidth = QString(
"%1Width").arg(
type);
736 QString sHeight = QString(
"%1Height").arg(
type);
739 sRes = QString(
"%1Resolution%2").arg(
type).arg(index);
740 sRR = QString(
"%1RefreshRate%2").arg(
type).arg(index);
741 sAspect = QString(
"%1ForceAspect%2").arg(
type).arg(index);
742 sWidth = QString(
"%1Width%2").arg(
type).arg(index);
743 sHeight = QString(
"%1Height%2").arg(
type).arg(index);
750 QStringList slist = res.split(QString(
"x"));
753 if (2 == slist.size())
755 w = slist[0].toInt(&ok0);
756 h = slist[1].toInt(&ok1);
786 double forced_aspect = 0;
787 double refresh_rate = 0.0;
799 const QString &key,
const QString &value)
801 QString mk = key.toLower();
804 if (
"dbschemaver" == mk)
806 LOG(VB_GENERAL, LOG_ERR,
807 QString(
"ERROR: Refusing to allow override for '%1'.").
arg(key));
824 QString mk = key.toLower();
848 SettingsMap::iterator it = cache.find(myKey);
849 if (it != cache.end())
851 SettingsMap::const_iterator oit = overrides.constFind(myKey);
852 if (oit == overrides.constEnd())
854 LOG(VB_DATABASE, LOG_INFO,
855 QString(
"Clearing Settings Cache for '%1'.").
arg(myKey));
860 LOG(VB_DATABASE, LOG_INFO,
861 QString(
"Clearing Cache of overridden '%1' ignored.")
873 LOG(VB_DATABASE, LOG_INFO,
"Clearing Settings Cache.");
889 QString myKey = _key.toLower();
893 QString mkl = myKey.section(QChar(
' '), 1);
904 LOG(VB_DATABASE, LOG_INFO,
"Enabling Settings Cache.");
906 LOG(VB_DATABASE, LOG_INFO,
"Disabling Settings Cache.");
bool GetBoolSetting(const QString &key, bool defaultval)
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
void WriteDelayedSettings(void)
bool HaveSchema(void) const
Get a flag indicating that we have discovered tables and that this therefore not a new empty database...
bool IsDatabaseIgnored(void) const
void IgnoreDatabase(bool bIgnore)
QString GetSettingOnHost(const QString &_key, const QString &_host, const QString &defaultval)
static QString DBErrorMessage(const QSqlError &err)
bool ClearSettingOnHost(const QString &key, const QString &host)
const char *const kClearSettingValue
Structure containing the basic Database parameters.
void ActivateSettingsCache(bool activate=true)
DB connection pool, used by MSqlQuery. Do not use directly.
SettingsMap m_settingsCache
Permanent settings in the DB and overridden settings.
QVariant value(int i) const
arg(title).arg(filename).arg(doDelete))
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
QMap< QString, QVariant > boundValues(void) const
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
DatabaseParams m_dbParams
Current database host & WOL details.
double GetFloatSettingOnHost(const QString &key, const QString &host, double defaultval)
volatile bool m_useSettingsCache
double GetFloatSetting(const QString &key, double defaultval)
bool m_suppressDBMessages
void ClearSettingsCache(const QString &key=QString())
static void destroyMythDB()
QReadWriteLock m_settingsCacheLock
bool SaveSettingOnHost(const QString &key, const QString &newValue, const QString &host)
DatabaseParams GetDatabaseParams(void) const
bool ClearSetting(const QString &key)
SettingsMap m_overriddenSettings
Overridden this session only.
int GetNumSetting(const QString &key, int defaultval)
static QString GetError(const QString &where, const MSqlQuery &query)
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
static void DBError(const QString &where, const MSqlQuery &query)
bool SuppressDBMessages(void) const
int GetNumSettingOnHost(const QString &key, const QString &host, int defaultval)
static void clear(SettingsMap &cache, SettingsMap &overrides, const QString &myKey)
const char *const kSentinelValue
bool isConnected(void) const
Only updated once during object creation.
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
QHash< QString, QString > SettingsMap
static MythDB * getMythDB()
void SetHaveSchema(bool schema)
Set a flag indicating that we have discovered tables and that this therefore not a new empty database...
QSqlError lastError(void) const
void SetLocalHostname(const QString &name)
void GetResolutionSetting(const QString &type, int &width, int &height, double &forced_aspect, double &refresh_rate, int index=-1)
QString GetHostName(void) const
QList< SingleSetting > m_delayedSettings
Settings which should be written to the database as soon as it becomes available.
QString executedQuery(void) const
QString GetSetting(const QString &_key, const QString &defaultval)
void SetDatabaseParams(const DatabaseParams ¶ms)
void SetSuppressDBMessages(bool bUpgraded)
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
bool GetSettings(QMap< QString, QString > &_key_value_pairs)
void SaveSetting(const QString &key, int newValue)
void SetHaveDBConnection(bool connected)
Set a flag indicating we have successfully connected to the database.
bool HaveValidDatabase(void) const
Returns true if we have successfully connected to the database and that database has tables.
static const int settings_reserve
void OverrideSettingForSession(const QString &key, const QString &newValue)
Overrides the given setting for the execution time of the process.
static QString indent(uint level)
MDBManager * GetDBManager(void)
void ClearOverrideSettingForSession(const QString &key)
Clears session Overrides for the given setting.
MSqlQuery query(MSqlQuery::InitCon())
static QString toCommaList(const QMap< QString, QVariant > &bindings, uint indent=0, uint softMaxColumn=80)
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.