Mercurial > hg > orthanc-databases
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(¶ms, 0, sizeof(params)); | 1785 memset(¶ms, 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, ¶ms, sizeof(params), backend_.get()) != OrthancPluginErrorCode_Success) | 1858 if (OrthancPluginRegisterDatabaseBackendV3(context, ¶ms, 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 |