use pgrx::pg_sys::panic::ErrorReport;
use pgrx::prelude::*;
mod audit;
mod cache;
mod catalog;
mod concurrency;
mod delta;
mod executor;
mod flush;
mod hooks;
mod internal_ddl;
mod lineage;
mod metrics;
mod owner;
mod propagate;
mod queue;
mod rebuild_worker;
mod refresh;
mod replication;
mod report;
mod revision;
mod trigger;
mod utils;
mod admin;
mod health;
mod lifecycle;
mod suspend;
mod config;
mod ddl;
mod dependency;
mod error;
mod install_sql;
mod jsonb_delta;
mod validation;
use error::{TViewError, TViewResult};
pg_module_magic!();
#[pg_extern]
#[must_use]
pub fn pg_tviews_is_suspended() -> bool {
crate::suspend::is_suspended()
}
#[pg_extern]
pub fn pg_tviews_suspend_triggers() {
crate::suspend::suspend();
}
#[pg_extern]
pub fn pg_tviews_resume_triggers() -> Result<(), ErrorReport> {
crate::revision::check();
crate::suspend::resume()?;
if !crate::suspend::is_suspended() {
crate::suspend::catch_up()?;
}
Ok(())
}
#[pg_extern]
pub fn pg_tviews_refresh_all() -> Result<pgrx::datum::JsonB, ErrorReport> {
crate::revision::check();
if crate::suspend::is_suspended() {
return Err(TViewError::WrongState {
reason: "Cannot refresh: triggers are suspended".to_string(),
}
.into());
}
let start = std::time::Instant::now();
let order = crate::admin::refresh_all_in_dependency_order()?;
Ok(pgrx::datum::JsonB(serde_json::json!({
"refreshed_count": order.len(),
"order": order,
"duration_ms": start.elapsed().as_millis(),
})))
}
#[pg_extern]
#[must_use]
pub fn pg_tviews_suspended_entities() -> Vec<String> {
crate::suspend::get_changed_entities()
}