comparison Framework/Plugins/DatabaseBackendAdapterV3.cpp @ 223:af049cd66661

removed singleton from DatabaseBackendAdapterV3
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 01 Apr 2021 11:50:36 +0200
parents c8e06b41feec
children 94c9908e6aca
comparison
equal deleted inserted replaced
222:c8e06b41feec 223:af049cd66661
52 } 52 }
53 53
54 54
55 namespace OrthancDatabases 55 namespace OrthancDatabases
56 { 56 {
57 static bool isBackendInUse_ = false; // Only for sanity checks
58
57 class DatabaseBackendAdapterV3::Output : public IDatabaseBackendOutput 59 class DatabaseBackendAdapterV3::Output : public IDatabaseBackendOutput
58 { 60 {
59 private: 61 private:
60 struct Metadata 62 struct Metadata
61 { 63 {
803 } 805 }
804 806
805 807
806 static OrthancPluginErrorCode DestructDatabase(void* database) 808 static OrthancPluginErrorCode DestructDatabase(void* database)
807 { 809 {
808 // Nothing to delete, as this plugin uses a singleton to store backend 810 IndexBackend* backend = reinterpret_cast<IndexBackend*>(database);
809 if (database == NULL) 811
812 if (backend == NULL)
810 { 813 {
811 return OrthancPluginErrorCode_InternalError; 814 return OrthancPluginErrorCode_InternalError;
812 } 815 }
813 else 816 else
814 { 817 {
818 if (isBackendInUse_)
819 {
820 isBackendInUse_ = false;
821 }
822 else
823 {
824 OrthancPluginLogError(backend->GetContext(), "More than one index backend was registered, internal error");
825 }
826
827 delete backend;
828
815 return OrthancPluginErrorCode_Success; 829 return OrthancPluginErrorCode_Success;
816 } 830 }
817 } 831 }
818 832
819 833
1753 } 1767 }
1754 ORTHANC_PLUGINS_DATABASE_CATCH(t->GetContext()); 1768 ORTHANC_PLUGINS_DATABASE_CATCH(t->GetContext());
1755 } 1769 }
1756 1770
1757 1771
1758 static std::unique_ptr<IndexBackend> backend_;
1759
1760 void DatabaseBackendAdapterV3::Register(IndexBackend* backend) 1772 void DatabaseBackendAdapterV3::Register(IndexBackend* backend)
1761 { 1773 {
1774 if (isBackendInUse_)
1775 {
1776 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
1777 }
1778
1762 if (backend == NULL) 1779 if (backend == NULL)
1763 { 1780 {
1764 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); 1781 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
1765 } 1782 }
1766
1767 if (backend_.get() != NULL)
1768 {
1769 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
1770 }
1771
1772 backend_.reset(backend);
1773 1783
1774 OrthancPluginDatabaseBackendV3 params; 1784 OrthancPluginDatabaseBackendV3 params;
1775 memset(&params, 0, sizeof(params)); 1785 memset(&params, 0, sizeof(params));
1776 1786
1777 params.readAnswersCount = ReadAnswersCount; 1787 params.readAnswersCount = ReadAnswersCount;
1841 params.setGlobalProperty = SetGlobalProperty; 1851 params.setGlobalProperty = SetGlobalProperty;
1842 params.setMetadata = SetMetadata; 1852 params.setMetadata = SetMetadata;
1843 params.setProtectedPatient = SetProtectedPatient; 1853 params.setProtectedPatient = SetProtectedPatient;
1844 params.setResourcesContent = SetResourcesContent; 1854 params.setResourcesContent = SetResourcesContent;
1845 1855
1846 OrthancPluginContext* context = backend_->GetContext(); 1856 OrthancPluginContext* context = backend->GetContext();
1847 1857
1848 if (OrthancPluginRegisterDatabaseBackendV3(context, &params, sizeof(params), backend_.get()) != OrthancPluginErrorCode_Success) 1858 if (OrthancPluginRegisterDatabaseBackendV3(context, &params, sizeof(params), backend) != OrthancPluginErrorCode_Success)
1849 { 1859 {
1850 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Unable to register the database backend"); 1860 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Unable to register the database backend");
1851 } 1861 }
1852 1862
1853 backend_->SetOutputFactory(new Factory); 1863 backend->SetOutputFactory(new Factory);
1864
1865 isBackendInUse_ = true;
1854 } 1866 }
1855 1867
1856 1868
1857 void DatabaseBackendAdapterV3::Finalize() 1869 void DatabaseBackendAdapterV3::Finalize()
1858 { 1870 {
1859 backend_.reset(NULL); 1871 if (isBackendInUse_)
1872 {
1873 fprintf(stderr, "The Orthanc core has not destructed the index backend, internal error\n");
1874 }
1860 } 1875 }
1861 } 1876 }
1862 1877
1863 # endif 1878 # endif
1864 #endif 1879 #endif