use crate::{
ast::CreateDatabaseStmt,
catalog::{catalog::Catalog, error::CatalogError, objects::database::DatabaseEntry},
common::{interner::Interner, symbol::Symbol},
};
pub struct CatalogManager {
pub catalog: Catalog,
pub interner: Interner,
}
impl CatalogManager {
pub fn new(interner: Interner) -> Self {
Self {
catalog: Catalog::new(),
interner,
}
}
pub fn create_database(
&mut self,
stmt: CreateDatabaseStmt,
session_user: Symbol,
) -> Result<(), CatalogError> {
if self.catalog.databases.contains_key(&stmt.name) {
if stmt.if_not_exists {
return Ok(());
}
return Err(CatalogError::DatabaseAlreadyExists(stmt.name));
}
let owner = stmt.owner.unwrap_or(session_user);
let oid = self.catalog.next_oid();
let entry = DatabaseEntry::new(
oid,
stmt.name,
owner,
stmt.encoding,
stmt.locale,
stmt.tablespace,
stmt.connection_limit,
);
self.catalog.databases.insert(stmt.name, entry);
Ok(())
}
pub fn database_exists(&self, name: Symbol) -> bool {
self.catalog.databases.contains_key(&name)
}
pub fn get_database(&self, name: Symbol) -> Result<&DatabaseEntry, CatalogError> {
self.catalog
.databases
.get(&name)
.ok_or(CatalogError::DatabaseNotFound(name))
}
pub fn drop_database(&mut self, name: Symbol, if_exists: bool) -> Result<(), CatalogError> {
if self.catalog.databases.remove(&name).is_none() {
if if_exists {
return Ok(()); }
return Err(CatalogError::DatabaseNotFound(name));
}
Ok(())
}
pub fn role_exists(&self, _name: Symbol) -> bool {
true
}
pub fn tablespace_exists(&self, _name: Symbol) -> bool {
true
}
}