Add SQLite schema metadata for DB resources

This commit is contained in:
Eric Wendland 2026-05-16 21:54:49 +02:00
commit 527090fd4c
8 changed files with 119 additions and 14 deletions

View file

@ -40,6 +40,8 @@ pub enum NodeError {
Store(#[from] geth_store::StoreError),
#[error("cas error: {0}")]
Cas(#[from] geth_cas::CasError),
#[error("db error: {0}")]
Db(#[from] geth_db::DbError),
#[error("control error: {0}")]
Control(#[from] geth_control::ControlError),
#[error("json error: {0}")]
@ -570,6 +572,7 @@ pub fn handle_request(
return Err(NodeError::InvalidDbPath(path.display().to_string()));
}
let path = std::fs::canonicalize(path)?;
let schema_metadata = geth_db::schema_metadata(&path)?;
let resource_id = format!("resource:db:{name}");
let db_id = format!("db:{name}");
let resource = StoredResource {
@ -587,7 +590,7 @@ pub fn handle_request(
};
store.insert_db_resource(&stored)?;
Ok(ControlResponse::DbAdded {
db: db_resource_from_stored(&stored)?,
db: db_resource_from_stored_with_schema(&stored, schema_metadata),
})
}
ControlRequest::DbStatus { name } => {
@ -669,16 +672,30 @@ fn stored_resource_to_descriptor(stored: StoredResource) -> Result<ResourceDescr
fn db_resource_from_stored(stored: &StoredDbResource) -> Result<DbResource, NodeError> {
let path = Path::new(&stored.path);
let metadata = path.metadata().ok();
Ok(DbResource {
let schema_metadata = if metadata.as_ref().is_some_and(std::fs::Metadata::is_file) {
geth_db::schema_metadata(path).unwrap_or_else(|error| format!("unavailable:{error}"))
} else {
"unavailable:path-missing".to_owned()
};
Ok(db_resource_from_stored_with_schema(stored, schema_metadata))
}
fn db_resource_from_stored_with_schema(
stored: &StoredDbResource,
schema_metadata: String,
) -> DbResource {
let path = Path::new(&stored.path);
let metadata = path.metadata().ok();
DbResource {
id: stored.db_id.clone().into(),
resource: stored.resource_id.clone().into(),
name: stored.name.clone(),
path: stored.path.clone(),
path_exists: metadata.as_ref().is_some_and(std::fs::Metadata::is_file),
size_bytes: metadata.map(|metadata| metadata.len()),
schema_metadata: "not-inspected-until-crsqlite-integration".to_owned(),
schema_metadata,
sync_status: "local-only".to_owned(),
})
}
}
fn kv_resource_from_stored(stored: &StoredKvStore) -> KvResource {