fixes to check subcommand

* fixes for schema version 6
* clearer output when there are no schema diffs
* don't compare sqlite's internal tables (which causes false positives)
This commit is contained in:
Scott Lamb 2020-11-24 08:42:22 -08:00
parent c8c65206d5
commit f08732057e
2 changed files with 22 additions and 10 deletions

View File

@ -1,5 +1,5 @@
// This file is part of Moonfire NVR, a security camera network video recorder. // This file is part of Moonfire NVR, a security camera network video recorder.
// Copyright (C) 2018 The Moonfire NVR Authors // Copyright (C) 2020 The Moonfire NVR Authors
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by // it under the terms of the GNU General Public License as published by
@ -37,7 +37,7 @@ use crate::raw;
use crate::recording; use crate::recording;
use failure::Error; use failure::Error;
use fnv::FnvHashMap; use fnv::FnvHashMap;
use log::error; use log::{info, error};
use nix::fcntl::AtFlags; use nix::fcntl::AtFlags;
use rusqlite::params; use rusqlite::params;
use crate::schema; use crate::schema;
@ -54,7 +54,10 @@ pub fn run(conn: &rusqlite::Connection, opts: &Options) -> Result<(), Error> {
db::init(&mut expected)?; db::init(&mut expected)?;
if let Some(diffs) = compare::get_diffs("actual", conn, "expected", &expected)? { if let Some(diffs) = compare::get_diffs("actual", conn, "expected", &expected)? {
println!("{}", &diffs); println!("{}", &diffs);
} else {
println!("Schema is as expected.");
} }
info!("Done comparing schemas.");
} }
let db_uuid = raw::get_db_uuid(&conn)?; let db_uuid = raw::get_db_uuid(&conn)?;
@ -135,7 +138,7 @@ struct RecordingSummary {
bytes: u64, bytes: u64,
video_samples: i32, video_samples: i32,
video_sync_samples: i32, video_sync_samples: i32,
duration: i32, media_duration: i32,
flags: i32, flags: i32,
} }
@ -163,13 +166,13 @@ type Dir = FnvHashMap<i32, Stream>;
fn summarize_index(video_index: &[u8]) -> Result<RecordingSummary, Error> { fn summarize_index(video_index: &[u8]) -> Result<RecordingSummary, Error> {
let mut it = recording::SampleIndexIterator::new(); let mut it = recording::SampleIndexIterator::new();
let mut duration = 0; let mut media_duration = 0;
let mut video_samples = 0; let mut video_samples = 0;
let mut video_sync_samples = 0; let mut video_sync_samples = 0;
let mut bytes = 0; let mut bytes = 0;
while it.next(video_index)? { while it.next(video_index)? {
bytes += it.bytes as u64; bytes += it.bytes as u64;
duration += it.duration_90k; media_duration += it.duration_90k;
video_samples += 1; video_samples += 1;
video_sync_samples += it.is_key() as i32; video_sync_samples += it.is_key() as i32;
} }
@ -177,7 +180,7 @@ fn summarize_index(video_index: &[u8]) -> Result<RecordingSummary, Error> {
bytes, bytes,
video_samples, video_samples,
video_sync_samples, video_sync_samples,
duration, media_duration,
flags: if it.duration_90k == 0 { db::RecordingFlags::TrailingZero as i32 } else { 0 }, flags: if it.duration_90k == 0 { db::RecordingFlags::TrailingZero as i32 } else { 0 },
}) })
} }
@ -225,7 +228,7 @@ fn compare_stream(conn: &rusqlite::Connection, stream_id: i32, opts: &Options,
composite_id, composite_id,
flags, flags,
sample_file_bytes, sample_file_bytes,
duration_90k, wall_duration_90k + media_duration_delta_90k,
video_samples, video_samples,
video_sync_samples video_sync_samples
from from
@ -239,7 +242,7 @@ fn compare_stream(conn: &rusqlite::Connection, stream_id: i32, opts: &Options,
let s = RecordingSummary { let s = RecordingSummary {
flags: row.get(1)?, flags: row.get(1)?,
bytes: row.get::<_, i64>(2)? as u64, bytes: row.get::<_, i64>(2)? as u64,
duration: row.get(3)?, media_duration: row.get(3)?,
video_samples: row.get(4)?, video_samples: row.get(4)?,
video_sync_samples: row.get(5)?, video_sync_samples: row.get(5)?,
}; };

View File

@ -1,5 +1,5 @@
// This file is part of Moonfire NVR, a security camera network video recorder. // This file is part of Moonfire NVR, a security camera network video recorder.
// Copyright (C) 2019 The Moonfire NVR Authors // Copyright (C) 2020 The Moonfire NVR Authors
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by // it under the terms of the GNU General Public License as published by
@ -79,7 +79,16 @@ impl std::fmt::Display for IndexColumn {
/// Returns a sorted vec of table names in the given connection. /// Returns a sorted vec of table names in the given connection.
fn get_tables(c: &rusqlite::Connection) -> Result<Vec<String>, rusqlite::Error> { fn get_tables(c: &rusqlite::Connection) -> Result<Vec<String>, rusqlite::Error> {
c.prepare("select name from sqlite_master where type = 'table' order by name")? c.prepare(r#"
select
name
from
sqlite_master
where
type = 'table' and
name not like 'sqlite_%'
order by name
"#)?
.query_map(params![], |r| r.get(0))? .query_map(params![], |r| r.get(0))?
.collect() .collect()
} }