use super::Sync;
use anyhow::Result;
use csv::Reader;
use flate2::bufread::GzDecoder;
use openvet_common::rust::CrateName;
use semver::Version;
use serde::Deserialize;
use std::{fs::File, io::BufReader, path::Path};
use tar::Archive;
use tempfile::tempdir;
use tracing::info;
#[derive(Deserialize)]
pub struct CrateRecord {
id: u64,
name: CrateName,
updated_at: String,
created_at: String,
}
#[derive(Deserialize)]
pub struct VersionRecord {
id: u64,
crate_id: u64,
num: Version,
updated_at: String,
created_at: String,
crate_size: Option<usize>,
published_by: Option<u64>,
checksum: String,
rust_version: String,
yank_message: Option<String>,
}
impl Sync {
pub async fn load_dump(&self, path: &Path) -> Result<()> {
let dir = tempdir()?;
info!("Unpacking {path:?} to {}", dir.path().display());
let file = File::open(path)?;
let reader = BufReader::new(file);
let reader = GzDecoder::new(reader);
let mut archive = Archive::new(reader);
archive.unpack(dir.path())?;
let mut crates_csv = Reader::from_reader(File::open(
dir.path()
.join("2024-11-01-020026")
.join("data")
.join("crates.csv"),
)?);
for record in crates_csv.deserialize() {
let record: CrateRecord = record?;
}
let mut versions_csv = Reader::from_reader(File::open(
dir.path()
.join("2024-11-01-020026")
.join("data")
.join("versions.csv"),
)?);
for record in versions_csv.deserialize() {
let record: VersionRecord = record?;
}
Ok(())
}
}