use pgrx::prelude::*;
pub const JSONB_DELTA_MISSING: &str = "jsonb_delta_missing";
#[must_use]
pub fn check_jsonb_delta_available() -> bool {
jsonb_delta_schema().is_some()
}
pub fn require_jsonb_delta_schema() -> crate::TViewResult<String> {
jsonb_delta_schema().ok_or(crate::TViewError::JsonbDeltaMissing)
}
pub fn jsonb_delta_schema() -> Option<String> {
if let Some(schema) = crate::cache::JSONB_DELTA_SCHEMA.with(|m| m.get(&())) {
return schema;
}
let schema = Spi::connect(|client| {
client
.select(
"SELECT pg_catalog.quote_ident(n.nspname) \
FROM pg_catalog.pg_extension e \
JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace \
WHERE e.extname = 'jsonb_delta'",
None,
&[],
)?
.first()
.get_one::<String>()
})
.ok()
.flatten();
crate::cache::JSONB_DELTA_SCHEMA.with(|m| m.insert((), schema.clone()));
schema
}
#[pg_extern]
fn pg_tviews_check_jsonb_delta() -> bool {
check_jsonb_delta_available()
}