use anyhow::{Context, Result};
use rusqlite::Connection;
use std::path::Path;
pub mod advice;
pub mod event;
pub mod memory;
pub mod project;
pub mod schema;
pub mod sync_state;
pub use memory::MemoryInput;
pub fn open(path: &Path) -> Result<Connection> {
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent).ok();
}
let conn = Connection::open(path).with_context(|| format!("open {}", path.display()))?;
conn.pragma_update(None, "journal_mode", "WAL")?;
conn.pragma_update(None, "synchronous", "NORMAL")?;
conn.pragma_update(None, "busy_timeout", 5000)?;
conn.pragma_update(None, "foreign_keys", "ON")?;
schema::migrate(&conn)?;
Ok(conn)
}
pub(crate) fn uuid_like() -> String {
use std::time::{SystemTime, UNIX_EPOCH};
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos())
.unwrap_or(0);
let pid = std::process::id();
let rand = std::ptr::addr_of!(nanos) as usize;
format!("{:016x}-{:08x}-{:08x}", nanos, pid, rand)
}