comparison Framework/Plugins/DatabaseBackendAdapterV3.cpp @ 232:4e15eace9b90

reorganization in DatabaseBackendAdapterV3
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 06 Apr 2021 12:50:06 +0200
parents a4918d57435c
children 7d46c99523a2
comparison
equal deleted inserted replaced
231:0a9b48d19643 232:4e15eace9b90
59 59
60 // TODO - TURN THIS INTO A CONNECTION POOL 60 // TODO - TURN THIS INTO A CONNECTION POOL
61 class DatabaseBackendAdapterV3::Adapter : public boost::noncopyable 61 class DatabaseBackendAdapterV3::Adapter : public boost::noncopyable
62 { 62 {
63 private: 63 private:
64 std::unique_ptr<IndexBackend> backend_; 64 std::unique_ptr<IndexBackend> backend_;
65 OrthancPluginContext* context_;
65 boost::mutex managerMutex_; 66 boost::mutex managerMutex_;
66 std::unique_ptr<DatabaseManager> manager_; 67 std::unique_ptr<DatabaseManager> manager_;
68
69 DatabaseManager& GetManager() const
70 {
71 if (manager_.get() == NULL)
72 {
73 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
74 }
75 else
76 {
77 return *manager_;
78 }
79 }
67 80
68 public: 81 public:
69 Adapter(IndexBackend* backend) : 82 Adapter(IndexBackend* backend) :
70 backend_(backend) 83 backend_(backend)
71 { 84 {
72 if (backend == NULL) 85 if (backend == NULL)
73 { 86 {
74 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); 87 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
75 } 88 }
76 } 89 else
77 90 {
78 IndexBackend& GetBackend() const 91 context_ = backend_->GetContext();
79 { 92 }
80 return *backend_; 93 }
94
95 OrthancPluginContext* GetContext() const
96 {
97 return context_;
98 }
99
100 uint32_t GetDatabaseVersion()
101 {
102 boost::mutex::scoped_lock lock(managerMutex_);
103 return backend_->GetDatabaseVersion(GetManager());
104 }
105
106 void UpgradeDatabase(OrthancPluginStorageArea* storageArea,
107 uint32_t targetVersion)
108 {
109 boost::mutex::scoped_lock lock(managerMutex_);
110 backend_->UpgradeDatabase(GetManager(), targetVersion, storageArea);
81 } 111 }
82 112
83 void OpenConnection() 113 void OpenConnection()
84 { 114 {
85 boost::mutex::scoped_lock lock(managerMutex_); 115 boost::mutex::scoped_lock lock(managerMutex_);
111 141
112 class DatabaseAccessor : public boost::noncopyable 142 class DatabaseAccessor : public boost::noncopyable
113 { 143 {
114 private: 144 private:
115 boost::mutex::scoped_lock lock_; 145 boost::mutex::scoped_lock lock_;
116 DatabaseManager* manager_; 146 IndexBackend& backend_;
147 DatabaseManager& manager_;
117 148
118 public: 149 public:
119 DatabaseAccessor(Adapter& adapter) : 150 DatabaseAccessor(Adapter& adapter) :
120 lock_(adapter.managerMutex_), 151 lock_(adapter.managerMutex_),
121 manager_(adapter.manager_.get()) 152 backend_(*adapter.backend_),
122 { 153 manager_(adapter.GetManager())
123 if (manager_ == NULL) 154 {
124 { 155 }
125 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); 156
126 } 157 IndexBackend& GetBackend() const
158 {
159 return backend_;
127 } 160 }
128 161
129 DatabaseManager& GetManager() const 162 DatabaseManager& GetManager() const
130 { 163 {
131 assert(manager_ != NULL); 164 return manager_;
132 return *manager_;
133 } 165 }
134 }; 166 };
135 }; 167 };
136 168
137 169
696 { 728 {
697 private: 729 private:
698 Adapter& adapter_; 730 Adapter& adapter_;
699 std::unique_ptr<Adapter::DatabaseAccessor> accessor_; 731 std::unique_ptr<Adapter::DatabaseAccessor> accessor_;
700 std::unique_ptr<Output> output_; 732 std::unique_ptr<Output> output_;
701 733
702 public: 734 public:
703 Transaction(Adapter& adapter) : 735 Transaction(Adapter& adapter) :
704 adapter_(adapter), 736 adapter_(adapter),
705 accessor_(new Adapter::DatabaseAccessor(adapter)), 737 accessor_(new Adapter::DatabaseAccessor(adapter)),
706 output_(new Output) 738 output_(new Output)
711 { 743 {
712 } 744 }
713 745
714 IndexBackend& GetBackend() const 746 IndexBackend& GetBackend() const
715 { 747 {
716 return adapter_.GetBackend(); 748 return accessor_->GetBackend();
717 } 749 }
718 750
719 Output& GetOutput() const 751 Output& GetOutput() const
720 { 752 {
721 return *output_; 753 return *output_;
859 try 891 try
860 { 892 {
861 adapter->OpenConnection(); 893 adapter->OpenConnection();
862 return OrthancPluginErrorCode_Success; 894 return OrthancPluginErrorCode_Success;
863 } 895 }
864 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); 896 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext());
865 } 897 }
866 898
867 899
868 static OrthancPluginErrorCode Close(void* database) 900 static OrthancPluginErrorCode Close(void* database)
869 { 901 {
872 try 904 try
873 { 905 {
874 adapter->CloseConnection(); 906 adapter->CloseConnection();
875 return OrthancPluginErrorCode_Success; 907 return OrthancPluginErrorCode_Success;
876 } 908 }
877 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); 909 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext());
878 } 910 }
879 911
880 912
881 static OrthancPluginErrorCode DestructDatabase(void* database) 913 static OrthancPluginErrorCode DestructDatabase(void* database)
882 { 914 {
892 { 924 {
893 isBackendInUse_ = false; 925 isBackendInUse_ = false;
894 } 926 }
895 else 927 else
896 { 928 {
897 OrthancPluginLogError(adapter->GetBackend().GetContext(), "More than one index backend was registered, internal error"); 929 OrthancPluginLogError(adapter->GetContext(), "More than one index backend was registered, internal error");
898 } 930 }
899 931
900 delete adapter; 932 delete adapter;
901 933
902 return OrthancPluginErrorCode_Success; 934 return OrthancPluginErrorCode_Success;
909 { 941 {
910 DatabaseBackendAdapterV3::Adapter* adapter = reinterpret_cast<DatabaseBackendAdapterV3::Adapter*>(database); 942 DatabaseBackendAdapterV3::Adapter* adapter = reinterpret_cast<DatabaseBackendAdapterV3::Adapter*>(database);
911 943
912 try 944 try
913 { 945 {
914 DatabaseBackendAdapterV3::Adapter::DatabaseAccessor accessor(*adapter); 946 *version = adapter->GetDatabaseVersion();
915 *version = adapter->GetBackend().GetDatabaseVersion(accessor.GetManager()); 947 return OrthancPluginErrorCode_Success;
916 return OrthancPluginErrorCode_Success; 948 }
917 } 949 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext());
918 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext());
919 } 950 }
920 951
921 952
922 static OrthancPluginErrorCode UpgradeDatabase(void* database, 953 static OrthancPluginErrorCode UpgradeDatabase(void* database,
923 OrthancPluginStorageArea* storageArea, 954 OrthancPluginStorageArea* storageArea,
925 { 956 {
926 DatabaseBackendAdapterV3::Adapter* adapter = reinterpret_cast<DatabaseBackendAdapterV3::Adapter*>(database); 957 DatabaseBackendAdapterV3::Adapter* adapter = reinterpret_cast<DatabaseBackendAdapterV3::Adapter*>(database);
927 958
928 try 959 try
929 { 960 {
930 DatabaseBackendAdapterV3::Adapter::DatabaseAccessor accessor(*adapter); 961 adapter->UpgradeDatabase(storageArea, targetVersion);
931 adapter->GetBackend().UpgradeDatabase(accessor.GetManager(), targetVersion, storageArea); 962 return OrthancPluginErrorCode_Success;
932 return OrthancPluginErrorCode_Success; 963 }
933 } 964 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext());
934 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext());
935 } 965 }
936 966
937 967
938 static OrthancPluginErrorCode StartTransaction(void* database, 968 static OrthancPluginErrorCode StartTransaction(void* database,
939 OrthancPluginDatabaseTransaction** target /* out */, 969 OrthancPluginDatabaseTransaction** target /* out */,
961 991
962 *target = reinterpret_cast<OrthancPluginDatabaseTransaction*>(transaction.release()); 992 *target = reinterpret_cast<OrthancPluginDatabaseTransaction*>(transaction.release());
963 993
964 return OrthancPluginErrorCode_Success; 994 return OrthancPluginErrorCode_Success;
965 } 995 }
966 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); 996 ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext());
967 } 997 }
968 998
969 999
970 static OrthancPluginErrorCode DestructTransaction(OrthancPluginDatabaseTransaction* transaction) 1000 static OrthancPluginErrorCode DestructTransaction(OrthancPluginDatabaseTransaction* transaction)
971 { 1001 {