From 2ffdf2626b2f074baa5d8eaeed97a9b8cfcc38a2 Mon Sep 17 00:00:00 2001
From: Lawrence Rust <lvr@softsystem.co.uk>
Date: Thu, 11 Aug 2011 10:49:58 +0200
Subject: [PATCH] Fix upgrade from an empty database

mythtv-setup fails when starting with an empty database, failing during
the wizard upgrade step from the intiak database schema 1226.

There are 2 problems:

1. MythDB::GetSetting can't read the dbschemavar during initialisation
because HaveValidDatabase returns false

2. After calling DBUtil::lockSchema mysql requests fail during prepare
with the error that LOCK TABLES wasn't called

This fix allows the dbschemavar to be read by MythDB::GetSetting even if
HaveValidDatabase returns false and disables "LOCK TABLE schemalock WRITE;"
I don't (and hope never will) have the mysql knowledge to fix the table
locking 'properly' so this is an expedient fix.

Signed-off-by: Lawrence Rust <lvr@softsystem.co.uk>
---
 mythtv/libs/libmythbase/dbutil.cpp |    5 ++++-
 mythtv/libs/libmythbase/mythdb.cpp |    9 +++++++--
 mythtv/libs/libmythtv/dbcheck.cpp  |    5 +++--
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/mythtv/libs/libmythbase/dbutil.cpp b/mythtv/libs/libmythbase/dbutil.cpp
index b4d70e8..3db2c47 100644
--- a/mythtv/libs/libmythbase/dbutil.cpp
+++ b/mythtv/libs/libmythbase/dbutil.cpp
@@ -859,6 +859,7 @@ bool DBUtil::lockSchema(MSqlQuery &query)
         return false;
     }
 
+#if 0
     if (!query.exec("LOCK TABLE schemalock WRITE;"))
     {
         LOG(VB_GENERAL, LOG_CRIT,
@@ -866,15 +867,17 @@ bool DBUtil::lockSchema(MSqlQuery &query)
                         .arg(MythDB::DBErrorMessage(query.lastError())));
         return false;
     }
-
+#endif
     return true;
 }
 
 void DBUtil::unlockSchema(MSqlQuery &query)
 {
+#if 0
     // Should this _just_ unlock schemalock?
     if (!query.exec("UNLOCK TABLES;"))
         MythDB::DBError("unlockSchema -- unlocking tables", query);
+#endif
 }
 
 /* vim: set expandtab tabstop=4 shiftwidth=4: */
diff --git a/mythtv/libs/libmythbase/mythdb.cpp b/mythtv/libs/libmythbase/mythdb.cpp
index 66d0c9b..d3a8726 100644
--- a/mythtv/libs/libmythbase/mythdb.cpp
+++ b/mythtv/libs/libmythbase/mythdb.cpp
@@ -371,7 +371,7 @@ QString MythDB::GetSetting(const QString &_key, const QString &defaultval)
     }
     d->settingsCacheLock.unlock();
 
-    if (d->ignoreDatabase || !HaveValidDatabase())
+    if (!key.endsWith("dbschemaver") && (d->ignoreDatabase || !HaveValidDatabase()))
         return value;
 
     MSqlQuery query(MSqlQuery::InitCon());
@@ -403,7 +403,12 @@ QString MythDB::GetSetting(const QString &_key, const QString &defaultval)
             "WHERE value = :KEY AND hostname IS NULL");
         query.bindValue(":KEY", key);
 
-        if (query.exec() && query.next())
+        if (!query.exec())
+        {
+            MythDB::DBError("GetSetting - query failure: ", query);
+            value = d->m_settings->GetSetting(key, defaultval);
+        }
+        else if (query.next())
         {
             value = query.value(0).toString();
         }
diff --git a/mythtv/libs/libmythtv/dbcheck.cpp b/mythtv/libs/libmythtv/dbcheck.cpp
index 9bde639..c31c8ee 100644
--- a/mythtv/libs/libmythtv/dbcheck.cpp
+++ b/mythtv/libs/libmythtv/dbcheck.cpp
@@ -384,7 +384,6 @@ static bool UpdateDBVersionNumber(const QString &newnumber, QString &dbver)
     }
 
     dbver = newnumber;
-
     return true;
 }
 
@@ -455,7 +454,9 @@ bool UpgradeTVDatabaseSchema(const bool upgradeAllowed,
     SchemaUpgradeWizard  * DBup;
 
 
-    GetMythDB()->SetSuppressDBMessages(true);
+    // Hiding the db errors isn't a good idea and added significant time
+    // to tracking down problems during upgrades
+//    GetMythDB()->SetSuppressDBMessages(true);
     gCoreContext->ActivateSettingsCache(false);
 
     DBup = SchemaUpgradeWizard::Get("DBSchemaVer", "MythTV",
-- 
1.7.4.1

