use crate::control::maintenance::clone_materializer::{
CloneMaterializerHandle, force_materialize_blocking,
};
use crate::control::security::identity::AuthenticatedIdentity;
use crate::control::state::SharedState;
use super::super::super::result::{DdlError, DdlResult};
use super::gate::require_database_owner_or_higher;
use super::support::{ddl_err, status};
pub fn alter_database_materialize(
state: &SharedState,
identity: &AuthenticatedIdentity,
name: &str,
) -> Result<Vec<DdlResult>, DdlError> {
let catalog = state.credentials.catalog();
let db_id = catalog
.get_database_id_by_name(name)
.map_err(|e| ddl_err("XX000", format!("catalog lookup failed: {e}")))?
.ok_or_else(|| ddl_err("3D000", format!("database '{name}' does not exist")))?;
require_database_owner_or_higher(
state,
identity,
db_id,
&format!("ALTER DATABASE {name} MATERIALIZE"),
)?;
let handle = CloneMaterializerHandle::new(db_id);
force_materialize_blocking(db_id, state, catalog, Some(&handle)).map_err(|e| match e {
crate::Error::BadRequest { detail } => ddl_err("0A000", detail),
other => ddl_err(
"XX000",
format!("clone materialization of '{name}' failed: {other}"),
),
})?;
state.audit_record_with_db(
crate::control::security::audit::AuditEvent::DatabaseMaterialized,
None,
Some(db_id),
&identity.username,
&format!("ALTER DATABASE {name} MATERIALIZE"),
);
Ok(status("ALTER DATABASE"))
}