[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