Add pragma integrity check to verify (#175)

This commit is contained in:
Firstyear 2020-01-27 13:37:55 +10:00 committed by GitHub
parent 559222206f
commit a55f277ac3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 4 deletions

View file

@ -39,6 +39,7 @@ pub enum ConsistencyError {
InvalidAttributeType(String),
DuplicateUniqueAttribute(String),
InvalidSPN(u64),
SqliteIntegrityFailure,
}
#[derive(Serialize, Deserialize, Debug)]

View file

@ -3,7 +3,7 @@ use crate::be::{IdEntry, IDL};
use crate::utils::SID;
use crate::value::IndexType;
use idlset::IDLBitRange;
use kanidm_proto::v1::OperationError;
use kanidm_proto::v1::{ConsistencyError, OperationError};
use r2d2::Pool;
use r2d2_sqlite::SqliteConnectionManager;
use rusqlite::types::ToSql;
@ -215,6 +215,37 @@ pub trait IdlSqliteTransaction {
})
.map_err(|_| OperationError::SQLiteError)
}
fn verify(&self) -> Vec<Result<(), ConsistencyError>> {
let mut stmt = match self.get_conn().prepare("PRAGMA integrity_check;") {
Ok(r) => r,
Err(_) => return vec![Err(ConsistencyError::SqliteIntegrityFailure)],
};
let r = match stmt.query(NO_PARAMS) {
Ok(mut rows) => {
match rows.next() {
Ok(Some(v)) => {
// println!("{:?}", v.column_names());
let r: Result<String, _> = v.get(0);
match r {
Ok(t) => {
if t == "ok" {
Vec::new()
} else {
vec![Err(ConsistencyError::SqliteIntegrityFailure)]
}
}
Err(_) => vec![Err(ConsistencyError::SqliteIntegrityFailure)],
}
}
_ => vec![Err(ConsistencyError::SqliteIntegrityFailure)],
}
}
Err(_) => vec![Err(ConsistencyError::SqliteIntegrityFailure)],
};
r
}
}
impl IdlSqliteTransaction for IdlSqliteReadTransaction {
@ -709,4 +740,16 @@ impl IdlSqlite {
}
#[cfg(test)]
mod tests {}
mod tests {
use crate::audit::AuditScope;
use crate::be::idl_sqlite::{IdlSqlite, IdlSqliteTransaction};
#[test]
fn test_idl_sqlite_verify() {
let mut audit = AuditScope::new("run_test");
let be = IdlSqlite::new(&mut audit, "", 1).unwrap();
let be_w = be.write();
let r = be_w.verify();
assert!(r.len() == 0);
}
}

View file

@ -394,8 +394,8 @@ pub trait BackendTransaction {
}
fn verify(&self) -> Vec<Result<(), ConsistencyError>> {
// TODO: Implement this!!!
Vec::new()
// Vec::new()
self.get_idlayer().verify()
}
fn backup(&self, audit: &mut AuditScope, dst_path: &str) -> Result<(), OperationError> {