use reifydb_core::{
event::EventBus,
interface::catalog::{config::ConfigKey, id::NamespaceId},
};
use reifydb_runtime::context::clock::Clock;
use reifydb_transaction::{
interceptor::interceptors::Interceptors,
multi::transaction::MultiTransaction,
single::SingleTransaction,
transaction::{Transaction, admin::AdminTransaction, query::QueryTransaction},
};
use reifydb_type::value::{Value, identity::IdentityId};
use tracing::info;
use crate::{
Result,
catalog::{Catalog, namespace::NamespaceToCreate},
materialized::{
MaterializedCatalog,
load::{MaterializedCatalogLoader, config::load_configs},
},
};
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 apply_bootstrap_configs(
multi: &MultiTransaction,
single: &SingleTransaction,
catalog: &MaterializedCatalog,
eventbus: &EventBus,
configs: &[(ConfigKey, Value)],
) -> Result<()> {
if configs.is_empty() {
return Ok(());
}
let mut admin = AdminTransaction::new(
multi.clone(),
single.clone(),
eventbus.clone(),
Interceptors::default(),
IdentityId::system(),
Clock::Real,
)?;
let catalog_api = Catalog::new(catalog.clone());
for (key, value) in configs {
catalog_api.set_config(&mut admin, *key, value.clone())?;
}
admin.commit()?;
let mut qt = QueryTransaction::new(multi.begin_query()?, single.clone(), IdentityId::system());
load_configs(&mut Transaction::Query(&mut qt), catalog)?;
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())
}