feat(server): SQLite store com migracoes e FTS5
This commit is contained in:
@@ -9,5 +9,42 @@ pub fn open(cfg: &Config) -> AppResult<Connection> {
|
||||
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;
|
||||
"#,
|
||||
)
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user