use std::path::PathBuf;
use anyhow::{Context, Result};
use colored::Colorize;
use crate::core::redb_migrate::{migrate_redb_corpus, MigrationOutcome};
pub fn handle_migrate_redb(path: PathBuf) -> Result<()> {
if !path.exists() {
anyhow::bail!(
"no file at {} โ pass the path to an index.redb (or its \
.v2-incompatible backup)",
path.display()
);
}
println!(
"๐ Migrating redb corpus at {} (preserving data, no re-embedding)โฆ\n",
path.display().to_string().bold()
);
let outcome = migrate_redb_corpus(&path)
.with_context(|| format!("migrate redb corpus at {}", path.display()))?;
match outcome {
MigrationOutcome::AlreadyV4 => {
println!(
"{} {} already opens with redb 4.x โ nothing to migrate.",
"ยท".dimmed(),
path.display()
);
}
MigrationOutcome::Migrated {
per_table,
total_rows,
backup,
schema_version,
} => {
for (name, rows) in &per_table {
let line = format!(" {name:<22} {rows:>10} rows");
if *rows > 0 {
println!("{} {}", "โ".green(), line);
} else {
println!("{} {}", "ยท".dimmed(), line.dimmed());
}
}
println!();
println!(
"{} Migrated {} rows across {} table(s) โ redb 4.x.",
"โ".green(),
total_rows.to_string().bold(),
per_table.iter().filter(|(_, r)| *r > 0).count()
);
println!(
"{} Preserved schema_version = {} (in-app migrations M00x will run normally).",
"ยท".dimmed(),
schema_version
);
println!(
"{} Original 2.x corpus backed up at {}.",
"ยท".dimmed(),
backup.display().to_string().dimmed()
);
println!(
"\n{} Restart the daemon to pick up the migrated index โ no reindex needed.",
"โ".cyan()
);
}
}
Ok(())
}