Listing 3

// Use of .netSTL c_string_accessor for database initialisation
using ::dotnetstl::c_string_accessor;

/* static */ ::openrj::ORJDatabaseA const 
  *FileDatabase::create_database_(char const *path, unsigned   flags)
{
  ::openrj::ORJDatabaseA const  *database;
  ::openrj::ORJError            error;
  ::openrj::ORJRC               rc = ... 

  /// call ::openrj::ORJ_ReadDatabaseA(), and 
  /// ... throw new DatabaseException(rc, error); on failure
  /// ... or return databse
}
FileDatabase::FileDatabase(String *path, unsigned int flags)
  : Database(create_database_(c_string_accessor<char>(path), flags))
     , m_path(path)
{}
/* static */ ::openrj::ORJDatabaseA const 
  *MemoryDatabase::create_database_(char const *contents
                            , size_t     cbContents, unsigned   flags)
{
  ::openrj::ORJDatabaseA const  *database;
  ::openrj::ORJError            error;
  ::openrj::ORJRC               rc = ... 

  /// call ::openrj::ORJ_CreateDatabaseFromMemoryA(), and 
  /// ... throw new DatabaseException(rc, error); on failure
  /// ... or return databse
}

MemoryDatabase::MemoryDatabase(String *contents, unsigned int flags)
  : Database(create_database_(c_string_accessor<char>(contents)
                            , contents->get_Length(), flags))
{}