[mythtv] [patch] Initial support for other databases than MySQL
David Härdeman
david at 2gen.com
Wed Aug 25 19:25:59 EDT 2004
Hi,
one of the top priorities on my MythTV wishlist is currently PostgreSQL
support...so I've spent some time looking at the code trying to come up
with a good, non-intrusive way of adding it.
This patch is the first step in that direction.
The idea is basically to move all places that explicitly loaded the
MySQL driver into one place as to allow an easy switch. In addition, a
setting is added (optional for MySQL users) to mysql.txt.
Also, the code is somewhat simplified in general and it even reduces the
total lines of code.
By adding the line "DBType=QPSQL7" to /etc/mythtv/mysql.txt, the
PostgreSQL module is now loaded instead of the MySQL one for all the
code in the mythtv module.
Conversion of other modules is still a todo, but there is backwards
compatible glue in there to make sure that it can be done gradually.
Note: this does *not* mean that PostgreSQL is usable yet, only that the
switch of which driver to use is much simplified (a lot of actual SQL
code still needs polishing).
So, in effect, it's a start...please review (and commit or comment)
Regards,
David Härdeman
david at 2gen.com
diffstat output
===============
libs/libmyth/mythcontext.cpp | 67 +++++++++++++++++++++++++--------
libs/libmyth/mythcontext.h | 3 -
libs/libmyth/mythdbcon.h | 10 ----
libs/libmythtv/tv_rec.cpp | 8 ---
programs/mythbackend/main.cpp | 39 ++++++-------------
programs/mythcommflag/main.cpp | 4 -
programs/mythepg/main.cpp | 4 -
programs/mythfilldatabase/filldata.cpp | 4 -
programs/mythfrontend/main.cpp | 12 +----
programs/mythlcd/main.cpp | 4 -
programs/mythprogfind/main.cpp | 4 -
programs/mythtranscode/main.cpp | 8 ---
programs/mythtv/main.cpp | 8 ---
setup/main.cpp | 5 --
14 files changed, 87 insertions(+), 93 deletions(-)
-------------- next part --------------
? mythtv-db-prep.patch
? mythtv-db-prep.patch2
? libs/libmythui/libmythui-0.15.so.1.0.0
? programs/mythfrontend/hwstatusbox.cpp
? programs/mythfrontend/hwstatusbox.h
? programs/mythfrontend/sysinfo.cpp
? programs/mythfrontend/sysinfo.h
? programs/mythuitest/mythuitest
Index: libs/libmyth/mythcontext.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/mythcontext.cpp,v
retrieving revision 1.130
diff -u -r1.130 mythcontext.cpp
--- libs/libmyth/mythcontext.cpp 19 Aug 2004 02:04:36 -0000 1.130
+++ libs/libmyth/mythcontext.cpp 25 Aug 2004 23:10:24 -0000
@@ -33,11 +33,9 @@
class MythContextPrivate
{
public:
- MythContextPrivate(MythContext *lparent);
+ MythContextPrivate(MythContext *lparent, bool gui, bool lcd);
~MythContextPrivate();
- void Init(bool gui, bool lcd);
-
void LoadLogSettings(void);
MythContext *parent;
@@ -96,7 +94,7 @@
bool screensaverEnabled;
};
-MythContextPrivate::MythContextPrivate(MythContext *lparent)
+MythContextPrivate::MythContextPrivate(MythContext *lparent, bool gui, bool lcd)
{
pluginmanager = NULL;
@@ -109,20 +107,21 @@
m_installprefix = PREFIX;
m_settings = new Settings;
+ if (!m_settings->LoadSettingsFiles("mysql.txt", m_installprefix))
+ cerr << "Unable to read configuration file mysql.txt" << endl;
m_qtThemeSettings = new Settings;
language = "";
m_themeloaded = false;
m_backgroundimage = NULL;
- m_db = QSqlDatabase::addDatabase("QMYSQL3", "MythContext");
+ /* Check which kind of DB is requested, default to MySQL */
+ QString db_type = m_settings->GetSetting("DBType", NULL);
+ if (db_type == NULL)
+ db_type = "QMYSQL3";
+ m_db = QSqlDatabase::addDatabase(db_type, "MythContext");
+
screensaver = new ScreenSaverControl();
-}
-
-void MythContextPrivate::Init(bool gui, bool lcd)
-{
- if (!parent->LoadSettingsFiles("mysql.txt"))
- cerr << "Unable to read configuration file mysql.txt" << endl;
m_localhostname = m_settings->GetSetting("LocalHostName", NULL);
if (m_localhostname == NULL)
@@ -212,9 +211,7 @@
exit(-30);
}
- d = new MythContextPrivate(this);
-
- d->Init(gui, lcd);
+ d = new MythContextPrivate(this, gui, lcd);
connect(d->eventSock, SIGNAL(connected()),
this, SLOT(EventSocketConnected()));
@@ -750,6 +747,11 @@
return d->m_themepathname;
}
+/*
+ * This is for backwards compability only, as soon as
+ * all modules use the other version of OpenDatabase
+ * we can remove this.
+ */
int MythContext::OpenDatabase(QSqlDatabase *db)
{
d->dbLock.lock();
@@ -761,12 +763,12 @@
d->m_db->open();
}
d->dbLock.unlock();
-
+
db->setDatabaseName(d->m_settings->GetSetting("DBName"));
db->setUserName(d->m_settings->GetSetting("DBUserName"));
db->setPassword(d->m_settings->GetSetting("DBPassword"));
db->setHostName(d->m_settings->GetSetting("DBHostName"));
-
+
int res = db->open();
if (!res)
cerr << "Unable to connect to database!" << endl
@@ -774,6 +776,39 @@
return res;
}
+/* This should be used instead of the version above */
+QSqlDatabase *MythContext::OpenDatabase(const QString &name)
+{
+ d->dbLock.lock();
+ if (!d->m_db->isOpen()) {
+ d->m_db->setDatabaseName(d->m_settings->GetSetting("DBName"));
+ d->m_db->setUserName(d->m_settings->GetSetting("DBUserName"));
+ d->m_db->setPassword(d->m_settings->GetSetting("DBPassword"));
+ d->m_db->setHostName(d->m_settings->GetSetting("DBHostName"));
+ d->m_db->open();
+ }
+ d->dbLock.unlock();
+
+ /* Check which kind of DB is requested, default to MySQL */
+ QString db_type = d->m_settings->GetSetting("DBType", NULL);
+ if (db_type == NULL)
+ db_type = "QMYSQL3";
+ QSqlDatabase *db = QSqlDatabase::addDatabase(db_type, name);
+
+ db->setDatabaseName(d->m_settings->GetSetting("DBName"));
+ db->setUserName(d->m_settings->GetSetting("DBUserName"));
+ db->setPassword(d->m_settings->GetSetting("DBPassword"));
+ db->setHostName(d->m_settings->GetSetting("DBHostName"));
+
+ if (!db->open()) {
+ cerr << "Unable to connect to database!" << endl
+ << DBErrorMessage(db->lastError()) << endl;
+ QSqlDatabase::removeDatabase(name);
+ db = NULL;
+ }
+ return db;
+}
+
void MythContext::KickDatabase(QSqlDatabase *db)
{
// Some explanation is called for. This exists because the mysql
Index: libs/libmyth/mythcontext.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/mythcontext.h,v
retrieving revision 1.160
diff -u -r1.160 mythcontext.h
--- libs/libmyth/mythcontext.h 19 Aug 2004 02:04:36 -0000 1.160
+++ libs/libmyth/mythcontext.h 25 Aug 2004 23:10:24 -0000
@@ -142,8 +142,9 @@
QString GetThemeDir(void);
QString GetMenuThemeDir(void);
-
+ QSqlDatabase *OpenDatabase(const QString &name = "MythContext");
int OpenDatabase(QSqlDatabase *db);
+
static void KickDatabase(QSqlDatabase *db);
static void DBError(const QString &where, const QSqlQuery& query);
static QString DBErrorMessage(const QSqlError& err);
Index: libs/libmyth/mythdbcon.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/mythdbcon.h,v
retrieving revision 1.3
diff -u -r1.3 mythdbcon.h
--- libs/libmyth/mythdbcon.h 9 Jun 2004 03:21:47 -0000 1.3
+++ libs/libmyth/mythdbcon.h 25 Aug 2004 23:10:24 -0000
@@ -17,22 +17,14 @@
MythSqlDatabase(const QString &name)
{
m_name = name;
- m_db = QSqlDatabase::addDatabase("QMYSQL3", name);
+ m_db = gContext->OpenDatabase(name);
if (!m_db)
{
cerr << "Unable to init db connection: " << name << endl;
return;
}
- if (!gContext->OpenDatabase(m_db))
- {
- cerr << "Unable to open db connect: " << name << endl;
- QSqlDatabase::removeDatabase(name);
- m_db = NULL;
- return;
- }
-
m_dblock = new QMutex(true);
}
Index: libs/libmythtv/tv_rec.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/tv_rec.cpp,v
retrieving revision 1.161
diff -u -r1.161 tv_rec.cpp
--- libs/libmythtv/tv_rec.cpp 19 Aug 2004 02:02:21 -0000 1.161
+++ libs/libmythtv/tv_rec.cpp 25 Aug 2004 23:10:26 -0000
@@ -1026,15 +1026,9 @@
pthread_mutex_lock(&db_lock);
- db_conn = QSqlDatabase::addDatabase("QMYSQL3", name);
+ db_conn = gContext->OpenDatabase(name);
if (!db_conn)
{
- pthread_mutex_unlock(&db_lock);
- printf("Couldn't initialize mysql connection\n");
- return;
- }
- if (!gContext->OpenDatabase(db_conn))
- {
printf("Couldn't open database\n");
}
Index: programs/mythbackend/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythbackend/main.cpp,v
retrieving revision 1.74
diff -u -r1.74 main.cpp
--- programs/mythbackend/main.cpp 19 Aug 2004 02:02:24 -0000 1.74
+++ programs/mythbackend/main.cpp 25 Aug 2004 23:10:27 -0000
@@ -417,63 +417,52 @@
gContext = new MythContext(MYTH_BINARY_VERSION, false, false);
- QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");
+ QSqlDatabase *db = gContext->OpenDatabase();
if (!db)
{
- cerr << "Couldn't connect to database\n";
+ cerr << "Couldn't connect to database (MythContext)\n";
return -1;
}
- QSqlDatabase *subthread = QSqlDatabase::addDatabase("QMYSQL3", "SUBDB");
+ QSqlDatabase *subthread = gContext->OpenDatabase("SUBDB");
if (!subthread)
{
- cerr << "Couldn't connect to database\n";
+ cerr << "Couldn't connect to database (SUBDB)\n";
return -1;
}
- QSqlDatabase *expthread = QSqlDatabase::addDatabase("QMYSQL3", "EXPDB");
+ QSqlDatabase *expthread = gContext->OpenDatabase("EXPDB");
if (!expthread)
{
- cerr << "Couldn't connect to database\n";
+ cerr << "Couldn't connect to database (EXPDB)\n";
return -1;
}
- QSqlDatabase *hkthread = QSqlDatabase::addDatabase("QMYSQL3", "HKDB");
+ QSqlDatabase *hkthread = gContext->OpenDatabase("HKDB");
if (!hkthread)
{
- cerr << "Couldn't connect to database\n";
+ cerr << "Couldn't connect to database (HKDB)\n";
return -1;
}
- QSqlDatabase *transthread = QSqlDatabase::addDatabase("QMYSQL3", "TRANSDB");
+ QSqlDatabase *transthread = gContext->OpenDatabase("TRANSDB");
if (!transthread)
{
- cerr << "Couldn't connect to database\n";
+ cerr << "Couldn't connect to database (TRANSDB)\n";
return -1;
}
- QSqlDatabase *flagthread = QSqlDatabase::addDatabase("QMYSQL3", "FLAGDB");
+ QSqlDatabase *flagthread = gContext->OpenDatabase("FLAGDB");
if (!flagthread)
{
- cerr << "Couldn't connect to database\n";
+ cerr << "Couldn't connect to database (FLAGDB)\n";
return -1;
}
- QSqlDatabase *msdb = QSqlDatabase::addDatabase("QMYSQL3", "MSDB");
+ QSqlDatabase *msdb = gContext->OpenDatabase("MSDB");
if (!msdb)
{
- cerr << "Couldn't connect to database\n";
- return -1;
- }
-
- if (!gContext->OpenDatabase(db) || !gContext->OpenDatabase(subthread) ||
- !gContext->OpenDatabase(expthread) ||
- !gContext->OpenDatabase(hkthread) ||
- !gContext->OpenDatabase(transthread) ||
- !gContext->OpenDatabase(flagthread) ||
- !gContext->OpenDatabase(msdb))
- {
- cerr << "Couldn't open database\n";
+ cerr << "Couldn't connect to database (MSDB)\n";
return -1;
}
Index: programs/mythcommflag/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythcommflag/main.cpp,v
retrieving revision 1.15
diff -u -r1.15 main.cpp
--- programs/mythcommflag/main.cpp 19 Aug 2004 02:02:26 -0000 1.15
+++ programs/mythcommflag/main.cpp 25 Aug 2004 23:10:27 -0000
@@ -472,8 +472,8 @@
gContext = new MythContext(MYTH_BINARY_VERSION, false);
- QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");
- if (!gContext->OpenDatabase(db))
+ QSqlDatabase *db = gContext->OpenDatabase();
+ if (!db)
{
printf("couldn't open db\n");
exit(11);
Index: programs/mythepg/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythepg/main.cpp,v
retrieving revision 1.31
diff -u -r1.31 main.cpp
--- programs/mythepg/main.cpp 14 May 2004 02:41:37 -0000 1.31
+++ programs/mythepg/main.cpp 25 Aug 2004 23:10:27 -0000
@@ -14,8 +14,8 @@
gContext = new MythContext(MYTH_BINARY_VERSION);
- QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");
- if (!gContext->OpenDatabase(db))
+ QSqlDatabase *db = gContext->OpenDatabase();
+ if (!db)
{
printf("couldn't open db\n");
return -1;
Index: programs/mythfilldatabase/filldata.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythfilldatabase/filldata.cpp,v
retrieving revision 1.131
diff -u -r1.131 filldata.cpp
--- programs/mythfilldatabase/filldata.cpp 19 Aug 2004 02:02:26 -0000 1.131
+++ programs/mythfilldatabase/filldata.cpp 25 Aug 2004 23:10:30 -0000
@@ -3113,8 +3113,8 @@
gContext = new MythContext(MYTH_BINARY_VERSION, false);
- QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");
- if (!gContext->OpenDatabase(db))
+ QSqlDatabase *db = gContext->OpenDatabase();
+ if (!db)
{
cerr << "couldn't open db\n";
return -1;
Index: programs/mythfrontend/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythfrontend/main.cpp,v
retrieving revision 1.154
diff -u -r1.154 main.cpp
--- programs/mythfrontend/main.cpp 22 Aug 2004 18:14:16 -0000 1.154
+++ programs/mythfrontend/main.cpp 25 Aug 2004 23:10:30 -0000
@@ -810,16 +810,10 @@
gContext = new MythContext(MYTH_BINARY_VERSION);
- QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");
+ QSqlDatabase *db = gContext->OpenDatabase();
if (!db)
{
- printf("Couldn't connect to database\n");
- return -1;
- }
-
- if (!gContext->OpenDatabase(db))
- {
- printf("couldn't open db\n");
+ printf("Couldn't open db\n");
int pause;
if ((pause = gContext->GetNumSetting("WOLsqlReconnectWaitTime", 0)) > 0)
{
@@ -833,7 +827,7 @@
if (!WOLsqlCommand.isEmpty())
{
- while (acttry <= retries && !gContext->OpenDatabase(db))
+ while (acttry <= retries && !(db = gContext->OpenDatabase()))
{
printf("Trying to wakeup SQLserver (Try %d of %d)\n",
acttry, retries);
Index: programs/mythlcd/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythlcd/main.cpp,v
retrieving revision 1.12
diff -u -r1.12 main.cpp
--- programs/mythlcd/main.cpp 23 Jan 2004 06:01:17 -0000 1.12
+++ programs/mythlcd/main.cpp 25 Aug 2004 23:10:30 -0000
@@ -30,8 +30,8 @@
QApplication a(argc, argv);
gContext = new MythContext(MYTH_BINARY_VERSION, FALSE);
- db = QSqlDatabase::addDatabase("QMYSQL3");
- if (!gContext->OpenDatabase(db))
+ db = gContext->OpenDatabase();
+ if (!db)
{
cerr << "Unable to open database:\n"
<< "Driver error was:" << endl
Index: programs/mythprogfind/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythprogfind/main.cpp,v
retrieving revision 1.7
diff -u -r1.7 main.cpp
--- programs/mythprogfind/main.cpp 23 Jan 2004 06:01:17 -0000 1.7
+++ programs/mythprogfind/main.cpp 25 Aug 2004 23:10:30 -0000
@@ -14,8 +14,8 @@
gContext = new MythContext(MYTH_BINARY_VERSION);
- QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");
- if (!gContext->OpenDatabase(db))
+ QSqlDatabase *db = gContext->OpenDatabase();
+ if (!db)
{
printf("couldn't open db\n");
return -1;
Index: programs/mythtranscode/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythtranscode/main.cpp,v
retrieving revision 1.19
diff -u -r1.19 main.cpp
--- programs/mythtranscode/main.cpp 6 Aug 2004 17:20:30 -0000 1.19
+++ programs/mythtranscode/main.cpp 25 Aug 2004 23:10:31 -0000
@@ -228,19 +228,13 @@
return -1;
}
- db = QSqlDatabase::addDatabase("QMYSQL3");
+ db = gContext->OpenDatabase();
if (!db)
{
printf("Couldn't connect to database\n");
return -1;
}
- if (!gContext->OpenDatabase(db))
- {
- printf("couldn't open db\n");
- return -1;
- }
-
MythContext::KickDatabase(db);
ProgramInfo *pginfo = NULL;
Index: programs/mythtv/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythtv/main.cpp,v
retrieving revision 1.30
diff -u -r1.30 main.cpp
--- programs/mythtv/main.cpp 19 Aug 2004 02:02:27 -0000 1.30
+++ programs/mythtv/main.cpp 25 Aug 2004 23:10:31 -0000
@@ -28,17 +28,13 @@
gContext->LoadQtConfig();
- QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");
+ QSqlDatabase *db = gContext->OpenDatabase();
if (!db)
{
printf("Couldn't connect to database\n");
return 45; // exit(45)
+ /* return 46 aka exit(46) used to be here */
}
- if (!gContext->OpenDatabase(db))
- {
- printf("couldn't open db\n");
- return 46; // exit(46)
- }
gContext->LoadQtConfig();
Index: setup/main.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/setup/main.cpp,v
retrieving revision 1.46
diff -u -r1.46 main.cpp
--- setup/main.cpp 8 May 2004 19:58:31 -0000 1.46
+++ setup/main.cpp 25 Aug 2004 23:10:31 -0000
@@ -121,9 +121,8 @@
gContext = new MythContext(MYTH_BINARY_VERSION, true);
translator = new QTranslator(0);
-
- db = QSqlDatabase::addDatabase("QMYSQL3");
- if (!gContext->OpenDatabase(db))
+ db = gContext->OpenDatabase();
+ if (!db)
{
cerr << "Unable to open database:\n"
<< "Driver error was:" << endl
More information about the mythtv-dev
mailing list