Orthanc Plugin SDK  1.12.8
Documentation of the plugin interface of Orthanc
OrthancCDatabasePlugin.h
1 
29 #pragma once
30 
31 #include "OrthancCPlugin.h"
32 
33 
36 #ifdef __cplusplus
37 extern "C"
38 {
39 #endif
40 
41 
46  typedef struct _OrthancPluginDatabaseContext_t OrthancPluginDatabaseContext;
47 
48 
54  typedef struct _OrthancPluginDatabaseTransaction_t OrthancPluginDatabaseTransaction;
55 
56 
57 /*<! @cond Doxygen_Suppress */
58  typedef enum
59  {
60  _OrthancPluginDatabaseAnswerType_None = 0,
61 
62  /* Events */
63  _OrthancPluginDatabaseAnswerType_DeletedAttachment = 1,
64  _OrthancPluginDatabaseAnswerType_DeletedResource = 2,
65  _OrthancPluginDatabaseAnswerType_RemainingAncestor = 3,
66 
67  /* Return value */
68  _OrthancPluginDatabaseAnswerType_Attachment = 10,
69  _OrthancPluginDatabaseAnswerType_Change = 11,
70  _OrthancPluginDatabaseAnswerType_DicomTag = 12,
71  _OrthancPluginDatabaseAnswerType_ExportedResource = 13,
72  _OrthancPluginDatabaseAnswerType_Int32 = 14,
73  _OrthancPluginDatabaseAnswerType_Int64 = 15,
74  _OrthancPluginDatabaseAnswerType_Resource = 16,
75  _OrthancPluginDatabaseAnswerType_String = 17,
76  _OrthancPluginDatabaseAnswerType_MatchingResource = 18, /* New in Orthanc 1.5.2 */
77  _OrthancPluginDatabaseAnswerType_Metadata = 19, /* New in Orthanc 1.5.4 */
78 
79  _OrthancPluginDatabaseAnswerType_INTERNAL = 0x7fffffff
80  } _OrthancPluginDatabaseAnswerType;
81 
82 
83  typedef enum
84  {
85  OrthancPluginDatabaseTransactionType_ReadOnly = 1,
86  OrthancPluginDatabaseTransactionType_ReadWrite = 2,
87  OrthancPluginDatabaseTransactionType_INTERNAL = 0x7fffffff
88  } OrthancPluginDatabaseTransactionType;
89 
90 
91  typedef enum
92  {
93  OrthancPluginDatabaseEventType_DeletedAttachment = 1,
94  OrthancPluginDatabaseEventType_DeletedResource = 2,
95  OrthancPluginDatabaseEventType_RemainingAncestor = 3,
96  OrthancPluginDatabaseEventType_INTERNAL = 0x7fffffff
97  } OrthancPluginDatabaseEventType;
98 
99 
100  typedef struct
101  {
102  const char* uuid;
103  int32_t contentType;
104  uint64_t uncompressedSize;
105  const char* uncompressedHash;
106  int32_t compressionType;
107  uint64_t compressedSize;
108  const char* compressedHash;
109  } OrthancPluginAttachment;
110 
111  typedef struct
112  {
113  uint16_t group;
114  uint16_t element;
115  const char* value;
116  } OrthancPluginDicomTag;
117 
118  typedef struct
119  {
120  int64_t seq;
121  int32_t changeType;
122  OrthancPluginResourceType resourceType;
123  const char* publicId;
124  const char* date;
125  } OrthancPluginChange;
126 
127  typedef struct
128  {
129  int64_t seq;
130  OrthancPluginResourceType resourceType;
131  const char* publicId;
132  const char* modality;
133  const char* date;
134  const char* patientId;
135  const char* studyInstanceUid;
136  const char* seriesInstanceUid;
137  const char* sopInstanceUid;
138  } OrthancPluginExportedResource;
139 
140  typedef struct /* New in Orthanc 1.5.2 */
141  {
143  uint16_t tagGroup;
144  uint16_t tagElement;
145  uint8_t isIdentifierTag;
146  uint8_t isCaseSensitive;
147  uint8_t isMandatory;
149  uint32_t valuesCount;
150  const char* const* values;
151  } OrthancPluginDatabaseConstraint;
152 
153  typedef struct /* New in Orthanc 1.5.2 */
154  {
155  const char* resourceId;
156  const char* someInstanceId; /* Can be NULL if not requested */
157  } OrthancPluginMatchingResource;
158 
159  typedef struct /* New in Orthanc 1.5.2 */
160  {
161  /* Mandatory field */
162  uint8_t isNewInstance;
163  int64_t instanceId;
164 
165  /* The following fields must only be set if "isNewInstance" is "true" */
166  uint8_t isNewPatient;
167  uint8_t isNewStudy;
168  uint8_t isNewSeries;
169  int64_t patientId;
170  int64_t studyId;
171  int64_t seriesId;
172  } OrthancPluginCreateInstanceResult;
173 
174  typedef struct /* New in Orthanc 1.5.2 */
175  {
176  int64_t resource;
177  uint16_t group;
178  uint16_t element;
179  const char* value;
180  } OrthancPluginResourcesContentTags;
181 
182  typedef struct /* New in Orthanc 1.5.2 */
183  {
184  int64_t resource;
185  int32_t metadata;
186  const char* value;
187  } OrthancPluginResourcesContentMetadata;
188 
189 
190  typedef struct
191  {
193  _OrthancPluginDatabaseAnswerType type;
194  int32_t valueInt32;
195  uint32_t valueUint32;
196  int64_t valueInt64;
197  const char *valueString;
198  const void *valueGeneric;
199  } _OrthancPluginDatabaseAnswer;
200 
201  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerString(
202  OrthancPluginContext* context,
204  const char* value)
205  {
206  _OrthancPluginDatabaseAnswer params;
207  memset(&params, 0, sizeof(params));
208  params.database = database;
209  params.type = _OrthancPluginDatabaseAnswerType_String;
210  params.valueString = value;
211  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
212  }
213 
214  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerChange(
215  OrthancPluginContext* context,
217  const OrthancPluginChange* change)
218  {
219  _OrthancPluginDatabaseAnswer params;
220  memset(&params, 0, sizeof(params));
221 
222  params.database = database;
223  params.type = _OrthancPluginDatabaseAnswerType_Change;
224  params.valueUint32 = 0;
225  params.valueGeneric = change;
226 
227  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
228  }
229 
230  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerChangesDone(
231  OrthancPluginContext* context,
233  {
234  _OrthancPluginDatabaseAnswer params;
235  memset(&params, 0, sizeof(params));
236 
237  params.database = database;
238  params.type = _OrthancPluginDatabaseAnswerType_Change;
239  params.valueUint32 = 1;
240  params.valueGeneric = NULL;
241 
242  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
243  }
244 
245  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerInt32(
246  OrthancPluginContext* context,
248  int32_t value)
249  {
250  _OrthancPluginDatabaseAnswer params;
251  memset(&params, 0, sizeof(params));
252  params.database = database;
253  params.type = _OrthancPluginDatabaseAnswerType_Int32;
254  params.valueInt32 = value;
255  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
256  }
257 
258  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerInt64(
259  OrthancPluginContext* context,
261  int64_t value)
262  {
263  _OrthancPluginDatabaseAnswer params;
264  memset(&params, 0, sizeof(params));
265  params.database = database;
266  params.type = _OrthancPluginDatabaseAnswerType_Int64;
267  params.valueInt64 = value;
268  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
269  }
270 
271  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerExportedResource(
272  OrthancPluginContext* context,
274  const OrthancPluginExportedResource* exported)
275  {
276  _OrthancPluginDatabaseAnswer params;
277  memset(&params, 0, sizeof(params));
278 
279  params.database = database;
280  params.type = _OrthancPluginDatabaseAnswerType_ExportedResource;
281  params.valueUint32 = 0;
282  params.valueGeneric = exported;
283  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
284  }
285 
286  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerExportedResourcesDone(
287  OrthancPluginContext* context,
289  {
290  _OrthancPluginDatabaseAnswer params;
291  memset(&params, 0, sizeof(params));
292 
293  params.database = database;
294  params.type = _OrthancPluginDatabaseAnswerType_ExportedResource;
295  params.valueUint32 = 1;
296  params.valueGeneric = NULL;
297  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
298  }
299 
300  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerDicomTag(
301  OrthancPluginContext* context,
303  const OrthancPluginDicomTag* tag)
304  {
305  _OrthancPluginDatabaseAnswer params;
306  memset(&params, 0, sizeof(params));
307  params.database = database;
308  params.type = _OrthancPluginDatabaseAnswerType_DicomTag;
309  params.valueGeneric = tag;
310  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
311  }
312 
313  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerAttachment(
314  OrthancPluginContext* context,
316  const OrthancPluginAttachment* attachment)
317  {
318  _OrthancPluginDatabaseAnswer params;
319  memset(&params, 0, sizeof(params));
320  params.database = database;
321  params.type = _OrthancPluginDatabaseAnswerType_Attachment;
322  params.valueGeneric = attachment;
323  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
324  }
325 
326  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerResource(
327  OrthancPluginContext* context,
329  int64_t id,
330  OrthancPluginResourceType resourceType)
331  {
332  _OrthancPluginDatabaseAnswer params;
333  memset(&params, 0, sizeof(params));
334  params.database = database;
335  params.type = _OrthancPluginDatabaseAnswerType_Resource;
336  params.valueInt64 = id;
337  params.valueInt32 = (int32_t) resourceType;
338  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
339  }
340 
341  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerMatchingResource(
342  OrthancPluginContext* context,
344  const OrthancPluginMatchingResource* match)
345  {
346  _OrthancPluginDatabaseAnswer params;
347  memset(&params, 0, sizeof(params));
348  params.database = database;
349  params.type = _OrthancPluginDatabaseAnswerType_MatchingResource;
350  params.valueGeneric = match;
351  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
352  }
353 
354  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseAnswerMetadata(
355  OrthancPluginContext* context,
357  int64_t resourceId,
358  int32_t type,
359  const char* value)
360  {
361  OrthancPluginResourcesContentMetadata metadata;
362  _OrthancPluginDatabaseAnswer params;
363  metadata.resource = resourceId;
364  metadata.metadata = type;
365  metadata.value = value;
366  memset(&params, 0, sizeof(params));
367  params.database = database;
368  params.type = _OrthancPluginDatabaseAnswerType_Metadata;
369  params.valueGeneric = &metadata;
370  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
371  }
372 
373  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseSignalDeletedAttachment(
374  OrthancPluginContext* context,
376  const OrthancPluginAttachment* attachment)
377  {
378  _OrthancPluginDatabaseAnswer params;
379  memset(&params, 0, sizeof(params));
380  params.database = database;
381  params.type = _OrthancPluginDatabaseAnswerType_DeletedAttachment;
382  params.valueGeneric = attachment;
383  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
384  }
385 
386  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseSignalDeletedResource(
387  OrthancPluginContext* context,
389  const char* publicId,
390  OrthancPluginResourceType resourceType)
391  {
392  _OrthancPluginDatabaseAnswer params;
393  memset(&params, 0, sizeof(params));
394  params.database = database;
395  params.type = _OrthancPluginDatabaseAnswerType_DeletedResource;
396  params.valueString = publicId;
397  params.valueInt32 = (int32_t) resourceType;
398  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
399  }
400 
401  ORTHANC_PLUGIN_INLINE void OrthancPluginDatabaseSignalRemainingAncestor(
402  OrthancPluginContext* context,
404  const char* ancestorId,
405  OrthancPluginResourceType ancestorType)
406  {
407  _OrthancPluginDatabaseAnswer params;
408  memset(&params, 0, sizeof(params));
409  params.database = database;
410  params.type = _OrthancPluginDatabaseAnswerType_RemainingAncestor;
411  params.valueString = ancestorId;
412  params.valueInt32 = (int32_t) ancestorType;
413  context->InvokeService(context, _OrthancPluginService_DatabaseAnswer, &params);
414  }
415 
416 
417 
418 
419 
420  typedef struct
421  {
422  OrthancPluginErrorCode (*addAttachment) (
423  /* inputs */
424  void* payload,
425  int64_t id,
426  const OrthancPluginAttachment* attachment);
427 
428  OrthancPluginErrorCode (*attachChild) (
429  /* inputs */
430  void* payload,
431  int64_t parent,
432  int64_t child);
433 
434  OrthancPluginErrorCode (*clearChanges) (
435  /* inputs */
436  void* payload);
437 
438  OrthancPluginErrorCode (*clearExportedResources) (
439  /* inputs */
440  void* payload);
441 
442  OrthancPluginErrorCode (*createResource) (
443  /* outputs */
444  int64_t* id,
445  /* inputs */
446  void* payload,
447  const char* publicId,
448  OrthancPluginResourceType resourceType);
449 
450  OrthancPluginErrorCode (*deleteAttachment) (
451  /* inputs */
452  void* payload,
453  int64_t id,
454  int32_t contentType);
455 
456  OrthancPluginErrorCode (*deleteMetadata) (
457  /* inputs */
458  void* payload,
459  int64_t id,
460  int32_t metadataType);
461 
462  OrthancPluginErrorCode (*deleteResource) (
463  /* inputs */
464  void* payload,
465  int64_t id);
466 
467  /* Output: Use OrthancPluginDatabaseAnswerString() */
468  OrthancPluginErrorCode (*getAllPublicIds) (
469  /* outputs */
471  /* inputs */
472  void* payload,
473  OrthancPluginResourceType resourceType);
474 
475  /* Output: Use OrthancPluginDatabaseAnswerChange() and
476  * OrthancPluginDatabaseAnswerChangesDone() */
477  OrthancPluginErrorCode (*getChanges) (
478  /* outputs */
480  /* inputs */
481  void* payload,
482  int64_t since,
483  uint32_t maxResult);
484 
485  /* Output: Use OrthancPluginDatabaseAnswerInt64() */
486  OrthancPluginErrorCode (*getChildrenInternalId) (
487  /* outputs */
489  /* inputs */
490  void* payload,
491  int64_t id);
492 
493  /* Output: Use OrthancPluginDatabaseAnswerString() */
494  OrthancPluginErrorCode (*getChildrenPublicId) (
495  /* outputs */
497  /* inputs */
498  void* payload,
499  int64_t id);
500 
501  /* Output: Use OrthancPluginDatabaseAnswerExportedResource() and
502  * OrthancPluginDatabaseAnswerExportedResourcesDone() */
503  OrthancPluginErrorCode (*getExportedResources) (
504  /* outputs */
506  /* inputs */
507  void* payload,
508  int64_t since,
509  uint32_t maxResult);
510 
511  /* Output: Use OrthancPluginDatabaseAnswerChange() */
512  OrthancPluginErrorCode (*getLastChange) (
513  /* outputs */
515  /* inputs */
516  void* payload);
517 
518  /* Output: Use OrthancPluginDatabaseAnswerExportedResource() */
519  OrthancPluginErrorCode (*getLastExportedResource) (
520  /* outputs */
522  /* inputs */
523  void* payload);
524 
525  /* Output: Use OrthancPluginDatabaseAnswerDicomTag() */
526  OrthancPluginErrorCode (*getMainDicomTags) (
527  /* outputs */
529  /* inputs */
530  void* payload,
531  int64_t id);
532 
533  /* Output: Use OrthancPluginDatabaseAnswerString() */
534  OrthancPluginErrorCode (*getPublicId) (
535  /* outputs */
537  /* inputs */
538  void* payload,
539  int64_t id);
540 
541  OrthancPluginErrorCode (*getResourceCount) (
542  /* outputs */
543  uint64_t* target,
544  /* inputs */
545  void* payload,
546  OrthancPluginResourceType resourceType);
547 
548  OrthancPluginErrorCode (*getResourceType) (
549  /* outputs */
550  OrthancPluginResourceType* resourceType,
551  /* inputs */
552  void* payload,
553  int64_t id);
554 
555  OrthancPluginErrorCode (*getTotalCompressedSize) (
556  /* outputs */
557  uint64_t* target,
558  /* inputs */
559  void* payload);
560 
561  OrthancPluginErrorCode (*getTotalUncompressedSize) (
562  /* outputs */
563  uint64_t* target,
564  /* inputs */
565  void* payload);
566 
567  OrthancPluginErrorCode (*isExistingResource) (
568  /* outputs */
569  int32_t* existing,
570  /* inputs */
571  void* payload,
572  int64_t id);
573 
574  OrthancPluginErrorCode (*isProtectedPatient) (
575  /* outputs */
576  int32_t* isProtected,
577  /* inputs */
578  void* payload,
579  int64_t id);
580 
581  /* Output: Use OrthancPluginDatabaseAnswerInt32() */
582  OrthancPluginErrorCode (*listAvailableMetadata) (
583  /* outputs */
585  /* inputs */
586  void* payload,
587  int64_t id);
588 
589  /* Output: Use OrthancPluginDatabaseAnswerInt32() */
590  OrthancPluginErrorCode (*listAvailableAttachments) (
591  /* outputs */
593  /* inputs */
594  void* payload,
595  int64_t id);
596 
597  OrthancPluginErrorCode (*logChange) (
598  /* inputs */
599  void* payload,
600  const OrthancPluginChange* change);
601 
602  OrthancPluginErrorCode (*logExportedResource) (
603  /* inputs */
604  void* payload,
605  const OrthancPluginExportedResource* exported);
606 
607  /* Output: Use OrthancPluginDatabaseAnswerAttachment() */
608  OrthancPluginErrorCode (*lookupAttachment) (
609  /* outputs */
611  /* inputs */
612  void* payload,
613  int64_t id,
614  int32_t contentType);
615 
616  /* Output: Use OrthancPluginDatabaseAnswerString() */
617  OrthancPluginErrorCode (*lookupGlobalProperty) (
618  /* outputs */
620  /* inputs */
621  void* payload,
622  int32_t property);
623 
624  /* Use "OrthancPluginDatabaseExtensions::lookupIdentifier3"
625  instead of this function as of Orthanc 0.9.5 (db v6), can be set to NULL.
626  Output: Use OrthancPluginDatabaseAnswerInt64() */
627  OrthancPluginErrorCode (*lookupIdentifier) (
628  /* outputs */
630  /* inputs */
631  void* payload,
632  const OrthancPluginDicomTag* tag);
633 
634  /* Unused starting with Orthanc 0.9.5 (db v6), can be set to NULL.
635  Output: Use OrthancPluginDatabaseAnswerInt64() */
636  OrthancPluginErrorCode (*lookupIdentifier2) (
637  /* outputs */
639  /* inputs */
640  void* payload,
641  const char* value);
642 
643  /* Output: Use OrthancPluginDatabaseAnswerString() */
644  OrthancPluginErrorCode (*lookupMetadata) (
645  /* outputs */
647  /* inputs */
648  void* payload,
649  int64_t id,
650  int32_t metadata);
651 
652  /* Output: Use OrthancPluginDatabaseAnswerInt64() */
653  OrthancPluginErrorCode (*lookupParent) (
654  /* outputs */
656  /* inputs */
657  void* payload,
658  int64_t id);
659 
660  /* Output: Use OrthancPluginDatabaseAnswerResource() */
661  OrthancPluginErrorCode (*lookupResource) (
662  /* outputs */
664  /* inputs */
665  void* payload,
666  const char* publicId);
667 
668  /* Output: Use OrthancPluginDatabaseAnswerInt64() */
669  OrthancPluginErrorCode (*selectPatientToRecycle) (
670  /* outputs */
672  /* inputs */
673  void* payload);
674 
675  /* Output: Use OrthancPluginDatabaseAnswerInt64() */
676  OrthancPluginErrorCode (*selectPatientToRecycle2) (
677  /* outputs */
679  /* inputs */
680  void* payload,
681  int64_t patientIdToAvoid);
682 
683  OrthancPluginErrorCode (*setGlobalProperty) (
684  /* inputs */
685  void* payload,
686  int32_t property,
687  const char* value);
688 
689  OrthancPluginErrorCode (*setMainDicomTag) (
690  /* inputs */
691  void* payload,
692  int64_t id,
693  const OrthancPluginDicomTag* tag);
694 
695  OrthancPluginErrorCode (*setIdentifierTag) (
696  /* inputs */
697  void* payload,
698  int64_t id,
699  const OrthancPluginDicomTag* tag);
700 
701  OrthancPluginErrorCode (*setMetadata) (
702  /* inputs */
703  void* payload,
704  int64_t id,
705  int32_t metadata,
706  const char* value);
707 
708  OrthancPluginErrorCode (*setProtectedPatient) (
709  /* inputs */
710  void* payload,
711  int64_t id,
712  int32_t isProtected);
713 
714  OrthancPluginErrorCode (*startTransaction) (
715  /* inputs */
716  void* payload);
717 
718  OrthancPluginErrorCode (*rollbackTransaction) (
719  /* inputs */
720  void* payload);
721 
722  OrthancPluginErrorCode (*commitTransaction) (
723  /* inputs */
724  void* payload);
725 
726  OrthancPluginErrorCode (*open) (
727  /* inputs */
728  void* payload);
729 
730  OrthancPluginErrorCode (*close) (
731  /* inputs */
732  void* payload);
733 
734  } OrthancPluginDatabaseBackend;
735 
736 
737  typedef struct
738  {
743  /* Output: Use OrthancPluginDatabaseAnswerString() */
744  OrthancPluginErrorCode (*getAllPublicIdsWithLimit) (
745  /* outputs */
747  /* inputs */
748  void* payload,
749  OrthancPluginResourceType resourceType,
750  uint64_t since,
751  uint64_t limit);
752 
753  OrthancPluginErrorCode (*getDatabaseVersion) (
754  /* outputs */
755  uint32_t* version,
756  /* inputs */
757  void* payload);
758 
759  OrthancPluginErrorCode (*upgradeDatabase) (
760  /* inputs */
761  void* payload,
762  uint32_t targetVersion,
763  OrthancPluginStorageArea* storageArea);
764 
765  OrthancPluginErrorCode (*clearMainDicomTags) (
766  /* inputs */
767  void* payload,
768  int64_t id);
769 
770  /* Output: Use OrthancPluginDatabaseAnswerInt64() */
771  OrthancPluginErrorCode (*getAllInternalIds) (
772  /* outputs */
774  /* inputs */
775  void* payload,
776  OrthancPluginResourceType resourceType);
777 
778  /* Output: Use OrthancPluginDatabaseAnswerInt64() */
779  OrthancPluginErrorCode (*lookupIdentifier3) (
780  /* outputs */
782  /* inputs */
783  void* payload,
784  OrthancPluginResourceType resourceType,
785  const OrthancPluginDicomTag* tag,
787 
788 
793  /* Output: Use OrthancPluginDatabaseAnswerInt64() */
794  OrthancPluginErrorCode (*lookupIdentifierRange) (
795  /* outputs */
797  /* inputs */
798  void* payload,
799  OrthancPluginResourceType resourceType,
800  uint16_t group,
801  uint16_t element,
802  const char* start,
803  const char* end);
804 
805 
810  /* Ouput: Use OrthancPluginDatabaseAnswerMatchingResource */
811  OrthancPluginErrorCode (*lookupResources) (
812  /* outputs */
814  /* inputs */
815  void* payload,
816  uint32_t constraintsCount,
817  const OrthancPluginDatabaseConstraint* constraints,
818  OrthancPluginResourceType queryLevel,
819  uint32_t limit,
820  uint8_t requestSomeInstance);
821 
822  OrthancPluginErrorCode (*createInstance) (
823  /* output */
824  OrthancPluginCreateInstanceResult* output,
825  /* inputs */
826  void* payload,
827  const char* hashPatient,
828  const char* hashStudy,
829  const char* hashSeries,
830  const char* hashInstance);
831 
832  OrthancPluginErrorCode (*setResourcesContent) (
833  /* inputs */
834  void* payload,
835  uint32_t countIdentifierTags,
836  const OrthancPluginResourcesContentTags* identifierTags,
837  uint32_t countMainDicomTags,
838  const OrthancPluginResourcesContentTags* mainDicomTags,
839  uint32_t countMetadata,
840  const OrthancPluginResourcesContentMetadata* metadata);
841 
842  /* Ouput: Use OrthancPluginDatabaseAnswerString */
843  OrthancPluginErrorCode (*getChildrenMetadata) (
844  /* outputs */
846  /* inputs */
847  void* payload,
848  int64_t resourceId,
849  int32_t metadata);
850 
851  OrthancPluginErrorCode (*getLastChangeIndex) (
852  /* outputs */
853  int64_t* target,
854  /* inputs */
855  void* payload);
856 
857  OrthancPluginErrorCode (*tagMostRecentPatient) (
858  /* inputs */
859  void* payload,
860  int64_t patientId);
861 
862 
867  /* Ouput: Use OrthancPluginDatabaseAnswerMetadata */
868  OrthancPluginErrorCode (*getAllMetadata) (
869  /* outputs */
871  /* inputs */
872  void* payload,
873  int64_t resourceId);
874 
875  /* Ouput: Use OrthancPluginDatabaseAnswerString to send
876  the public ID of the parent (if the resource is not a patient) */
877  OrthancPluginErrorCode (*lookupResourceAndParent) (
878  /* outputs */
880  uint8_t* isExisting,
881  int64_t* id,
883 
884  /* inputs */
885  void* payload,
886  const char* publicId);
887 
888  } OrthancPluginDatabaseExtensions;
889 
890 /*<! @endcond */
891 
892 
893  typedef struct
894  {
896  const OrthancPluginDatabaseBackend* backend;
897  void* payload;
898  } _OrthancPluginRegisterDatabaseBackend;
899 
912  OrthancPluginContext* context,
913  const OrthancPluginDatabaseBackend* backend,
914  void* payload)
915  {
916  OrthancPluginDatabaseContext* result = NULL;
917  _OrthancPluginRegisterDatabaseBackend params;
918 
919  if (sizeof(int32_t) != sizeof(_OrthancPluginDatabaseAnswerType) ||
920  sizeof(int32_t) != sizeof(OrthancPluginDatabaseTransactionType) ||
921  sizeof(int32_t) != sizeof(OrthancPluginDatabaseEventType))
922  {
923  return NULL;
924  }
925 
926  memset(&params, 0, sizeof(params));
927  params.backend = backend;
928  params.result = &result;
929  params.payload = payload;
930 
931  if (context->InvokeService(context, _OrthancPluginService_RegisterDatabaseBackend, &params) ||
932  result == NULL)
933  {
934  /* Error */
935  return NULL;
936  }
937  else
938  {
939  return result;
940  }
941  }
942 
943 
944  typedef struct
945  {
947  const OrthancPluginDatabaseBackend* backend;
948  void* payload;
949  const OrthancPluginDatabaseExtensions* extensions;
950  uint32_t extensionsSize;
951  } _OrthancPluginRegisterDatabaseBackendV2;
952 
953 
965  OrthancPluginContext* context,
966  const OrthancPluginDatabaseBackend* backend,
967  const OrthancPluginDatabaseExtensions* extensions,
968  void* payload)
969  {
970  OrthancPluginDatabaseContext* result = NULL;
971  _OrthancPluginRegisterDatabaseBackendV2 params;
972 
973  if (sizeof(int32_t) != sizeof(_OrthancPluginDatabaseAnswerType) ||
974  sizeof(int32_t) != sizeof(OrthancPluginDatabaseTransactionType) ||
975  sizeof(int32_t) != sizeof(OrthancPluginDatabaseEventType))
976  {
977  return NULL;
978  }
979 
980  memset(&params, 0, sizeof(params));
981  params.backend = backend;
982  params.result = &result;
983  params.payload = payload;
984  params.extensions = extensions;
985  params.extensionsSize = sizeof(OrthancPluginDatabaseExtensions);
986 
987  if (context->InvokeService(context, _OrthancPluginService_RegisterDatabaseBackendV2, &params) ||
988  result == NULL)
989  {
990  /* Error */
991  return NULL;
992  }
993  else
994  {
995  return result;
996  }
997  }
998 
999 
1000 
1005 /*<! @cond Doxygen_Suppress */
1006  typedef struct
1007  {
1008  OrthancPluginDatabaseEventType type;
1009 
1010  union
1011  {
1012  struct
1013  {
1014  /* For ""DeletedResource" and "RemainingAncestor" */
1016  const char* publicId;
1017  } resource;
1018 
1019  /* For "DeletedAttachment" */
1020  OrthancPluginAttachment attachment;
1021 
1022  } content;
1023 
1024  } OrthancPluginDatabaseEvent;
1025 
1026 
1027  typedef struct
1028  {
1033  OrthancPluginErrorCode (*readAnswersCount) (OrthancPluginDatabaseTransaction* transaction,
1034  uint32_t* target /* out */);
1035 
1036  OrthancPluginErrorCode (*readAnswerAttachment) (OrthancPluginDatabaseTransaction* transaction,
1037  OrthancPluginAttachment* target /* out */,
1038  uint32_t index);
1039 
1040  OrthancPluginErrorCode (*readAnswerChange) (OrthancPluginDatabaseTransaction* transaction,
1041  OrthancPluginChange* target /* out */,
1042  uint32_t index);
1043 
1044  OrthancPluginErrorCode (*readAnswerDicomTag) (OrthancPluginDatabaseTransaction* transaction,
1045  uint16_t* group,
1046  uint16_t* element,
1047  const char** value,
1048  uint32_t index);
1049 
1050  OrthancPluginErrorCode (*readAnswerExportedResource) (OrthancPluginDatabaseTransaction* transaction,
1051  OrthancPluginExportedResource* target /* out */,
1052  uint32_t index);
1053 
1054  OrthancPluginErrorCode (*readAnswerInt32) (OrthancPluginDatabaseTransaction* transaction,
1055  int32_t* target /* out */,
1056  uint32_t index);
1057 
1058  OrthancPluginErrorCode (*readAnswerInt64) (OrthancPluginDatabaseTransaction* transaction,
1059  int64_t* target /* out */,
1060  uint32_t index);
1061 
1062  OrthancPluginErrorCode (*readAnswerMatchingResource) (OrthancPluginDatabaseTransaction* transaction,
1063  OrthancPluginMatchingResource* target /* out */,
1064  uint32_t index);
1065 
1066  OrthancPluginErrorCode (*readAnswerMetadata) (OrthancPluginDatabaseTransaction* transaction,
1067  int32_t* metadata /* out */,
1068  const char** value /* out */,
1069  uint32_t index);
1070 
1071  OrthancPluginErrorCode (*readAnswerString) (OrthancPluginDatabaseTransaction* transaction,
1072  const char** target /* out */,
1073  uint32_t index);
1074 
1075  OrthancPluginErrorCode (*readEventsCount) (OrthancPluginDatabaseTransaction* transaction,
1076  uint32_t* target /* out */);
1077 
1078  OrthancPluginErrorCode (*readEvent) (OrthancPluginDatabaseTransaction* transaction,
1079  OrthancPluginDatabaseEvent* event /* out */,
1080  uint32_t index);
1081 
1082 
1083 
1089  OrthancPluginErrorCode (*open) (void* database);
1090 
1091  OrthancPluginErrorCode (*close) (void* database);
1092 
1093  OrthancPluginErrorCode (*destructDatabase) (void* database);
1094 
1095  OrthancPluginErrorCode (*getDatabaseVersion) (void* database,
1096  uint32_t* target /* out */);
1097 
1098  OrthancPluginErrorCode (*hasRevisionsSupport) (void* database,
1099  uint8_t* target /* out */);
1100 
1101  OrthancPluginErrorCode (*upgradeDatabase) (void* database,
1102  OrthancPluginStorageArea* storageArea,
1103  uint32_t targetVersion);
1104 
1105  OrthancPluginErrorCode (*startTransaction) (void* database,
1106  OrthancPluginDatabaseTransaction** target /* out */,
1107  OrthancPluginDatabaseTransactionType type);
1108 
1109  OrthancPluginErrorCode (*destructTransaction) (OrthancPluginDatabaseTransaction* transaction);
1110 
1111 
1117  OrthancPluginErrorCode (*rollback) (OrthancPluginDatabaseTransaction* transaction);
1118 
1120  int64_t fileSizeDelta);
1121 
1122  /* A call to "addAttachment()" guarantees that this attachment is not already existing ("INSERT") */
1123  OrthancPluginErrorCode (*addAttachment) (OrthancPluginDatabaseTransaction* transaction,
1124  int64_t id,
1125  const OrthancPluginAttachment* attachment,
1126  int64_t revision);
1127 
1128  OrthancPluginErrorCode (*clearChanges) (OrthancPluginDatabaseTransaction* transaction);
1129 
1130  OrthancPluginErrorCode (*clearExportedResources) (OrthancPluginDatabaseTransaction* transaction);
1131 
1132  OrthancPluginErrorCode (*clearMainDicomTags) (OrthancPluginDatabaseTransaction* transaction,
1133  int64_t resourceId);
1134 
1135  OrthancPluginErrorCode (*createInstance) (OrthancPluginDatabaseTransaction* transaction,
1136  OrthancPluginCreateInstanceResult* target /* out */,
1137  const char* hashPatient,
1138  const char* hashStudy,
1139  const char* hashSeries,
1140  const char* hashInstance);
1141 
1142  OrthancPluginErrorCode (*deleteAttachment) (OrthancPluginDatabaseTransaction* transaction,
1143  int64_t id,
1144  int32_t contentType);
1145 
1146  OrthancPluginErrorCode (*deleteMetadata) (OrthancPluginDatabaseTransaction* transaction,
1147  int64_t id,
1148  int32_t metadataType);
1149 
1150  OrthancPluginErrorCode (*deleteResource) (OrthancPluginDatabaseTransaction* transaction,
1151  int64_t id);
1152 
1153  /* Answers are read using "readAnswerMetadata()" */
1154  OrthancPluginErrorCode (*getAllMetadata) (OrthancPluginDatabaseTransaction* transaction,
1155  int64_t id);
1156 
1157  /* Answers are read using "readAnswerString()" */
1158  OrthancPluginErrorCode (*getAllPublicIds) (OrthancPluginDatabaseTransaction* transaction,
1159  OrthancPluginResourceType resourceType);
1160 
1161  /* Answers are read using "readAnswerString()" */
1162  OrthancPluginErrorCode (*getAllPublicIdsWithLimit) (OrthancPluginDatabaseTransaction* transaction,
1163  OrthancPluginResourceType resourceType,
1164  uint64_t since,
1165  uint64_t limit);
1166 
1167  /* Answers are read using "readAnswerChange()" */
1168  OrthancPluginErrorCode (*getChanges) (OrthancPluginDatabaseTransaction* transaction,
1169  uint8_t* targetDone /* out */,
1170  int64_t since,
1171  uint32_t maxResults);
1172 
1173  /* Answers are read using "readAnswerInt64()" */
1174  OrthancPluginErrorCode (*getChildrenInternalId) (OrthancPluginDatabaseTransaction* transaction,
1175  int64_t id);
1176 
1177  /* Answers are read using "readAnswerString()" */
1178  OrthancPluginErrorCode (*getChildrenMetadata) (OrthancPluginDatabaseTransaction* transaction,
1179  int64_t resourceId,
1180  int32_t metadata);
1181 
1182  /* Answers are read using "readAnswerString()" */
1183  OrthancPluginErrorCode (*getChildrenPublicId) (OrthancPluginDatabaseTransaction* transaction,
1184  int64_t id);
1185 
1186  /* Answers are read using "readAnswerExportedResource()" */
1187  OrthancPluginErrorCode (*getExportedResources) (OrthancPluginDatabaseTransaction* transaction,
1188  uint8_t* targetDone /* out */,
1189  int64_t since,
1190  uint32_t maxResults);
1191 
1192  /* Answer is read using "readAnswerChange()" */
1193  OrthancPluginErrorCode (*getLastChange) (OrthancPluginDatabaseTransaction* transaction);
1194 
1195  OrthancPluginErrorCode (*getLastChangeIndex) (OrthancPluginDatabaseTransaction* transaction,
1196  int64_t* target /* out */);
1197 
1198  /* Answer is read using "readAnswerExportedResource()" */
1199  OrthancPluginErrorCode (*getLastExportedResource) (OrthancPluginDatabaseTransaction* transaction);
1200 
1201  /* Answers are read using "readAnswerDicomTag()" */
1202  OrthancPluginErrorCode (*getMainDicomTags) (OrthancPluginDatabaseTransaction* transaction,
1203  int64_t id);
1204 
1205  /* Answer is read using "readAnswerString()" */
1206  OrthancPluginErrorCode (*getPublicId) (OrthancPluginDatabaseTransaction* transaction,
1207  int64_t internalId);
1208 
1209  OrthancPluginErrorCode (*getResourcesCount) (OrthancPluginDatabaseTransaction* transaction,
1210  uint64_t* target /* out */,
1211  OrthancPluginResourceType resourceType);
1212 
1213  OrthancPluginErrorCode (*getResourceType) (OrthancPluginDatabaseTransaction* transaction,
1214  OrthancPluginResourceType* target /* out */,
1215  uint64_t resourceId);
1216 
1217  OrthancPluginErrorCode (*getTotalCompressedSize) (OrthancPluginDatabaseTransaction* transaction,
1218  uint64_t* target /* out */);
1219 
1220  OrthancPluginErrorCode (*getTotalUncompressedSize) (OrthancPluginDatabaseTransaction* transaction,
1221  uint64_t* target /* out */);
1222 
1223  OrthancPluginErrorCode (*isDiskSizeAbove) (OrthancPluginDatabaseTransaction* transaction,
1224  uint8_t* target /* out */,
1225  uint64_t threshold);
1226 
1227  OrthancPluginErrorCode (*isExistingResource) (OrthancPluginDatabaseTransaction* transaction,
1228  uint8_t* target /* out */,
1229  int64_t resourceId);
1230 
1231  OrthancPluginErrorCode (*isProtectedPatient) (OrthancPluginDatabaseTransaction* transaction,
1232  uint8_t* target /* out */,
1233  int64_t resourceId);
1234 
1235  /* Answers are read using "readAnswerInt32()" */
1236  OrthancPluginErrorCode (*listAvailableAttachments) (OrthancPluginDatabaseTransaction* transaction,
1237  int64_t internalId);
1238 
1239  OrthancPluginErrorCode (*logChange) (OrthancPluginDatabaseTransaction* transaction,
1240  int32_t changeType,
1241  int64_t resourceId,
1242  OrthancPluginResourceType resourceType,
1243  const char* date);
1244 
1245  OrthancPluginErrorCode (*logExportedResource) (OrthancPluginDatabaseTransaction* transaction,
1246  OrthancPluginResourceType resourceType,
1247  const char* publicId,
1248  const char* modality,
1249  const char* date,
1250  const char* patientId,
1251  const char* studyInstanceUid,
1252  const char* seriesInstanceUid,
1253  const char* sopInstanceUid);
1254 
1255  /* Answer is read using "readAnswerAttachment()" */
1256  OrthancPluginErrorCode (*lookupAttachment) (OrthancPluginDatabaseTransaction* transaction,
1257  int64_t* revision /* out */,
1258  int64_t resourceId,
1259  int32_t contentType);
1260 
1261  /* Answer is read using "readAnswerString()" */
1262  OrthancPluginErrorCode (*lookupGlobalProperty) (OrthancPluginDatabaseTransaction* transaction,
1263  const char* serverIdentifier,
1264  int32_t property);
1265 
1266  /* Answer is read using "readAnswerString()" */
1267  OrthancPluginErrorCode (*lookupMetadata) (OrthancPluginDatabaseTransaction* transaction,
1268  int64_t* revision /* out */,
1269  int64_t id,
1270  int32_t metadata);
1271 
1272  OrthancPluginErrorCode (*lookupParent) (OrthancPluginDatabaseTransaction* transaction,
1273  uint8_t* isExisting /* out */,
1274  int64_t* parentId /* out */,
1275  int64_t id);
1276 
1277  OrthancPluginErrorCode (*lookupResource) (OrthancPluginDatabaseTransaction* transaction,
1278  uint8_t* isExisting /* out */,
1279  int64_t* id /* out */,
1280  OrthancPluginResourceType* type /* out */,
1281  const char* publicId);
1282 
1283  /* Answers are read using "readAnswerMatchingResource()" */
1284  OrthancPluginErrorCode (*lookupResources) (OrthancPluginDatabaseTransaction* transaction,
1285  uint32_t constraintsCount,
1286  const OrthancPluginDatabaseConstraint* constraints,
1287  OrthancPluginResourceType queryLevel,
1288  uint32_t limit,
1289  uint8_t requestSomeInstanceId);
1290 
1291  /* The public ID of the parent resource is read using "readAnswerString()" */
1292  OrthancPluginErrorCode (*lookupResourceAndParent) (OrthancPluginDatabaseTransaction* transaction,
1293  uint8_t* isExisting /* out */,
1294  int64_t* id /* out */,
1295  OrthancPluginResourceType* type /* out */,
1296  const char* publicId);
1297 
1298  OrthancPluginErrorCode (*selectPatientToRecycle) (OrthancPluginDatabaseTransaction* transaction,
1299  uint8_t* patientAvailable /* out */,
1300  int64_t* patientId /* out */);
1301 
1302  OrthancPluginErrorCode (*selectPatientToRecycle2) (OrthancPluginDatabaseTransaction* transaction,
1303  uint8_t* patientAvailable /* out */,
1304  int64_t* patientId /* out */,
1305  int64_t patientIdToAvoid);
1306 
1307  OrthancPluginErrorCode (*setGlobalProperty) (OrthancPluginDatabaseTransaction* transaction,
1308  const char* serverIdentifier,
1309  int32_t property,
1310  const char* value);
1311 
1312  /* In "setMetadata()", the metadata might already be existing ("INSERT OR REPLACE") */
1313  OrthancPluginErrorCode (*setMetadata) (OrthancPluginDatabaseTransaction* transaction,
1314  int64_t id,
1315  int32_t metadata,
1316  const char* value,
1317  int64_t revision);
1318 
1319  OrthancPluginErrorCode (*setProtectedPatient) (OrthancPluginDatabaseTransaction* transaction,
1320  int64_t id,
1321  uint8_t isProtected);
1322 
1323  OrthancPluginErrorCode (*setResourcesContent) (OrthancPluginDatabaseTransaction* transaction,
1324  uint32_t countIdentifierTags,
1325  const OrthancPluginResourcesContentTags* identifierTags,
1326  uint32_t countMainDicomTags,
1327  const OrthancPluginResourcesContentTags* mainDicomTags,
1328  uint32_t countMetadata,
1329  const OrthancPluginResourcesContentMetadata* metadata);
1330 
1331 
1332  } OrthancPluginDatabaseBackendV3;
1333 
1334 
1335  typedef struct
1336  {
1337  const OrthancPluginDatabaseBackendV3* backend;
1338  uint32_t backendSize;
1339  uint32_t maxDatabaseRetries;
1340  void* database;
1341  } _OrthancPluginRegisterDatabaseBackendV3;
1342 
1343 
1344  ORTHANC_PLUGIN_INLINE OrthancPluginErrorCode OrthancPluginRegisterDatabaseBackendV3(
1345  OrthancPluginContext* context,
1346  const OrthancPluginDatabaseBackendV3* backend,
1347  uint32_t backendSize,
1348  uint32_t maxDatabaseRetries, /* To handle "OrthancPluginErrorCode_DatabaseCannotSerialize" */
1349  void* database)
1350  {
1351  _OrthancPluginRegisterDatabaseBackendV3 params;
1352 
1353  if (sizeof(int32_t) != sizeof(_OrthancPluginDatabaseAnswerType) ||
1354  sizeof(int32_t) != sizeof(OrthancPluginDatabaseTransactionType) ||
1355  sizeof(int32_t) != sizeof(OrthancPluginDatabaseEventType))
1356  {
1358  }
1359 
1360  memset(&params, 0, sizeof(params));
1361  params.backend = backend;
1362  params.backendSize = sizeof(OrthancPluginDatabaseBackendV3);
1363  params.maxDatabaseRetries = maxDatabaseRetries;
1364  params.database = database;
1365 
1366  return context->InvokeService(context, _OrthancPluginService_RegisterDatabaseBackendV3, &params);
1367  }
1368 
1369 /*<! @endcond */
1370 
1371 
1372 #ifdef __cplusplus
1373 }
1374 #endif
1375 
1376 
OrthancPluginErrorCode
Definition: OrthancCPlugin.h:215
struct _OrthancPluginContext_t OrthancPluginContext
Data structure that contains information about the Orthanc core.
struct _OrthancPluginStorageArea_t OrthancPluginStorageArea
Opaque structure that represents the storage area that is actually used by Orthanc.
Definition: OrthancCPlugin.h:1247
OrthancPluginConstraintType
Definition: OrthancCPlugin.h:937
OrthancPluginResourceType
Definition: OrthancCPlugin.h:754
Definition: OrthancCPlugin.h:219
struct _OrthancPluginDatabaseTransaction_t OrthancPluginDatabaseTransaction
Definition: OrthancCDatabasePlugin.h:54
OrthancPluginDatabaseContext * OrthancPluginRegisterDatabaseBackend(OrthancPluginContext *context, const OrthancPluginDatabaseBackend *backend, void *payload)
Definition: OrthancCDatabasePlugin.h:911
struct _OrthancPluginDatabaseContext_t OrthancPluginDatabaseContext
Definition: OrthancCDatabasePlugin.h:46
OrthancPluginDatabaseContext * OrthancPluginRegisterDatabaseBackendV2(OrthancPluginContext *context, const OrthancPluginDatabaseBackend *backend, const OrthancPluginDatabaseExtensions *extensions, void *payload)
Definition: OrthancCDatabasePlugin.h:964
OrthancPluginIdentifierConstraint
Definition: OrthancCPlugin.h:922