Mercurial > hg > orthanc-databases
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) {