use std::fs;
use std::path::Path;
use secrecy::SecretBox;
use crate::storage::error::StorageResult;
use walletkit_db::Vault;
use super::schema;
use super::util::map_io_err;
pub(super) fn open_or_rebuild(
path: &Path,
k_intermediate: &SecretBox<[u8; 32]>,
) -> StorageResult<Vault> {
if let Ok(vault) = Vault::open(path, k_intermediate, schema::ensure_schema) {
return Ok(vault);
}
delete_cache_files(path)?;
Vault::open(path, k_intermediate, schema::ensure_schema).map_err(Into::into)
}
fn delete_cache_files(path: &Path) -> StorageResult<()> {
delete_if_exists(path)?;
delete_if_exists(&path.with_extension("sqlite-wal"))?;
delete_if_exists(&path.with_extension("sqlite-shm"))?;
Ok(())
}
fn delete_if_exists(path: &Path) -> StorageResult<()> {
match fs::remove_file(path) {
Ok(()) => Ok(()),
Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(()),
Err(err) => Err(map_io_err(&err)),
}
}