diff Framework/MySQL/MySQLDatabase.cpp @ 22:1e9bad493475

prevent running unit tests on a non-existing db
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 11 Jul 2018 14:39:59 +0200
parents 9e419261f1c9
children b2ff1cd2907a
line wrap: on
line diff
--- a/Framework/MySQL/MySQLDatabase.cpp	Tue Jul 10 14:33:05 2018 +0200
+++ b/Framework/MySQL/MySQLDatabase.cpp	Wed Jul 11 14:39:59 2018 +0200
@@ -264,6 +264,18 @@
       throw Orthanc::OrthancException(Orthanc::ErrorCode_Database);
     }
   }
+
+
+  static void CheckAlphanumericString(const std::string& name)
+  {
+    for (size_t i = 0; i < name.length(); i++)
+    {
+      if (!isalnum(name[i]))
+      {
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
+      }
+    }
+  }
   
 
   bool MySQLDatabase::DoesTableExist(MySQLTransaction& transaction,
@@ -274,14 +286,8 @@
       throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
     }
 
-    for (size_t i = 0; i < name.length(); i++)
-    {
-      if (!isalnum(name[i]))
-      {
-        throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
-      }
-    }
-
+    CheckAlphanumericString(name);
+  
     Query query("SELECT COUNT(*) FROM information_schema.TABLES WHERE "
                 "(TABLE_SCHEMA = ${database}) AND (TABLE_NAME = ${table})", true);
     query.SetType("database", ValueType_Utf8String);
@@ -301,6 +307,33 @@
   }
 
 
+  bool MySQLDatabase::DoesDatabaseExist(MySQLTransaction& transaction,
+                                        const std::string& name)
+  {
+    if (mysql_ == NULL)
+    {
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
+    }
+
+    CheckAlphanumericString(name);
+  
+    Query query("SELECT COUNT(*) FROM information_schema.SCHEMATA "
+                "WHERE SCHEMA_NAME = ${database}", true);
+    query.SetType("database", ValueType_Utf8String);
+    
+    MySQLStatement statement(*this, query);
+
+    Dictionary args;
+    args.SetUtf8Value("database", name);
+
+    std::auto_ptr<IResult> result(statement.Execute(transaction, args));
+    return (!result->IsDone() &&
+            result->GetFieldsCount() == 1 &&
+            result->GetField(0).GetType() == ValueType_Integer64 &&
+            dynamic_cast<const Integer64Value&>(result->GetField(0)).GetValue() == 1);            
+  }
+
+
   void MySQLDatabase::Execute(const std::string& sql,
                               bool arobaseSeparator)
   {