use std::fs;
use std::path::Path;
use crate::errors::Result;
use crate::mmap::{MemoryMappedFile, MmapMode};
pub fn create_mmap<P: AsRef<Path>>(path: P, size: u64) -> Result<MemoryMappedFile> {
MemoryMappedFile::create_rw(path, size)
}
pub fn load_mmap<P: AsRef<Path>>(path: P, mode: MmapMode) -> Result<MemoryMappedFile> {
match mode {
MmapMode::ReadOnly => MemoryMappedFile::open_ro(path),
MmapMode::ReadWrite => MemoryMappedFile::open_rw(path),
#[cfg(feature = "cow")]
MmapMode::CopyOnWrite => MemoryMappedFile::open_cow(path),
#[cfg(not(feature = "cow"))]
MmapMode::CopyOnWrite => Err(crate::errors::MmapIoError::InvalidMode(
"copy-on-write mode not enabled (feature `cow`)",
)),
}
}
pub fn write_mmap<P: AsRef<Path>>(path: P, offset: u64, data: &[u8]) -> Result<()> {
let mmap = MemoryMappedFile::open_rw(path)?;
mmap.update_region(offset, data)
}
pub fn update_region(mmap: &MemoryMappedFile, offset: u64, data: &[u8]) -> Result<()> {
mmap.update_region(offset, data)
}
pub fn flush(mmap: &MemoryMappedFile) -> Result<()> {
mmap.flush()
}
pub fn copy_mmap<P: AsRef<Path>>(src: P, dst: P) -> Result<()> {
fs::copy(src, dst)?;
Ok(())
}
pub fn delete_mmap<P: AsRef<Path>>(path: P) -> Result<()> {
fs::remove_file(path)?;
Ok(())
}
#[cfg(feature = "async")]
pub mod r#async {
use std::fs;
use std::path::{Path, PathBuf};
use crate::errors::{MmapIoError, Result};
use crate::mmap::MemoryMappedFile;
pub async fn create_mmap_async<P: AsRef<Path>>(path: P, size: u64) -> Result<MemoryMappedFile> {
let path: PathBuf = path.as_ref().to_path_buf();
blocking::unblock(move || -> Result<MemoryMappedFile> {
let file = fs::OpenOptions::new()
.create(true)
.write(true)
.read(true)
.truncate(true)
.open(&path)
.map_err(MmapIoError::Io)?;
file.set_len(size).map_err(MmapIoError::Io)?;
drop(file);
MemoryMappedFile::open_rw(&path)
})
.await
}
pub async fn copy_mmap_async<P: AsRef<Path>>(src: P, dst: P) -> Result<()> {
let src: PathBuf = src.as_ref().to_path_buf();
let dst: PathBuf = dst.as_ref().to_path_buf();
blocking::unblock(move || fs::copy(&src, &dst).map(|_| ()).map_err(MmapIoError::Io)).await
}
pub async fn delete_mmap_async<P: AsRef<Path>>(path: P) -> Result<()> {
let path: PathBuf = path.as_ref().to_path_buf();
blocking::unblock(move || fs::remove_file(&path).map_err(MmapIoError::Io)).await
}
}