Make db creation better

This commit is contained in:
2026-06-15 17:06:02 +03:00
parent eb5a51513d
commit 4e57f3fd6b
12 changed files with 162 additions and 155 deletions
+1
View File
@@ -3,4 +3,5 @@ pub(crate) mod card_sets;
pub(crate) mod card_stats;
pub(crate) mod voice;
pub(crate) mod settings;
pub(crate) mod sqlite;
-1
View File
@@ -1,4 +1,3 @@
use rusqlite::fallible_iterator::FallibleIterator;
use rusqlite::Connection;
pub fn get_setting(key: String, connection: &Connection) -> Option<String> {
+51
View File
@@ -0,0 +1,51 @@
use crate::dictionary::app_data_dir;
use rusqlite::Connection;
pub fn create_db() {
let path = app_data_dir();
let db_file = path.join("data.db");
if !db_file.exists() {
std::fs::File::create(&db_file).unwrap();
let connection = Connection::open(&db_file).unwrap();
connection.execute("PRAGMA foreign_keys = ON;", []).unwrap();
create_tables(&connection);
}
}
fn create_tables(conn: &Connection) {
make_card_set(conn).unwrap();
make_settings(conn).unwrap();
make_word_group(conn).unwrap();
make_words(conn).unwrap();
make_card_stats(conn).unwrap();
}
fn make_settings(conn: &Connection) -> Result<(), rusqlite::Error> {
let query = include_str!("../../sql/settings.sql");
conn.execute(query, ())?;
Ok(())
}
fn make_card_set(conn: &Connection) -> Result<(), rusqlite::Error> {
let query = include_str!("../../sql/card_set.sql");
conn.execute(query, ())?;
Ok(())
}
fn make_word_group(conn: &Connection) -> Result<(), rusqlite::Error> {
let query = include_str!("../../sql/word_group.sql");
conn.execute(query, ())?;
conn.execute("insert into word_group (name) values (\"Слова\");", ())?;
Ok(())
}
fn make_words(conn: &Connection) -> Result<(), rusqlite::Error> {
let query = include_str!("../../sql/words.sql");
conn.execute(query, ())?;
Ok(())
}
fn make_card_stats(conn: &Connection) -> Result<(), rusqlite::Error> {
let query = include_str!("../../sql/card_stats.sql");
conn.execute(query, ())?;
Ok(())
}
-88
View File
@@ -1,95 +1,7 @@
use crate::dictionary::app_data_dir;
use crate::lang::{WordData, WordGroup};
use rusqlite::Connection;
use std::collections::HashMap;
pub fn create_db() {
let path = app_data_dir();
let db_file = path.join("data.db");
if !db_file.exists() {
std::fs::File::create(&db_file).unwrap();
let connection = Connection::open(&db_file).unwrap();
connection.execute("PRAGMA foreign_keys = ON;", []).unwrap();
create_tables(&connection);
}
}
fn create_tables(conn: &Connection) {
conn.execute(
"create table settings
(
id text primary key,
value text
);",
(),
)
.unwrap_or_else(|e| 0);
conn.execute(
"create table card_set
(
id INTEGER
primary key autoincrement,
name TEXT not null,
forward TEXT not null,
backward TEXT not null,
filter TEXT not null
);",
(),
)
.unwrap_or_else(|e| 0);
conn.execute(
"create table word_group
(
id INTEGER
primary key autoincrement,
name TEXT not null
);",
(),
)
.unwrap_or_else(|e| 0);
conn.execute(
"create table words
(
id INTEGER
primary key autoincrement,
key TEXT not null,
value TEXT not null,
tags TEXT not null,
more TEXT,
group_id integer default 1 not null
constraint words_word_group_id_fk
references word_group
on update cascade on delete cascade
);",
(),
)
.unwrap_or_else(|e| 0);
conn.execute(
"create table card_stats
(
id INTEGER
primary key autoincrement,
word_id INTEGER not null
references words
on delete cascade,
set_id TEXT not null
references card_set
on delete cascade,
score INTEGER default 1 not null,
last_opened integer not null
);",
(),
)
.unwrap_or_else(|e| 0);
conn.execute(
"insert into word_group (name)
values (\"Слова\");",
(),
)
.unwrap_or_else(|e| 0);
}
pub fn add_word(word: &mut WordData, connection: &Connection) {
let index = connection