use crate::error::TViewResult;
use pgrx::prelude::*;
pub(crate) fn follow(table: Option<pg_sys::Oid>, owners: bool) -> TViewResult<()> {
let _internal = crate::internal_ddl::InternalDdl::begin();
unsafe { pg_sys::CommandCounterIncrement() };
if owners {
follow_owners(table)?;
}
follow_grants(table)
}
fn follow_grants(table: Option<pg_sys::Oid>) -> TViewResult<()> {
let changes = crate::catalog::queries::grant_changes(table)?;
for (view, statement) in changes {
let (Some(view), Some(statement)) = (view, statement) else {
continue;
};
let _owner = crate::owner::AsOwner::of_table(view)?;
crate::utils::spi::run_ddl(&statement)?;
}
Ok(())
}
fn follow_owners(table: Option<pg_sys::Oid>) -> TViewResult<()> {
let moves = crate::catalog::queries::owner_changes(table)?;
for (owner, statement) in moves {
let (Some(owner), Some(statement)) = (owner, statement) else {
continue;
};
super::in_extension_schema_for(owner, || crate::utils::spi::run_ddl(&statement))?;
}
Ok(())
}