use anyhow::Result;
use rusqlite::Connection;
pub use patina::eventlog::get_last_processed;
pub use patina::eventlog::initialize;
pub use patina::eventlog::insert_event;
pub use patina::eventlog::is_ref_repo;
pub use patina::eventlog::set_last_processed;
pub use patina::eventlog::PATINA_DB;
pub fn populate_fts5(conn: &Connection) -> Result<usize> {
conn.execute(
"CREATE VIRTUAL TABLE IF NOT EXISTS code_fts USING fts5(
symbol_name,
file_path,
content,
event_type,
tokenize='porter unicode61'
)",
[],
)?;
conn.execute("DELETE FROM code_fts", [])?;
let count = conn.execute(
r#"
INSERT INTO code_fts (symbol_name, file_path, content, event_type)
SELECT
json_extract(data, '$.name') as symbol_name,
source_id as file_path,
COALESCE(json_extract(data, '$.content'), json_extract(data, '$.signature'), '') as content,
event_type
FROM eventlog
WHERE event_type LIKE 'code.%'
AND event_type != 'code.symbol'
AND json_extract(data, '$.name') IS NOT NULL
GROUP BY source_id, event_type
"#,
[],
)?;
Ok(count)
}
pub fn populate_commits_fts5(conn: &Connection) -> Result<usize> {
conn.execute(
"CREATE VIRTUAL TABLE IF NOT EXISTS commits_fts USING fts5(
sha,
message,
author_name,
tokenize='porter unicode61'
)",
[],
)?;
conn.execute("DELETE FROM commits_fts", [])?;
let count = conn.execute(
r#"
INSERT INTO commits_fts (sha, message, author_name)
SELECT sha, message, author_name
FROM commits
WHERE message IS NOT NULL
"#,
[],
)?;
Ok(count)
}
pub fn populate_eventlog_fts5(conn: &Connection) -> Result<usize> {
conn.execute(
"CREATE VIRTUAL TABLE IF NOT EXISTS eventlog_fts USING fts5(
source_id UNINDEXED,
event_type UNINDEXED,
content,
tokenize='porter unicode61'
)",
[],
)?;
conn.execute("DELETE FROM eventlog_fts", [])?;
let count = conn.execute(
r#"
INSERT INTO eventlog_fts (source_id, event_type, content)
SELECT source_id, event_type,
json_extract(data, '$.content') as content
FROM eventlog
WHERE event_type IN ('session.decision', 'session.pattern',
'session.work', 'session.context')
AND length(json_extract(data, '$.content')) > 50
GROUP BY source_id, event_type, json_extract(data, '$.content')
"#,
[],
)?;
Ok(count)
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[test]
fn test_reexports_work() -> Result<()> {
let dir = tempdir()?;
let db_path = dir.path().join("test.db");
let conn = initialize(&db_path)?;
let data = r#"{"test": true}"#;
insert_event(
&conn,
"test.event",
"2026-01-30T00:00:00Z",
"test1",
None,
data,
)?;
assert_eq!(get_last_processed(&conn, "test")?, None);
set_last_processed(&conn, "test", "val")?;
assert_eq!(get_last_processed(&conn, "test")?, Some("val".to_string()));
Ok(())
}
}