wip: use Nix's sqlite db "directly"

this might not be a safe assumption, but we're gonna try
This commit is contained in:
Cole Helbling 2024-05-14 15:13:50 -07:00
parent 008b537385
commit 02061a5850
3 changed files with 40 additions and 27 deletions

27
Cargo.lock generated
View file

@ -1642,6 +1642,18 @@ version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
[[package]]
name = "fallible-iterator"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
[[package]]
name = "fallible-streaming-iterator"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
[[package]] [[package]]
name = "fastcdc" name = "fastcdc"
version = "3.1.0" version = "3.1.0"
@ -2544,6 +2556,7 @@ dependencies = [
"is_ci", "is_ci",
"netrc-rs", "netrc-rs",
"reqwest", "reqwest",
"rusqlite",
"serde", "serde",
"serde_json", "serde_json",
"sha2", "sha2",
@ -3411,6 +3424,20 @@ dependencies = [
"zeroize", "zeroize",
] ]
[[package]]
name = "rusqlite"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d"
dependencies = [
"bitflags 2.4.2",
"fallible-iterator",
"fallible-streaming-iterator",
"hashlink",
"libsqlite3-sys",
"smallvec",
]
[[package]] [[package]]
name = "rust_decimal" name = "rust_decimal"
version = "1.34.3" version = "1.34.3"

View file

@ -33,6 +33,7 @@ uuid = { version = "1.4.0", features = ["serde", "v7", "rand", "std"] }
futures = "0.3" futures = "0.3"
async-compression = "0.4" async-compression = "0.4"
tracing-appender = "0.2.3" tracing-appender = "0.2.3"
rusqlite = { version = "0.30", features = ["bundled"] }
[dependencies.tokio] [dependencies.tokio]
version = "1.28.0" version = "1.28.0"

View file

@ -9,34 +9,19 @@ use crate::error::Result;
/// Returns the list of store paths that are currently present. /// Returns the list of store paths that are currently present.
pub async fn get_store_paths(store: &NixStore) -> Result<HashSet<PathBuf>> { pub async fn get_store_paths(store: &NixStore) -> Result<HashSet<PathBuf>> {
// FIXME: use the Nix API. // FIXME(cole-h): update the nix bindings to get the dbdir of the localstore?
let store_dir = store.store_dir(); let db =
let mut listing = tokio::fs::read_dir(store_dir).await?; rusqlite::Connection::open("file:/nix/var/nix/db/db.sqlite?immutable=1").expect("FIXME");
let mut paths = HashSet::new();
while let Some(entry) = listing.next_entry().await? {
let file_name = entry.file_name();
let file_name = Path::new(&file_name);
if let Some(extension) = file_name.extension() { let mut stmt = db.prepare("SELECT path FROM ValidPaths").expect("FIXME");
match extension.to_str() { let paths = stmt
None | Some("drv") | Some("chroot") => { .query_map([], |row| -> std::result::Result<PathBuf, rusqlite::Error> {
tracing::debug!( Ok(PathBuf::from(row.get::<_, String>(0)?))
"skipping file with weird or uninteresting extension {extension:?}" })
); .expect("FIXME")
continue; .into_iter()
} .map(|r| r.expect("FIXME"))
_ => {} .collect::<HashSet<_>>();
}
}
if let Some(s) = file_name.to_str() {
// Special paths (so far only `.links`)
if s == ".links" {
continue;
}
}
paths.insert(store_dir.join(file_name));
}
Ok(paths) Ok(paths)
} }