use pgrx::pg_sys::panic::ErrorReport;
use pgrx::prelude::*;
use crate::error::TViewError;
#[pg_extern]
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]
#[allow(clippy::type_complexity)] fn pg_tviews_rebuild_all(
only_empty: default!(bool, true),
) -> Result<TableIterator<'static, (name!(entity, String), name!(rows_inserted, i64))>, ErrorReport>
{
crate::revision::check();
Ok(TableIterator::new(crate::replication::rebuild_all(
only_empty,
)?))
}
#[pg_extern]
fn pg_tviews_stats_reset(tview: default!(Option<&str>, "NULL")) -> Result<(), ErrorReport> {
crate::revision::check();
if let Some(name) = tview {
crate::stats::reset(&[crate::catalog::resolve::find(name)?.table], false)?;
} else {
let tables: Vec<_> = crate::catalog::row::relations()?
.into_iter()
.map(|listed| listed.table)
.collect();
crate::stats::reset(&tables, true)?;
}
Ok(())
}