Skip to content

Commit

Permalink
Respect config.xml and mysql.txt files if they exist.
Browse files Browse the repository at this point in the history
At some point LoadDatabaseSettings() lost it's return value (it was still documented though)
and we started using UPnP to connect to a random mythtv database whenever we were unable to
connect to the configured database.

This returns the return value for mysql.txt parsing and does not do autodetection
if there is a mysql.txt. This also adds similar parsing of config.xml and also
respects those db connection values if they exist. If those files exist but we
are unable to connect to the configured database we bring up manual config in
GUI apps and abort startup of mythbackend. If neither of those files exist we use
UPnP autodetection.
  • Loading branch information
daniel-kristjansson committed Nov 23, 2011
1 parent e61d898 commit c32fcf7
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 68 deletions.
38 changes: 26 additions & 12 deletions mythtv/libs/libmyth/mythcontext.cpp
Expand Up @@ -65,7 +65,7 @@ class MythContextPrivate : public QObject
void TempMainWindow(bool languagePrompt = true);
void EndTempWindow(void);

void LoadDatabaseSettings(void);
bool LoadDatabaseSettings(void);

bool PromptForDatabaseParams(const QString &error);
QString TestDBconnection(void);
Expand Down Expand Up @@ -331,15 +331,14 @@ bool MythContextPrivate::FindDatabase(const bool prompt, const bool noPrompt)
// The two bool. args actually form a Yes/Maybe/No (A tristate bool :-)
bool manualSelect = prompt && !noPrompt;

// In addition to the UI chooser, we can also try to autoconfigure
bool autoSelect = !manualSelect;

QString failure;


// 1. Load either mysql.txt, or use sensible "localhost" defaults:
LoadDatabaseSettings();
bool loaded = LoadDatabaseSettings();

// In addition to the UI chooser, we can also try to autoSelect later,
// but only if we're not doing manualSelect and there was no mysql.txt
bool autoSelect = !manualSelect && !loaded;

// 2. If the user isn't forcing up the chooser UI, look for a default
// backend in config.xml, then test DB settings we've got so far:
Expand Down Expand Up @@ -440,14 +439,27 @@ bool MythContextPrivate::FindDatabase(const bool prompt, const bool noPrompt)
return false;
}

/**
* Load database and host settings from mysql.txt, or set some defaults
*
* \returns true if mysql.txt was parsed
/** Load database and host settings from mysql.txt or config.xml,
* or set some defaults.
* \return true if mysql.txt or config.xml was parsed
*/
void MythContextPrivate::LoadDatabaseSettings(void)
bool MythContextPrivate::LoadDatabaseSettings(void)
{
gCoreContext->GetDB()->LoadDatabaseParamsFromDisk(m_DBparams, true);
bool ok = MythDB::LoadDatabaseParamsFromDisk(m_DBparams);
if (!ok)
{
XmlConfiguration cfg("config.xml");
MythDB::LoadDefaultDatabaseParams(m_DBparams);
m_DBparams.dbHostName = cfg.GetValue(kDefaultBE + "DBHostName", "");
m_DBparams.dbUserName = cfg.GetValue(kDefaultBE + "DBUserName", "");
m_DBparams.dbPassword = cfg.GetValue(kDefaultBE + "DBPassword", "");
m_DBparams.dbName = cfg.GetValue(kDefaultBE + "DBName", "");
m_DBparams.dbPort = cfg.GetValue(kDefaultBE + "DBPort", 0);
ok = MythDB::ValidateDatabaseParams(m_DBparams, "config.xml");
}
if (!ok)
MythDB::LoadDefaultDatabaseParams(m_DBparams);

gCoreContext->GetDB()->SetDatabaseParams(m_DBparams);

QString hostname = m_DBparams.localHostName;
Expand All @@ -468,6 +480,8 @@ void MythContextPrivate::LoadDatabaseSettings(void)
LOG(VB_GENERAL, LOG_INFO, QString("Using localhost value of %1")
.arg(hostname));
gCoreContext->SetLocalHostname(hostname);

return ok;
}

bool MythContextPrivate::PromptForDatabaseParams(const QString &error)
Expand Down
109 changes: 59 additions & 50 deletions mythtv/libs/libmythbase/mythdb.cpp
Expand Up @@ -866,76 +866,85 @@ void MythDB::ActivateSettingsCache(bool activate)
ClearSettingsCache();
}

bool MythDB::LoadDatabaseParamsFromDisk(
DatabaseParams &params, bool sanitize)
bool MythDB::LoadDatabaseParamsFromDisk(DatabaseParams &params)
{
Settings settings;
if (settings.LoadSettingsFiles(
if (!settings.LoadSettingsFiles(
"mysql.txt", GetInstallPrefix(), GetConfDir()))
{
params.dbHostName = settings.GetSetting("DBHostName");
params.dbHostPing = settings.GetSetting("DBHostPing") != "no";
params.dbPort = settings.GetNumSetting("DBPort", 3306);
params.dbUserName = settings.GetSetting("DBUserName");
params.dbPassword = settings.GetSetting("DBPassword");
params.dbName = settings.GetSetting("DBName");
params.dbType = settings.GetSetting("DBType");

params.localHostName = settings.GetSetting("LocalHostName");
params.localEnabled = !params.localHostName.isEmpty();

params.wolReconnect =
settings.GetNumSetting("WOLsqlReconnectWaitTime");
params.wolEnabled = params.wolReconnect > 0;

params.wolRetry = settings.GetNumSetting("WOLsqlConnectRetry");
params.wolCommand = settings.GetSetting("WOLsqlCommand");
}
else if (sanitize)
{
LOG(VB_GENERAL, LOG_ERR, "Unable to read configuration file mysql.txt");

// Sensible connection defaults.
params.dbHostName = "localhost";
params.dbHostPing = true;
params.dbPort = 3306;
params.dbUserName = "mythtv";
params.dbPassword = "mythtv";
params.dbName = "mythconverg";
params.dbType = "QMYSQL";
params.localEnabled = false;
params.localHostName = "my-unique-identifier-goes-here";
params.wolEnabled = false;
params.wolReconnect = 0;
params.wolRetry = 5;
params.wolCommand = "echo 'WOLsqlServerCommand not set'";
}
else
{
return false;
}

params.dbHostName = settings.GetSetting("DBHostName");
params.dbHostPing = settings.GetSetting("DBHostPing") != "no";
params.dbPort = settings.GetNumSetting("DBPort", 3306);
params.dbUserName = settings.GetSetting("DBUserName");
params.dbPassword = settings.GetSetting("DBPassword");
params.dbName = settings.GetSetting("DBName");
params.dbType = settings.GetSetting("DBType");

params.localHostName = settings.GetSetting("LocalHostName");
params.localEnabled = !params.localHostName.isEmpty();

params.wolReconnect =
settings.GetNumSetting("WOLsqlReconnectWaitTime");
params.wolEnabled = params.wolReconnect > 0;

params.wolRetry = settings.GetNumSetting("WOLsqlConnectRetry");
params.wolCommand = settings.GetSetting("WOLsqlCommand");

return ValidateDatabaseParams(params, "mysql.txt");
}

bool MythDB::ValidateDatabaseParams(
const DatabaseParams &params, const QString &source)
{
// Print some warnings if things look fishy..
QString msg = QString(" is not set in %1").arg(source);

if (params.dbHostName.isEmpty())
{
LOG(VB_GENERAL, LOG_ERR, "DBHostName is not set in mysql.txt");
LOG(VB_GENERAL, LOG_ERR, "Assuming localhost");
LOG(VB_GENERAL, LOG_ERR, "DBHostName" + msg);
return false;
}
if (params.dbUserName.isEmpty())
LOG(VB_GENERAL, LOG_ERR, "DBUserName is not set in mysql.txt");
{
LOG(VB_GENERAL, LOG_ERR, "DBUserName" + msg);
return false;
}
if (params.dbPassword.isEmpty())
LOG(VB_GENERAL, LOG_ERR, "DBPassword is not set in mysql.txt");
{
LOG(VB_GENERAL, LOG_ERR, "DBPassword" + msg);
return false;
}
if (params.dbName.isEmpty())
LOG(VB_GENERAL, LOG_ERR, "DBName is not set in mysql.txt");

// If sanitize set, replace empty dbHostName with "localhost"
if (sanitize && params.dbHostName.isEmpty())
params.dbHostName = "localhost";
{
LOG(VB_GENERAL, LOG_ERR, "DBName" + msg);
return false;
}

return true;
}

// Sensible connection defaults.
void MythDB::LoadDefaultDatabaseParams(DatabaseParams &params)
{
params.dbHostName = "localhost";
params.dbHostPing = true;
params.dbPort = 3306;
params.dbUserName = "mythtv";
params.dbPassword = "mythtv";
params.dbName = "mythconverg";
params.dbType = "QMYSQL";
params.localEnabled = false;
params.localHostName = "my-unique-identifier-goes-here";
params.wolEnabled = false;
params.wolReconnect = 0;
params.wolRetry = 5;
params.wolCommand = "echo 'WOLsqlServerCommand not set'";
}

bool MythDB::SaveDatabaseParamsToDisk(
const DatabaseParams &params, const QString &confdir, bool overwrite)
{
Expand Down
6 changes: 4 additions & 2 deletions mythtv/libs/libmythbase/mythdb.h
Expand Up @@ -85,8 +85,10 @@ class MBASE_PUBLIC MythDB
static QString toCommaList(const QMap<QString, QVariant> &bindings,
uint indent = 0, uint softMaxColumn = 80);

static bool LoadDatabaseParamsFromDisk(
DatabaseParams &params, bool sanitize);
static bool LoadDatabaseParamsFromDisk(DatabaseParams &params);
static bool ValidateDatabaseParams(
const DatabaseParams &params, const QString &source);
static void LoadDefaultDatabaseParams(DatabaseParams &params);
static bool SaveDatabaseParamsToDisk(
const DatabaseParams &params, const QString &confdir, bool overwrite);

Expand Down
7 changes: 3 additions & 4 deletions mythtv/programs/mythbackend/mythsettings.cpp
Expand Up @@ -474,13 +474,12 @@ QString StringListToJSON(const QString &key,
return result;
}

QMap<QString,QString> GetConfigFileSettingValues()
QMap<QString,QString> GetConfigFileSettingValues(void)
{
QMap<QString,QString> map;
DatabaseParams params;
bool ok = MythDB::LoadDatabaseParamsFromDisk(params, true);
if (!ok)
return map;
if (!MythDB::LoadDatabaseParamsFromDisk(params))
MythDB::LoadDefaultDatabaseParams(params);

map["dbHostName"] = params.dbHostName;
map["dbPort"] = QString::number(params.dbPort);
Expand Down

0 comments on commit c32fcf7

Please sign in to comment.