#[macro_use] pub mod error; pub mod options; pub mod index; pub mod index_controller; pub use index_controller::{IndexController as MeiliSearch, updates::store::Update}; mod compression; mod document_formats; use walkdir::WalkDir; pub trait EnvSizer { fn size(&self) -> u64; } impl EnvSizer for heed::Env { fn size(&self) -> u64 { WalkDir::new(self.path()) .into_iter() .filter_map(|entry| entry.ok()) .filter_map(|entry| entry.metadata().ok()) .filter(|metadata| metadata.is_file()) .fold(0, |acc, m| acc + m.len()) } } use std::fs::{create_dir_all, File}; use std::io::Write; use std::path::Path; use flate2::{read::GzDecoder, write::GzEncoder, Compression}; use tar::{Archive, Builder}; pub fn to_tar_gz(src: impl AsRef, dest: impl AsRef) -> anyhow::Result<()> { let mut f = File::create(dest)?; let gz_encoder = GzEncoder::new(&mut f, Compression::default()); let mut tar_encoder = Builder::new(gz_encoder); tar_encoder.append_dir_all(".", src)?; let gz_encoder = tar_encoder.into_inner()?; gz_encoder.finish()?; f.flush()?; Ok(()) } pub fn from_tar_gz(src: impl AsRef, dest: impl AsRef) -> anyhow::Result<()> { let f = File::open(&src)?; let gz = GzDecoder::new(f); let mut ar = Archive::new(gz); create_dir_all(&dest)?; ar.unpack(&dest)?; Ok(()) }