use crate::{
ast::CreateDatabaseStmt,
catalog::{
error::CatalogError,
manager::CatalogManager,
objects::{SchemaEntry, database::DatabaseEntry},
},
common::symbol::Symbol,
};
impl CatalogManager {
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);
let public = self.interner.intern("public");
let public_oid = self.catalog.next_oid();
let public_schema = SchemaEntry::new(public_oid, public, owner, stmt.name);
self.catalog
.databases
.get_mut(&stmt.name)
.unwrap()
.schemas
.insert(public, public_schema);
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(())
}
}