use rusqlite::{params, Connection};
use crate::error::Result;
use crate::nd::NavigationData;
mod encoding;
mod migrations;
mod read;
mod types;
mod write;
pub fn remove_partition(conn: &mut Connection, partition_id: u64) -> Result<()> {
migrations::migrate(conn)?;
conn.execute(
"DELETE FROM partitions WHERE id = ?1",
params![partition_id.to_string()],
)?;
Ok(())
}
impl NavigationData {
pub fn try_from_sqlite(conn: &mut Connection) -> Result<Vec<NavigationData>> {
migrations::migrate(conn)?;
read::all_partitions(conn)
}
pub fn try_into_sqlite(&self, conn: &mut Connection) -> Result<()> {
migrations::migrate(conn)?;
write::all_partitions(conn, self)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::nd::Fix;
const HAMBURG_A424: &[u8] = br#"
SEURP EDDHEDA 0 N N53374900E009591762E002000053 P MWGE HAMBURG 356462409
SEURP EDDHEDGRW05 0106630500 N53371100E009580180 151 124362502
SEURP EDDHEDGRW23 0106632300 N53380900E009595876 151 124362502
"#;
#[test]
fn round_trip_preserves_airport_and_runways() {
let mut conn = Connection::open_in_memory().unwrap();
let original =
NavigationData::try_from_arinc424(HAMBURG_A424).expect("ARINC 424 should parse");
original
.try_into_sqlite(&mut conn)
.expect("write should succeed");
let loaded = NavigationData::try_from_sqlite(&mut conn).expect("read should succeed");
assert_eq!(loaded.len(), 1, "one partition expected");
let partition = &loaded[0];
assert_eq!(partition.partition_id(), original.partition_id());
assert_eq!(partition.source_format(), original.source_format());
let eddh = partition.find("EDDH").expect("EDDH should be present");
assert_eq!(eddh.ident(), "EDDH");
let original_eddh = original.find("EDDH").unwrap();
match (original_eddh, eddh) {
(crate::nd::NavAid::Airport(a), crate::nd::NavAid::Airport(b)) => {
assert_eq!(a.runways.len(), b.runways.len());
}
_ => panic!("expected airport"),
}
}
#[test]
fn empty_database_returns_no_partitions() {
let mut conn = Connection::open_in_memory().unwrap();
let loaded = NavigationData::try_from_sqlite(&mut conn).expect("read should succeed");
assert!(loaded.is_empty());
}
}