comparison Framework/MySQL/MySQLDatabase.cpp @ 237:35598014f140

refactoring to remove GlobalProperties.cpp
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 08 Apr 2021 19:09:04 +0200
parents d1d2edbbe6fb
children c82c2cf84ae8
comparison
equal deleted inserted replaced
236:d1d2edbbe6fb 237:35598014f140
222 { 222 {
223 LOG(ERROR) << "Inexistent database, please create it first: " << database; 223 LOG(ERROR) << "Inexistent database, please create it first: " << database;
224 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); 224 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
225 } 225 }
226 226
227 db.Execute("DROP DATABASE " + database, false); 227 db.ExecuteMultiLines("DROP DATABASE " + database, false);
228 db.Execute("CREATE DATABASE " + database, false); 228 db.ExecuteMultiLines("CREATE DATABASE " + database, false);
229 t.Commit(); 229 t.Commit();
230 } 230 }
231 } 231 }
232 232
233 233
476 result->GetField(0).GetType() == ValueType_Integer64 && 476 result->GetField(0).GetType() == ValueType_Integer64 &&
477 dynamic_cast<const Integer64Value&>(result->GetField(0)).GetValue() != 0); 477 dynamic_cast<const Integer64Value&>(result->GetField(0)).GetValue() != 0);
478 } 478 }
479 479
480 480
481 void MySQLDatabase::Execute(const std::string& sql, 481 void MySQLDatabase::ExecuteMultiLines(const std::string& sql,
482 bool arobaseSeparator) 482 bool arobaseSeparator)
483 { 483 {
484 if (mysql_ == NULL) 484 if (mysql_ == NULL)
485 { 485 {
486 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); 486 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
487 } 487 }
525 525
526 namespace 526 namespace
527 { 527 {
528 class MySQLImplicitTransaction : public ImplicitTransaction 528 class MySQLImplicitTransaction : public ImplicitTransaction
529 { 529 {
530 private:
531 MySQLDatabase& db_;
532
530 protected: 533 protected:
531 virtual IResult* ExecuteInternal(IPrecompiledStatement& statement, 534 virtual IResult* ExecuteInternal(IPrecompiledStatement& statement,
532 const Dictionary& parameters) 535 const Dictionary& parameters)
533 { 536 {
534 return dynamic_cast<MySQLStatement&>(statement).Execute(*this, parameters); 537 return dynamic_cast<MySQLStatement&>(statement).Execute(*this, parameters);
537 virtual void ExecuteWithoutResultInternal(IPrecompiledStatement& statement, 540 virtual void ExecuteWithoutResultInternal(IPrecompiledStatement& statement,
538 const Dictionary& parameters) 541 const Dictionary& parameters)
539 { 542 {
540 dynamic_cast<MySQLStatement&>(statement).ExecuteWithoutResult(*this, parameters); 543 dynamic_cast<MySQLStatement&>(statement).ExecuteWithoutResult(*this, parameters);
541 } 544 }
545
546 public:
547 MySQLImplicitTransaction(MySQLDatabase& db) :
548 db_(db)
549 {
550 }
551
552 virtual bool DoesTableExist(const std::string& name) ORTHANC_OVERRIDE
553 {
554 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "An explicit transaction is needed");
555 }
556
557 virtual bool DoesTriggerExist(const std::string& name) ORTHANC_OVERRIDE
558 {
559 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "An explicit transaction is needed");
560 }
561
562 virtual void ExecuteMultiLines(const std::string& query) ORTHANC_OVERRIDE
563 {
564 db_.ExecuteMultiLines(query, false /* don't deal with arobases */);
565 }
542 }; 566 };
543 } 567 }
544 568
545 569
546 ITransaction* MySQLDatabase::CreateTransaction(TransactionType type) 570 ITransaction* MySQLDatabase::CreateTransaction(TransactionType type)
551 } 575 }
552 576
553 switch (type) 577 switch (type)
554 { 578 {
555 case TransactionType_Implicit: 579 case TransactionType_Implicit:
556 return new MySQLImplicitTransaction; 580 return new MySQLImplicitTransaction(*this);
557 581
558 case TransactionType_ReadOnly: 582 case TransactionType_ReadOnly:
559 case TransactionType_ReadWrite: 583 case TransactionType_ReadWrite:
560 return new MySQLTransaction(*this, type); 584 return new MySQLTransaction(*this, type);
561 585
633 protected: 657 protected:
634 virtual IDatabase* TryOpen() 658 virtual IDatabase* TryOpen()
635 { 659 {
636 std::unique_ptr<MySQLDatabase> db(new MySQLDatabase(parameters_)); 660 std::unique_ptr<MySQLDatabase> db(new MySQLDatabase(parameters_));
637 db->Open(); 661 db->Open();
638 db->Execute("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE", false); 662 db->ExecuteMultiLines("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE", false);
639 return db.release(); 663 return db.release();
640 } 664 }
641 665
642 public: 666 public:
643 Factory(const MySQLParameters& parameters) : 667 Factory(const MySQLParameters& parameters) :