use reifydb_core::{event::EventBus, interface::catalog::id::NamespaceId};
use reifydb_transaction::{
multi::transaction::MultiTransaction,
single::SingleTransaction,
transaction::{Transaction, admin::AdminTransaction, query::QueryTransaction},
};
use reifydb_type::value::identity::IdentityId;
use tracing::info;
use crate::{
Result,
catalog::{Catalog, namespace::NamespaceToCreate},
materialized::{MaterializedCatalog, load::MaterializedCatalogLoader},
};
pub mod binding;
pub mod identity;
pub mod metric;
pub mod procedure;
pub fn bootstrap_system_objects(
multi: &MultiTransaction,
single: &SingleTransaction,
catalog: &MaterializedCatalog,
eventbus: &EventBus,
) -> Result<()> {
identity::bootstrap_root_identity(multi, single, catalog, eventbus)?;
procedure::bootstrap_system_procedures(multi, single, catalog, eventbus)?;
binding::bootstrap_system_bindings(multi, single, catalog, eventbus)?;
metric::bootstrap_metric_ringbuffers(multi, single, catalog, eventbus)?;
Ok(())
}
pub fn load_materialized_catalog(
multi: &MultiTransaction,
single: &SingleTransaction,
catalog: &MaterializedCatalog,
) -> Result<()> {
let mut qt = QueryTransaction::new(multi.begin_query()?, single.clone(), IdentityId::system());
MaterializedCatalogLoader::load_all(&mut Transaction::Query(&mut qt), catalog)?;
Ok(())
}
pub(crate) fn ensure_namespace(
catalog_api: &Catalog,
admin: &mut AdminTransaction,
id: NamespaceId,
path: &str,
local_name: &str,
parent_id: NamespaceId,
) -> Result<NamespaceId> {
if let Some(ns) = catalog_api.find_namespace_by_path(&mut Transaction::Admin(admin), path)? {
return Ok(ns.id());
}
let ns = catalog_api.create_namespace_with_id(
admin,
id,
NamespaceToCreate {
namespace_fragment: None,
name: path.to_string(),
local_name: local_name.to_string(),
parent_id,
token: None,
grpc: None,
},
)?;
info!("Created {} namespace", path);
Ok(ns.id())
}