feat(server): SQLite store com migracoes e FTS5

This commit is contained in:
2026-08-05 20:24:00 -03:00
parent bc4de69ab9
commit 9c7cb1c9b8
2 changed files with 68 additions and 0 deletions
+37
View File
@@ -9,5 +9,42 @@ pub fn open(cfg: &Config) -> AppResult<Connection> {
let db = Connection::open(&cfg.db_path)?; let db = Connection::open(&cfg.db_path)?;
db.pragma_update(None, "journal_mode", "WAL")?; db.pragma_update(None, "journal_mode", "WAL")?;
db.pragma_update(None, "synchronous", "NORMAL")?; db.pragma_update(None, "synchronous", "NORMAL")?;
migrate(&db)?;
Ok(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;
"#,
)
} }
+31
View File
@@ -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);
}