//! v14 is a fence for the `types::v14::RepoMetadata` shape and writes nothing. old rows still //! decode through serde defaults, but an older build can't read the longer rows, so it has to //! refuse the database at open instead of failing every metadata read. don't drop it as a no-op use fjall::OwnedWriteBatch; use miette::Result; use crate::db::Db; pub(super) fn repo_metadata_v14(_db: &Db, _batch: &mut OwnedWriteBatch) -> Result { Ok(true) } // a relay-only build never runs v8, so its version stops at 7, and nothing it writes needs this // fence anyway #[cfg(all(test, feature = "indexer"))] mod tests { use crate::config::Config; use crate::db::keys::{self, VERSIONING_KEY}; use crate::db::migration::{LATEST_VERSION, rewind_version_for_test}; use crate::db::{Db, deser_repo_meta}; use crate::types::v4; use jacquard_common::types::did::Did; use miette::{IntoDiagnostic, Result}; use tempfile::tempdir; #[test] fn old_database_opens_at_v14_with_its_metadata_rows_untouched() -> Result<()> { let tmp = tempdir().into_diagnostic()?; let cfg = Config { database_path: tmp.path().to_path_buf(), ..Default::default() }; let did = Did::new_static("did:plc:ewvi7nxzyoun6zhxrhs64oiz").into_diagnostic()?; let old_row = rmp_serde::to_vec(&v4::RepoMetadata { tracked: true, index_id: 7, }) .into_diagnostic()?; { let db = Db::open(&cfg)?; db.repo_metadata .insert(keys::repo_metadata_key(&did), &old_row) .into_diagnostic()?; rewind_version_for_test(&db, 9)?; db.persist()?; } let db = Db::open(&cfg)?; let version = db .counts .get(VERSIONING_KEY) .into_diagnostic()? .expect("schema version"); assert_eq!( u64::from_be_bytes(version.as_ref().try_into().into_diagnostic()?), LATEST_VERSION ); let row = db .repo_metadata .get(keys::repo_metadata_key(&did)) .into_diagnostic()? .expect("metadata row"); assert_eq!(row.as_ref(), old_row.as_slice()); let metadata = deser_repo_meta(&row)?; assert_eq!( (metadata.tracked, metadata.index_id, metadata.retry_count), (true, 7, 0) ); assert_eq!(metadata.relay_inactive, None); Ok(()) } }