- add unit test project

TODO_CUSTOM_DATA branch
- add revisions and customData in all Database plugins
- add index on customData in PG + MySQL + ...  ?
- add a "Own" option to the adopt-instance route ?
- add /abandon-instance route
- refuse to instantiate a PluginStorage3 if a DBv4 is not instantiated !
- handle all TODO_CUSTOM_DATA
- check /attachments/...  routes for path returned
- AdvancedStoragePlugin 
  - show warning if a tag is missing when generating the path from tags (+ option to disable this warning)
  - implement a 'legacy' root path to group all files with missing tags or path too long
  - document that, once you have used the AdvancedStoragePlugin and stored DICOM files, you can not downgrade Orthanc to a previous Orthanc
    without loosing access to the DICOM files
  - write integration test for advanced-storage: 
    - launch 1.12.6
    - upload 1 file
    - launch 1.12.8 with advanced-storage plugin with a non default namingScheme
    - upload 1 file
    - access + delete initial file
- share code to compute path from tags between S3 & AdvancedStoragePlugin 
- test a reconstruct of an adopted file (after IngestTranscoding change -> the file shall not be overwritten)

Extend SDK:
- AdoptAttachment():
  IN: - buffer
      - buffer size
      - customData to store
      - FileType (default = dicom)
      - resourceId (if FileType is not dicom)
      - resourceLevel (if FileType is not dicom)
TODO: add pixelDataOffset which would allow to pass only the DICOM TAGS without pixels data ...
  OUT: - resourceId (e.g. in case an instance has been created)
       - attachment uuid

If we want the plugin to be able to move files around, it needs to be able to update the AttachedFiles table
- GetAttachmentInfo():
  IN: - uuid
  OUT: - FileType
       - CompressionType
       - CustomData
       - Revision
       - CompressedSize
       - UncompressedSize
       - CompressedMD5
       - UncompressedMD5

- UpdateAttachmentInfo():
  IN: - uuid
      - FileType
      - CompressionType
      - CustomData
      - Revision
      - CompressedSize
      - UncompressedSize
      - CompressedMD5
      - UncompressedMD5
  OUT: - new uuid ??? or same uuid ?


Test commands:

curl http://localhost:8044/plugins/advanced-storage/adopt-instance -d '{"Path": "/mnt/c/Users/Alain/o/dicom-files/CARDIO/XA000001.dcm"}'
curl http://localhost:8044/plugins/advanced-storage/abandon-instance -d '{"Path": "/mnt/c/Users/Alain/o/dicom-files/CARDIO/XA000001.dcm"}'
curl http://localhost:8044/instances/ca58b590-8a115ed5-906f7f21-c7af8058-2637f722/attachments/dicom/info
curl http://localhost:8044/plugins/advanced-storage/move-storage -d '{"Resources": ["ca58b590-8a115ed5-906f7f21-c7af8058-2637f722"], "TargetStorageId": "2"}'

- write integration test for transitions from one DB to the other (for each DB plugin):
  - launch 1.11.2, 
  - upload 2 files, 
  - launch 1.12.0, 
  - access + delete one file, 
  - upload one file, 
  - launch 1.11.2 again, 
  - access + delete last 2 files
