fix(vfs): Z-04 — implement webdav quota report

This commit is contained in:
2026-09-19 09:52:56 +02:00
parent 487f999a24
commit 17908a64fe
5 changed files with 187 additions and 3 deletions
+32
View File
@@ -349,6 +349,38 @@ impl Database {
self.conn()
}
/// Ermittelt den physischen Dateipfad des geöffneten Containers aus SQLite (sofern nicht in-memory).
pub fn container_path(&self) -> Option<std::path::PathBuf> {
let conn = self.conn();
let path_str: String = conn
.query_row("PRAGMA database_list;", [], |r| r.get(2))
.ok()?;
if path_str.is_empty() {
None
} else {
Some(std::path::PathBuf::from(path_str))
}
}
/// Ermittelt die physische Dateigröße des Containers über die SQLite-Page-Statistik (Z-04).
pub fn get_container_file_size(&self) -> Result<u64> {
let conn = self.conn();
let page_count: i64 = conn.query_row("PRAGMA page_count;", [], |r| r.get(0))?;
let page_size: i64 = conn.query_row("PRAGMA page_size;", [], |r| r.get(0))?;
Ok((page_count.saturating_mul(page_size)).max(0) as u64)
}
/// Ermittelt die kumulierte Dateigröße aller im Container gespeicherten Nutzdateien (Z-04).
pub fn get_total_used_size(&self) -> Result<u64> {
let conn = self.conn();
let total: i64 = conn.query_row(
"SELECT COALESCE(SUM(size), 0) FROM nodes WHERE is_dir = 0",
[],
|r| r.get(0),
)?;
Ok(total.max(0) as u64)
}
/// Erzeugt eine geklonte Instanz mit einer isolierten aktiven Session (Slot & DEK).
pub fn with_session(&self, slot_id: u32, dek: Zeroizing<[u8; 32]>) -> Self {
Self {