use std::ffi::CString;
use std::path::Path;
use std::ptr::{self, NonNull};
use std::sync::Arc;
use crate::database::FdbDatabase;
use crate::error::{check, FdbError, FdbResult, DATABASE_OPEN};
pub fn open_database<P>(cluster_file_path: P) -> FdbResult<FdbDatabase>
where
P: AsRef<Path>,
{
let path = CString::new(
cluster_file_path
.as_ref()
.to_str()
.ok_or_else(|| FdbError::new(DATABASE_OPEN))?,
)
.map_err(|_| FdbError::new(DATABASE_OPEN))?;
let path_ptr = path.as_ptr();
let mut v = ptr::null_mut();
let err = unsafe { fdb_sys::fdb_create_database(path_ptr, &mut v) };
drop(path);
check(err)?;
Ok(FdbDatabase::new(Some(Arc::new(NonNull::new(v).expect(
"fdb_create_database returned null, but did not return an error",
)))))
}