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)?;
|
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;
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -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