use std::fs;
use anyhow::{Context, Result};
use surrealdb::Surreal;
use surrealdb::engine::any::Any;
use crate::constants::setup_surql_path;
use crate::scaffold::DEFAULT_SETUP;
#[doc(hidden)]
pub async fn run_setup(db: &Surreal<Any>, folder: &str) -> Result<()> {
let setup_file = setup_surql_path(folder);
if !setup_file.exists()
&& let Err(err) = scaffold_setup_file(&setup_file)
{
log::warn!(
"could not scaffold {}: {err:#}. Using the built-in metadata schema instead.",
setup_file.display()
);
db.query(DEFAULT_SETUP).await?.check()?;
return Ok(());
}
let sql =
fs::read_to_string(&setup_file).with_context(|| format!("reading {:?}", setup_file))?;
db.query(&sql).await?.check()?;
if sql.trim() != DEFAULT_SETUP.trim() {
db.query(DEFAULT_SETUP).await?.check()?;
}
Ok(())
}
fn scaffold_setup_file(setup_file: &std::path::Path) -> Result<()> {
if let Some(parent) = setup_file.parent() {
fs::create_dir_all(parent).context("creating setup file directory")?;
}
fs::write(setup_file, DEFAULT_SETUP).with_context(|| format!("writing {:?}", setup_file))
}
pub(crate) async fn run_setup_embedded(db: &Surreal<Any>) -> Result<()> {
db.query(DEFAULT_SETUP).await?.check()?;
Ok(())
}