2018-03-01 20:07:42 -05:00
|
|
|
// This file is part of Moonfire NVR, a security camera network video recorder.
|
2021-02-17 16:28:48 -05:00
|
|
|
// Copyright (C) 2020 The Moonfire NVR Authors; see AUTHORS and LICENSE.txt.
|
|
|
|
// SPDX-License-Identifier: GPL-v3.0-or-later WITH GPL-3.0-linking-exception.
|
2017-01-07 01:54:19 -05:00
|
|
|
|
|
|
|
//! Subcommand to check the database and sample file dir for errors.
|
|
|
|
|
2018-12-28 22:53:29 -05:00
|
|
|
use db::check;
|
2018-02-21 01:46:14 -05:00
|
|
|
use failure::Error;
|
2020-04-18 01:41:55 -04:00
|
|
|
use std::path::PathBuf;
|
|
|
|
use structopt::StructOpt;
|
|
|
|
|
|
|
|
#[derive(StructOpt)]
|
|
|
|
pub struct Args {
|
|
|
|
/// Directory holding the SQLite3 index database.
|
2021-02-17 01:15:54 -05:00
|
|
|
#[structopt(
|
|
|
|
long,
|
|
|
|
default_value = "/var/lib/moonfire-nvr/db",
|
|
|
|
value_name = "path",
|
|
|
|
parse(from_os_str)
|
|
|
|
)]
|
2020-04-18 01:41:55 -04:00
|
|
|
db_dir: PathBuf,
|
|
|
|
|
|
|
|
/// Compare sample file lengths on disk to the database.
|
|
|
|
#[structopt(long)]
|
|
|
|
compare_lens: bool,
|
2021-02-11 23:03:28 -05:00
|
|
|
|
|
|
|
/// Trash sample files without matching recording rows in the database.
|
|
|
|
/// This addresses "Missing ... row" errors.
|
|
|
|
///
|
|
|
|
/// The ids are added to the "garbage" table to indicate the files need to
|
|
|
|
/// be deleted. Garbage is collected on normal startup.
|
|
|
|
#[structopt(long)]
|
|
|
|
trash_orphan_sample_files: bool,
|
|
|
|
|
|
|
|
/// Delete recording rows in the database without matching sample files.
|
|
|
|
/// This addresses "Recording ... missing file" errors.
|
|
|
|
#[structopt(long)]
|
|
|
|
delete_orphan_rows: bool,
|
|
|
|
|
|
|
|
/// Trash recordings when their database rows appear corrupt.
|
|
|
|
/// This addresses "bad video_index" errors.
|
|
|
|
///
|
|
|
|
/// The ids are added to the "garbage" table to indicate their files need to
|
|
|
|
/// be deleted. Garbage is collected on normal startup.
|
|
|
|
#[structopt(long)]
|
|
|
|
trash_corrupt_rows: bool,
|
2017-01-07 01:54:19 -05:00
|
|
|
}
|
|
|
|
|
2021-02-11 13:45:56 -05:00
|
|
|
pub fn run(args: &Args) -> Result<i32, Error> {
|
2021-02-11 23:03:28 -05:00
|
|
|
let (_db_dir, mut conn) = super::open_conn(&args.db_dir, super::OpenMode::ReadWrite)?;
|
2021-02-17 01:15:54 -05:00
|
|
|
check::run(
|
|
|
|
&mut conn,
|
|
|
|
&check::Options {
|
|
|
|
compare_lens: args.compare_lens,
|
|
|
|
trash_orphan_sample_files: args.trash_orphan_sample_files,
|
|
|
|
delete_orphan_rows: args.delete_orphan_rows,
|
|
|
|
trash_corrupt_rows: args.trash_corrupt_rows,
|
|
|
|
},
|
|
|
|
)
|
2017-01-07 01:54:19 -05:00
|
|
|
}
|