use crate::{database::*, StorageService};
use anyhow::Result;
use openvet_common::{
rust::{CrateInfo, CrateName, VersionInfo},
tree::Node,
};
use rusqlite::{named_params, Connection};
impl StorageService {
pub async fn crate_sync(&self, info: CrateInfo) -> Result<()> {
let changes = move |conn: &mut Connection| {
conn.execute(
"INSERT OR IGNORE INTO rust_crates(name) VALUES (?)",
(&*info.metadata.name,),
)?;
for (_, version) in info.versions.iter() {
conn.execute(
"INSERT INTO rust_crate_versions(crate, version, checksum, yanked)
VALUES (
(SELECT id FROM rust_crates WHERE name = :crate),
:version,
:checksum,
:yanked
)
ON CONFLICT(crate, version) DO UPDATE SET
yanked = :yanked,
checksum = :checksum
",
named_params! {
":crate": &*info.metadata.name,
":version": &version.version.to_string(),
":yanked": version.yanked,
":checksum": version.checksum.to_string(),
},
)?;
}
Ok(()) as Result<()>
};
let writer = self.database().write(changes).await??;
Ok(())
}
pub async fn crate_files_write(&self, name: CrateName, files: Node) -> Result<()> {
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use openvet_common::rust::CrateMetadata;
#[tokio::test]
async fn test_crate_sync_no_version() {
let info = CrateInfo {
metadata: CrateMetadata {
name: "test-crate".parse().unwrap(),
},
versions: [].into(),
};
let service = StorageService::memory().await.unwrap();
service.crate_sync(info.clone()).await.unwrap();
service.crate_sync(info).await.unwrap();
}
#[tokio::test]
async fn test_crate_sync_change_yanked() {
let service = StorageService::memory().await.unwrap();
let name = "test-crate".parse::<CrateName>().unwrap();
let info = CrateInfo {
metadata: CrateMetadata {
name: "test-crate".parse().unwrap(),
},
versions: [(
"0.1.0".parse().unwrap(),
VersionInfo {
krate: name.clone(),
version: "0.1.0".parse().unwrap(),
checksum: Default::default(),
yanked: false,
},
)]
.into(),
};
service.crate_sync(info).await.unwrap();
let info = CrateInfo {
metadata: CrateMetadata {
name: "test-crate".parse().unwrap(),
},
versions: [(
"0.1.0".parse().unwrap(),
VersionInfo {
krate: name.clone(),
version: "0.1.0".parse().unwrap(),
checksum: Default::default(),
yanked: true,
},
)]
.into(),
};
service.crate_sync(info).await.unwrap();
}
#[tokio::test]
async fn test_crate_sync_versions() {
let service = StorageService::memory().await.unwrap();
let name = "test-crate".parse::<CrateName>().unwrap();
let info = CrateInfo {
metadata: CrateMetadata { name: name.clone() },
versions: [].into(),
};
service.crate_sync(info).await.unwrap();
let info = CrateInfo {
metadata: CrateMetadata {
name: "test-crate".parse().unwrap(),
},
versions: [(
"0.1.0".parse().unwrap(),
VersionInfo {
krate: name.clone(),
version: "0.1.0".parse().unwrap(),
checksum: Default::default(),
yanked: false,
},
)]
.into(),
};
service.crate_sync(info).await.unwrap();
}
}