1 /**
2  * Orthanc - A Lightweight, RESTful DICOM Store
3  * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4  * Department, University Hospital of Liege, Belgium
5  * Copyright (C) 2017-2021 Osimis S.A., Belgium
6  *
7  * This program is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * In addition, as a special exception, the copyright holders of this
13  * program give permission to link the code of its release with the
14  * OpenSSL project's "OpenSSL" library (or with modified versions of it
15  * that use the same license as the "OpenSSL" library), and distribute
16  * the linked executables. You must obey the GNU General Public License
17  * in all respects for all of the code used other than "OpenSSL". If you
18  * modify file(s) with this exception, you may extend this exception to
19  * your version of the file(s), but you are not obligated to do so. If
20  * you do not wish to do so, delete this exception statement from your
21  * version. If you delete this exception statement from all source files
22  * in the program, then also delete it here.
23  *
24  * This program is distributed in the hope that it will be useful, but
25  * WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27  * General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program. If not, see <http://www.gnu.org/licenses/>.
31  **/
32 
33 
34 #pragma once
35 
36 #include "../../../../OrthancFramework/Sources/DicomFormat/DicomMap.h"
37 #include "../../../../OrthancFramework/Sources/DicomFormat/DicomTag.h"
38 #include "../../../../OrthancFramework/Sources/Enumerations.h"
39 #include "../../../../OrthancFramework/Sources/FileStorage/FileInfo.h"
40 #include "../../../../OrthancFramework/Sources/SQLite/Connection.h"
41 #include "../../../Sources/ExportedResource.h"
42 #include "../../../Sources/ServerIndexChange.h"
43 #include "../../../Sources/ServerEnumerations.h"
44 
45 #include <list>
46 
47 
48 namespace Orthanc
49 {
50   /**
51    * This class is shared between the Orthanc core and the sample
52    * database plugin whose code is in
53    * "../Plugins/Samples/DatabasePlugin".
54    **/
55   class DatabaseWrapperBase
56   {
57   private:
58     SQLite::Connection&  db_;
59 
60     ErrorCode GetChangesInternal(std::list<ServerIndexChange>& target,
61                                  bool& done,
62                                  SQLite::Statement& s,
63                                  uint32_t maxResults);
64 
65     void GetExportedResourcesInternal(std::list<ExportedResource>& target,
66                                       bool& done,
67                                       SQLite::Statement& s,
68                                       uint32_t maxResults);
69 
70   public:
DatabaseWrapperBase(SQLite::Connection & db)71     DatabaseWrapperBase(SQLite::Connection& db) : db_(db)
72     {
73     }
74 
75     void SetGlobalProperty(GlobalProperty property,
76                            const std::string& value);
77 
78     bool LookupGlobalProperty(std::string& target,
79                               GlobalProperty property);
80 
81     int64_t CreateResource(const std::string& publicId,
82                            ResourceType type);
83 
84     bool LookupResource(int64_t& id,
85                         ResourceType& type,
86                         const std::string& publicId);
87 
88     ErrorCode LookupParent(bool& found,
89                            int64_t& parentId,
90                            int64_t resourceId);
91 
92     bool GetPublicId(std::string& result,
93                      int64_t resourceId);
94 
95     ErrorCode GetResourceType(ResourceType& result,
96                               int64_t resourceId);
97 
98     void AttachChild(int64_t parent,
99                      int64_t child);
100 
101     void SetMetadata(int64_t id,
102                      MetadataType type,
103                      const std::string& value);
104 
105     void DeleteMetadata(int64_t id,
106                         MetadataType type);
107 
108     bool LookupMetadata(std::string& target,
109                         int64_t id,
110                         MetadataType type);
111 
112     void ListAvailableMetadata(std::list<MetadataType>& target,
113                                int64_t id);
114 
115     void AddAttachment(int64_t id,
116                        const FileInfo& attachment);
117 
118     void DeleteAttachment(int64_t id,
119                           FileContentType attachment);
120 
121     void ListAvailableAttachments(std::list<FileContentType>& target,
122                                   int64_t id);
123 
124     bool LookupAttachment(FileInfo& attachment,
125                           int64_t id,
126                           FileContentType contentType);
127 
128 
129     void ClearMainDicomTags(int64_t id);
130 
131 
132     void SetMainDicomTag(int64_t id,
133                          const DicomTag& tag,
134                          const std::string& value);
135 
136     void SetIdentifierTag(int64_t id,
137                           const DicomTag& tag,
138                           const std::string& value);
139 
140     void GetMainDicomTags(DicomMap& map,
141                           int64_t id);
142 
143     void GetChildrenPublicId(std::list<std::string>& target,
144                              int64_t id);
145 
146     void GetChildrenInternalId(std::list<int64_t>& target,
147                                int64_t id);
148 
149     void LogChange(int64_t internalId,
150                    const ServerIndexChange& change);
151 
152     ErrorCode GetChanges(std::list<ServerIndexChange>& target,
153                          bool& done,
154                          int64_t since,
155                          uint32_t maxResults);
156 
157     ErrorCode GetLastChange(std::list<ServerIndexChange>& target);
158 
159     void LogExportedResource(const ExportedResource& resource);
160 
161     void GetExportedResources(std::list<ExportedResource>& target,
162                               bool& done,
163                               int64_t since,
164                               uint32_t maxResults);
165 
166     void GetLastExportedResource(std::list<ExportedResource>& target);
167 
168     uint64_t GetTotalCompressedSize();
169 
170     uint64_t GetTotalUncompressedSize();
171 
172     void GetAllInternalIds(std::list<int64_t>& target,
173                            ResourceType resourceType);
174 
175     void GetAllPublicIds(std::list<std::string>& target,
176                          ResourceType resourceType);
177 
178     void GetAllPublicIds(std::list<std::string>& target,
179                          ResourceType resourceType,
180                          size_t since,
181                          size_t limit);
182 
183     uint64_t GetResourceCount(ResourceType resourceType);
184 
185     bool SelectPatientToRecycle(int64_t& internalId);
186 
187     bool SelectPatientToRecycle(int64_t& internalId,
188                                 int64_t patientIdToAvoid);
189 
190     bool IsProtectedPatient(int64_t internalId);
191 
192     void SetProtectedPatient(int64_t internalId,
193                              bool isProtected);
194 
195     bool IsExistingResource(int64_t internalId);
196 
197     void LookupIdentifier(std::list<int64_t>& result,
198                           ResourceType level,
199                           const DicomTag& tag,
200                           IdentifierConstraintType type,
201                           const std::string& value);
202 
203     void LookupIdentifierRange(std::list<int64_t>& result,
204                                ResourceType level,
205                                const DicomTag& tag,
206                                const std::string& start,
207                                const std::string& end);
208   };
209 }
210 
211