The main object to access the DB is the ServerIndex class that is accessible from the ServerContext.

ServerIndex inherits from StatelessDatabaseOperations.

StatelessDatabaseOperations owns an IDatabaseWrapper member (db).
StatelessDatabaseOperations has 2 internal Transaction classes (ReadOnlyTransactions and ReadWriteTransactions) that implements the DB
operations by calling the methods from IDatabaseWrapper:ITransaction.

IDatabaseWrapper has 2 direct derived classes:
- BaseDatabaseWrapper which simply provides a "not implemented" implementation of new methods to its derived classes:
  - OrthancPluginDatabase    that is a legacy plugin interface
  - OrthancPluginDatabaseV3  that is a legacy plugin interface
  - SQLiteDatabaseWrapper    that is used by the default SQLite DB in Orthanc
- OrthancPluginDatabaseV4 that is the latest plugin interface and uses protobuf

When you add a new method in the DB (e.g: UpdateAndGetStatistics with a new signature), you must:
- define it as a member of StatelessDatabaseOperations
- define it as a member of StatelessDatabaseOperations::ReadWriteTransactions or StatelessDatabaseOperations::ReadOnlyTransactions
- define it as a member of IDatabaseWrapper:ITransaction
- define it in OrthancDatabasePlugin.proto (new request + new response + new message)
- define it in OrthancPluginDatabaseV4
- define a NotImplemented default implementation in BaseDatabaseWrapper
- optionally define it in SQLiteDatabaseWrapper if it can be implemented in SQLite
- very likely define it as a DbCapabilities in IDatabaseWrapper::DbCapabilities (e.g: Has/SetHasUpdateAndGetStatistics()) such that the Orthanc
  core knows if it can use it or not.

Then, in the orthanc-databases repo, you should:
- define it as a virtual member of IDatabaseBackend
- define it as a member of IndexBackend
- add a handler for the new protobuf message in DatabaseBackendAdapterV4
