use openehr::base::{HierObjectId, ObjectVersionId};
use openehr::rm::common::Version;
use openehr::rm::data_types::DvDateTime;
use openehr::rm::ehr::Composition;
use openehr_sqlite::SqliteStore;
use openehr_store::conformance::{RECORD, sample_contribution, sample_ehr, sample_version};
use openehr_store::{CommitOutcome, Store, StoreError};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut store = SqliteStore::in_memory()?;
store.install()?;
println!("installed on {}", store.engine());
let ehr = sample_ehr();
let ehr_id = ehr.ehr_id().clone();
store.create_ehr(&ehr)?;
store.create_contribution(&ehr_id, &sample_contribution("ctrb-0001", &[1, 2]))?;
let first: Version<Composition> = sample_version(1, None, 0);
let outcome: CommitOutcome = store.commit_composition(&ehr_id, &first, "ctrb-0001")?;
assert!(
outcome.created_container,
"the first version of a container creates it"
);
println!("committed {}", outcome.version_uid);
let second: Version<Composition> = sample_version(2, Some(1), 5);
store.commit_composition(&ehr_id, &second, "ctrb-0001")?;
println!("amended version 2");
let container: HierObjectId = RECORD.parse()?;
let latest = store.latest_version(&container)?;
println!(
"latest {} ({}), committed {}",
latest.uid, latest.audit_change_type_code, latest.audit_time_committed.text
);
println!(
" text {:?}, derived utc {:?}",
latest.audit_time_committed.text, latest.audit_time_committed.utc_seconds
);
let history = store.all_versions(&container)?;
println!("history {} versions, oldest first", history.len());
let at = DvDateTime::new("2026-08-01T09:02:00Z")?;
println!("at 09:02 {}", store.version_at_time(&container, &at)?.uid);
let found =
store.find_compositions_by_archetype(&ehr_id, "openEHR-EHR-COMPOSITION.encounter.v1")?;
println!("indexed {} composition(s) of that archetype", found.len());
let stale: Version<Composition> = sample_version(3, Some(1), 10);
match store.commit_composition(&ehr_id, &stale, "ctrb-0001") {
Err(StoreError::Commit(e)) => println!("refused stale predecessor: {e}"),
other => panic!("a stale predecessor must be refused, got {other:?}"),
}
println!("checkpoint {}", store.chain_checkpoint(&container)?);
let uid: ObjectVersionId = format!("{RECORD}::ehr1.example.org::1").parse()?;
let direct = store.connection().execute(
"UPDATE openehr_version SET lifecycle_state_code = '523' WHERE uid = ?1",
[uid.to_string()],
);
match direct {
Err(e) => println!("refused direct UPDATE: {e}"),
Ok(n) => panic!("append-only must refuse an UPDATE, but it changed {n} row(s)"),
}
let after = store.get_version(&uid)?;
assert_eq!(after.lifecycle_state_code, latest_state(&history));
println!("intact version 1 unchanged after the refused UPDATE");
Ok(())
}
fn latest_state(history: &[openehr_store::record::VersionRow]) -> String {
history
.first()
.expect("the history has at least one version")
.lifecycle_state_code
.clone()
}