use crate::facts::FactsDb;
use crate::{CodeLoreError, Options, Result};
use std::path::Path;
pub fn write_full_fact_store_sqlite(db: &FactsDb, _opts: &Options, path: &Path) -> Result<()> {
crate::output::atomic_publish(path, |tmp| {
let path_str = tmp.display().to_string().replace('\'', "''");
db.conn()
.execute_batch("INSTALL sqlite; LOAD sqlite;")
.map_err(|e| {
CodeLoreError::Output(format!(
"sqlite: could not load DuckDB's sqlite extension: {e}\n\
hint: `INSTALL sqlite` fetches the extension on first use and caches \
it under ~/.duckdb/extensions/<duckdb-version>/<platform>/, so it needs \
both network access and a writable cache directory. To export from an \
offline or locked-down host, run a sqlite export once where both are \
available and copy that directory across, or choose another --format."
))
})?;
let sql = format!(
"ATTACH '{path_str}' AS sink (TYPE SQLITE);
CREATE TABLE sink.commits AS SELECT * FROM commits;
CREATE TABLE sink.changes AS SELECT * FROM changes;
CREATE TABLE sink.hunks AS SELECT * FROM hunks;
CREATE TABLE sink.entities AS SELECT * FROM entities;
CREATE TABLE sink.complexity_metrics AS SELECT * FROM complexity_metrics;
CREATE TABLE sink.author_aliases AS SELECT * FROM author_aliases;
CREATE TABLE sink.provenance AS SELECT * FROM provenance;
CREATE TABLE sink.clones AS SELECT * FROM clones;
CREATE TABLE sink.imports AS SELECT * FROM imports;
CREATE TABLE sink.commit_parents AS SELECT * FROM commit_parents;
DETACH sink;"
);
db.conn()
.execute_batch(&sql)
.map_err(|e| CodeLoreError::Output(format!("sqlite: {e}")))?;
Ok(())
})
}