1use std::time::{Duration, SystemTime, UNIX_EPOCH};
7
8use lance::Dataset;
9
10use crate::error::Result;
11use crate::format::check_format;
12
13#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct TableVersion {
16 pub version: u64,
18 pub timestamp: SystemTime,
20}
21
22pub async fn versions(dataset: &Dataset) -> Result<Vec<TableVersion>> {
24 check_format(dataset)?;
25 let mut versions: Vec<TableVersion> = dataset
26 .versions()
27 .await?
28 .into_iter()
29 .map(|version| TableVersion {
30 version: version.version,
31 timestamp: UNIX_EPOCH
32 + Duration::from_millis(version.timestamp.timestamp_millis().max(0) as u64),
33 })
34 .collect();
35 versions.sort_by_key(|version| version.version);
36 Ok(versions)
37}
38
39pub async fn checkout(dataset: &Dataset, version: u64) -> Result<Dataset> {
42 check_format(dataset)?;
43 let old = dataset.checkout_version(version).await?;
44 check_format(&old)?;
45 Ok(old)
46}
47
48#[tracing::instrument(skip_all, fields(uri = %dataset.uri(), version = version), err)]
51pub async fn restore(dataset: &mut Dataset, version: u64) -> Result<()> {
52 let mut old = checkout(dataset, version).await?;
53 old.restore().await?;
54 *dataset = old;
55 Ok(())
56}