use crate::control::catalog_entry::CatalogEntry;
use crate::control::metadata_proposer::propose_catalog_entry;
use crate::control::security::permission::prepare_owner;
use crate::control::state::SharedState;
use crate::types::TenantId;
use super::result::DdlError;
fn owner_err(sqlstate: &str, message: String) -> DdlError {
DdlError {
sqlstate: sqlstate.to_string(),
message,
}
}
pub fn propose_owner(
state: &SharedState,
object_type: &str,
tenant_id: TenantId,
object_name: &str,
owner_username: &str,
) -> Result<(), DdlError> {
let stored = prepare_owner(object_type, tenant_id, object_name, owner_username);
let entry = CatalogEntry::PutOwner(Box::new(stored.clone()));
let log_index = propose_catalog_entry(state, &entry)
.map_err(|e| owner_err("XX000", format!("metadata propose: {e}")))?;
if log_index == 0 {
{
let catalog = state.credentials.catalog();
catalog
.put_owner(&stored)
.map_err(|e| owner_err("XX000", format!("catalog write: {e}")))?;
}
state.permissions.install_replicated_owner(&stored);
}
Ok(())
}
pub fn propose_delete_owner(
state: &SharedState,
object_type: &str,
tenant_id: TenantId,
object_name: &str,
) -> Result<(), DdlError> {
let entry = CatalogEntry::DeleteOwner {
object_type: object_type.to_string(),
database_id: 0,
tenant_id: tenant_id.as_u64(),
object_name: object_name.to_string(),
};
let log_index = propose_catalog_entry(state, &entry)
.map_err(|e| owner_err("XX000", format!("metadata propose: {e}")))?;
if log_index == 0 {
{
let catalog = state.credentials.catalog();
catalog
.delete_owner(object_type, 0, tenant_id.as_u64(), object_name)
.map_err(|e| owner_err("XX000", format!("catalog write: {e}")))?;
}
state.permissions.install_replicated_remove_owner(
object_type,
tenant_id.as_u64(),
object_name,
);
}
Ok(())
}