diff --git a/server/src/store.rs b/server/src/store.rs index 10674d7..9c2ebe9 100644 --- a/server/src/store.rs +++ b/server/src/store.rs @@ -9,5 +9,42 @@ pub fn open(cfg: &Config) -> AppResult { let db = Connection::open(&cfg.db_path)?; db.pragma_update(None, "journal_mode", "WAL")?; db.pragma_update(None, "synchronous", "NORMAL")?; + migrate(&db)?; Ok(db) +} + +pub fn migrate(db: &Connection) -> rusqlite::Result<()> { + db.execute_batch( + r#" + CREATE TABLE IF NOT EXISTS files ( + id TEXT PRIMARY KEY, + peer_id TEXT NOT NULL, + name TEXT NOT NULL, + description TEXT NOT NULL DEFAULT '', + ftype TEXT NOT NULL, + extension TEXT NOT NULL DEFAULT '', + size_bytes INTEGER NOT NULL, + hash TEXT NOT NULL UNIQUE, + license TEXT NOT NULL DEFAULT 'authored', + tags TEXT NOT NULL DEFAULT '[]', + created_at INTEGER NOT NULL + ); + + CREATE VIRTUAL TABLE IF NOT EXISTS files_fts USING fts5( + name, description, tags, + content='files', content_rowid='rowid', + tokenize='unicode61' + ); + + CREATE TRIGGER IF NOT EXISTS files_ai AFTER INSERT ON files BEGIN + INSERT INTO files_fts(rowid, name, description, tags) + VALUES (new.rowid, new.name, new.description, new.tags); + END; + + CREATE TRIGGER IF NOT EXISTS files_ad AFTER DELETE ON files BEGIN + INSERT INTO files_fts(files_fts, rowid, name, description, tags) + VALUES ('delete', old.rowid, old.name, old.description, old.tags); + END; + "#, + ) } \ No newline at end of file diff --git a/server/tests/store.rs b/server/tests/store.rs new file mode 100644 index 0000000..888a901 --- /dev/null +++ b/server/tests/store.rs @@ -0,0 +1,31 @@ +use ares_server::config::Config; +use ares_server::store; +use tempfile::tempdir; + +#[test] +fn migrate_creates_fts_table() { + let dir = tempdir().unwrap(); + let cfg = Config { + db_path: dir.path().join("t.db").to_string_lossy().into(), + ..Default::default() + }; + let db = store::open(&cfg).expect("open db"); + let has_fts: i64 = db + .query_row("SELECT count(*) FROM sqlite_master WHERE name='files_fts'", [], |r| r.get(0)) + .unwrap(); + assert_eq!(has_fts, 1); +} + +#[test] +fn migrate_creates_files_table() { + let dir = tempdir().unwrap(); + let cfg = Config { + db_path: dir.path().join("t.db").to_string_lossy().into(), + ..Default::default() + }; + let db = store::open(&cfg).expect("open db"); + let has_files: i64 = db + .query_row("SELECT count(*) FROM sqlite_master WHERE name='files'", [], |r| r.get(0)) + .unwrap(); + assert_eq!(has_files, 1); +} \ No newline at end of file