use crate::control::security::identity::AuthenticatedIdentity;
use crate::control::state::SharedState;
use crate::event::scheduler::cron::CronExpr;
use super::super::super::result::{DdlError, DdlResult};
use super::super::auth_support::status;
pub fn alter_schedule(
state: &SharedState,
identity: &AuthenticatedIdentity,
name: &str,
action: &str,
cron_expr: Option<&str>,
) -> Result<Vec<DdlResult>, DdlError> {
let tenant_id = identity.tenant_id.as_u64();
let mut def = state
.schedule_registry
.get(tenant_id, name)
.ok_or_else(|| DdlError {
sqlstate: "42704".to_string(),
message: format!("schedule \"{name}\" does not exist"),
})?;
match action {
"ENABLE" => {
def.enabled = true;
}
"DISABLE" => {
def.enabled = false;
}
"SET" => {
let new_cron = cron_expr.ok_or_else(|| DdlError {
sqlstate: "42601".to_string(),
message: "ALTER SCHEDULE SET CRON requires a quoted cron expression".to_string(),
})?;
CronExpr::parse(new_cron).map_err(|e| DdlError {
sqlstate: "22023".to_string(),
message: format!("invalid cron expression: {e}"),
})?;
def.cron_expr = new_cron.to_string();
}
_ => {
return Err(DdlError {
sqlstate: "42601".to_string(),
message: "ALTER SCHEDULE supports: ENABLE, DISABLE, SET CRON 'expr'".to_string(),
});
}
}
let entry = crate::control::catalog_entry::CatalogEntry::PutSchedule(Box::new(def.clone()));
super::super::super::catalog::propose_and_apply(state, &entry)?;
state.schedule_registry.update(def);
Ok(status("ALTER SCHEDULE"))
}