use sqlx::postgres::types::Oid;
use super::exclusion::is_system_schema;
use super::shared::{SharedCatalog, class};
use crate::catalog::id::DbObjectId;
#[derive(Debug, Clone)]
pub struct RawReference {
pub source_oid: Oid,
pub ref_class: String,
pub ref_oid: Oid,
pub function_namespace: Option<Oid>,
pub function_name: Option<String>,
pub function_args: Option<String>,
pub operator_namespace: Option<Oid>,
pub operator_name: Option<String>,
pub operator_left_type: Option<String>,
pub operator_right_type: Option<String>,
}
impl RawReference {
pub fn dependency(&self, shared: &SharedCatalog) -> Option<DbObjectId> {
let ref_class = class::intern(&self.ref_class);
if let Some(extension) =
ref_class.and_then(|class| shared.extensions.owner(class, self.ref_oid))
{
return Some(DbObjectId::Extension {
name: extension.to_string(),
});
}
match self.ref_class.as_str() {
class::PG_TYPE => shared
.resolve_type(self.ref_oid)
.and_then(|referent| referent.dependency()),
class::PG_PROC => {
let schema = shared.namespaces.name(self.function_namespace?)?;
if is_system_schema(schema) {
return None;
}
Some(DbObjectId::Function {
schema: schema.to_string(),
name: self.function_name.clone()?,
arguments: self.function_args.clone().unwrap_or_default(),
})
}
class::PG_OPERATOR => {
let schema = shared.namespaces.name(self.operator_namespace?)?;
if is_system_schema(schema) {
return None;
}
Some(DbObjectId::Operator {
schema: schema.to_string(),
name: self.operator_name.clone()?,
arguments: format!(
"{}, {}",
self.operator_left_type.as_deref().unwrap_or("NONE"),
self.operator_right_type.as_deref().unwrap_or("NONE")
),
})
}
_ => None,
}
}
}