use crate::row_locks::{
shared_objects::{SharedCatalogLock, SharedObjectLockSession},
RelationLockMode,
};
use uqa_core::RelationIdentity;
use uqa_sql::SQLError;
pub const RELATION_CATALOG_CLASS_ID: u32 = 1259;
pub fn reserve_relation_name(
session: &dyn SharedObjectLockSession,
relation: &RelationIdentity,
in_use: impl FnOnce() -> Result<bool, SQLError>,
) -> Result<(), SQLError> {
reserve_catalog_name(
session,
relation,
RELATION_CATALOG_CLASS_ID,
"pg_class_relname_nsp_index",
in_use,
)
}
pub(super) fn reserve_catalog_name(
session: &dyn SharedObjectLockSession,
identity: &RelationIdentity,
class_id: u32,
index: &str,
in_use: impl FnOnce() -> Result<bool, SQLError>,
) -> Result<(), SQLError> {
let guard = session.acquire_shared_catalog(
SharedCatalogLock::Name {
class_id,
name: &identity.qualified_name(),
},
RelationLockMode::AccessExclusive,
)?;
session.refresh_shared_catalog()?;
if in_use()? {
return Err(SQLError::Routine {
sqlstate: "23505".into(),
message: format!("duplicate key value violates unique constraint \"{index}\""),
});
}
guard.retain();
Ok(())
}
#[cfg(test)]
mod tests;