MeiliSearch/dump/src/reader/mod.rs

103 lines
3.1 KiB
Rust
Raw Normal View History

2022-10-03 18:50:06 +02:00
use std::io::Read;
use std::{fs::File, io::BufReader};
use flate2::bufread::GzDecoder;
use index_scheduler::TaskView;
use meilisearch_auth::Key;
use serde::Deserialize;
use tempfile::TempDir;
use time::OffsetDateTime;
2022-10-03 18:50:06 +02:00
use uuid::Uuid;
2022-10-06 14:24:28 +02:00
// use crate::reader::compat::Compat;
2022-10-04 19:13:30 +02:00
use crate::{IndexMetadata, Result, Version};
// use self::loaders::{v2, v3, v4, v5};
// pub mod error;
2022-10-06 14:24:28 +02:00
// mod compat;
// mod loaders;
2022-10-03 16:12:01 +02:00
// mod v1;
pub(self) mod v4;
pub(self) mod v5;
pub(self) mod v6;
2022-10-06 14:24:28 +02:00
pub fn open(dump: impl Read) -> Result<Box<dyn DumpReader>> {
let path = TempDir::new()?;
let mut dump = BufReader::new(dump);
let gz = GzDecoder::new(&mut dump);
let mut archive = tar::Archive::new(gz);
archive.unpack(path.path())?;
#[derive(Deserialize)]
2022-10-03 18:50:06 +02:00
#[serde(rename_all = "camelCase")]
struct MetadataVersion {
pub dump_version: Version,
}
let mut meta_file = File::open(path.path().join("metadata.json"))?;
let MetadataVersion { dump_version } = serde_json::from_reader(&mut meta_file)?;
match dump_version {
// Version::V1 => Ok(Box::new(v1::Reader::open(path)?)),
Version::V1 => todo!(),
Version::V2 => todo!(),
Version::V3 => todo!(),
Version::V4 => todo!(),
Version::V5 => {
2022-10-06 14:24:28 +02:00
/*
let dump_reader = Box::new(v5::V5Reader::open(path)?);
let dump_reader = Box::new(Compat::<
dyn DumpReader<
Document = v5::Document,
Settings = v5::Settings<v5::Checked>,
Task = v5::Task,
UpdateFile = v5::UpdateFile,
Key = v5::Key,
>,
>::new(dump_reader))
as Box<
dyn DumpReader<
Document = v6::Document,
Settings = v6::Settings<v6::Checked>,
Task = v6::Task,
UpdateFile = v6::UpdateFile,
Key = v6::Key,
>,
>;
Ok(dump_reader)
2022-10-06 14:24:28 +02:00
*/
todo!()
}
2022-10-06 14:24:28 +02:00
Version::V6 => Ok(Box::new(v6::V6Reader::open(path)?)),
2022-10-03 16:12:01 +02:00
}
}
pub trait DumpReader {
/// Return the version of the dump.
fn version(&self) -> Version;
2022-10-03 18:50:06 +02:00
/// Return at which date the dump was created if there was one.
2022-10-03 16:12:01 +02:00
fn date(&self) -> Option<OffsetDateTime>;
2022-10-03 18:50:06 +02:00
/// Return the instance-uid if there was one.
fn instance_uid(&self) -> Result<Option<Uuid>>;
/// Return an iterator over each indexes.
2022-10-06 14:24:28 +02:00
fn indexes(&self) -> Result<Box<dyn Iterator<Item = Result<Box<dyn IndexReader + '_>>> + '_>>;
/// Return all the tasks in the dump with a possible update file.
fn tasks(
2022-10-03 16:12:01 +02:00
&mut self,
2022-10-06 14:24:28 +02:00
) -> Box<dyn Iterator<Item = Result<(v6::Task, Option<v6::UpdateFile>)>> + '_>;
/// Return all the keys.
2022-10-06 14:24:28 +02:00
fn keys(&mut self) -> Box<dyn Iterator<Item = Result<v6::Key>> + '_>;
}
pub trait IndexReader {
2022-10-04 19:13:30 +02:00
fn metadata(&self) -> &IndexMetadata;
2022-10-06 14:24:28 +02:00
fn documents(&mut self) -> Result<Box<dyn Iterator<Item = Result<v6::Document>> + '_>>;
fn settings(&mut self) -> Result<v6::Settings<v6::Checked>>;
}