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