diff --git a/src/router/clear_rate.rs b/src/router/clear_rate.rs index 09a761f..fcd8c27 100644 --- a/src/router/clear_rate.rs +++ b/src/router/clear_rate.rs @@ -25,8 +25,8 @@ pub struct Live { pub master_pass: i64, } -fn setup_tables(conn: &SQLite) { - conn.lock_and_exec("CREATE TABLE IF NOT EXISTS lives ( +fn setup_tables(conn: &rusqlite::Connection) { + conn.execute_batch("CREATE TABLE IF NOT EXISTS lives ( live_id INT NOT NULL PRIMARY KEY, normal_failed BIGINT NOT NULL, normal_pass BIGINT NOT NULL, @@ -36,11 +36,11 @@ fn setup_tables(conn: &SQLite) { expert_pass BIGINT NOT NULL, master_failed BIGINT NOT NULL, master_pass BIGINT NOT NULL - )", params!()); - conn.lock_and_exec("CREATE TABLE IF NOT EXISTS scores ( + ); + CREATE TABLE IF NOT EXISTS scores ( live_id INT NOT NULL PRIMARY KEY, score_data TEXT NOT NULL - )", params!()); + );").unwrap(); } fn update_live_score(id: i64, uid: i64, score: i64) { diff --git a/src/router/event_ranking.rs b/src/router/event_ranking.rs index d84fd2d..072df2c 100644 --- a/src/router/event_ranking.rs +++ b/src/router/event_ranking.rs @@ -11,11 +11,11 @@ lazy_static! { static ref CACHED_DATA: Mutex> = Mutex::new(None); } -fn setup_tables(conn: &SQLite) { - conn.lock_and_exec("CREATE TABLE IF NOT EXISTS scores ( +fn setup_tables(conn: &rusqlite::Connection) { + conn.execute_batch("CREATE TABLE IF NOT EXISTS scores ( event_id INT NOT NULL PRIMARY KEY, score_data TEXT NOT NULL - )", params!()); + );").unwrap(); } pub fn live_completed(event_id: u32, uid: i64, score: i64, star_level: i64) { diff --git a/src/router/gree.rs b/src/router/gree.rs index ed79a72..cf84d1f 100644 --- a/src/router/gree.rs +++ b/src/router/gree.rs @@ -22,12 +22,12 @@ lazy_static! { static ref DATABASE: SQLite = SQLite::new("gree.db", setup_tables); } -fn setup_tables(conn: &SQLite) { - conn.create_store_v2("CREATE TABLE IF NOT EXISTS users ( +fn setup_tables(conn: &rusqlite::Connection) { + conn.execute_batch("CREATE TABLE IF NOT EXISTS users ( cert TEXT NOT NULL, uuid TEXT NOT NULL, user_id BIGINT NOT NULL PRIMARY KEY - )"); + );").unwrap(); } fn update_cert(uid: i64, cert: &str) { diff --git a/src/router/userdata/mod.rs b/src/router/userdata/mod.rs index 567feaf..8a2f0a2 100644 --- a/src/router/userdata/mod.rs +++ b/src/router/userdata/mod.rs @@ -17,62 +17,63 @@ lazy_static! { }; } -fn setup_tables(conn: &SQLite) { - conn.create_store_v2("CREATE TABLE IF NOT EXISTS tokens ( - user_id BIGINT NOT NULL PRIMARY KEY, - token TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS migration ( - token TEXT NOT NULL PRIMARY KEY, - password TEXT NOT NULL - )"); - - conn.create_store_v2("CREATE TABLE IF NOT EXISTS userdata ( - user_id BIGINT NOT NULL PRIMARY KEY, - userdata TEXT NOT NULL, - friend_request_disabled INT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS userhome ( - user_id BIGINT NOT NULL PRIMARY KEY, - userhome TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS missions ( - user_id BIGINT NOT NULL PRIMARY KEY, - missions TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS loginbonus ( - user_id BIGINT NOT NULL PRIMARY KEY, - loginbonus TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS sifcards ( - user_id BIGINT NOT NULL PRIMARY KEY, - sifcards TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS friends ( - user_id BIGINT NOT NULL PRIMARY KEY, - friends TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS chats ( - user_id BIGINT NOT NULL PRIMARY KEY, - chats TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS event ( - user_id BIGINT NOT NULL PRIMARY KEY, - event TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS eventloginbonus ( - user_id BIGINT NOT NULL PRIMARY KEY, - eventloginbonus TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS server_data ( - user_id BIGINT NOT NULL PRIMARY KEY, - server_data TEXT NOT NULL - )"); - conn.create_store_v2("CREATE TABLE IF NOT EXISTS webui ( - user_id BIGINT NOT NULL PRIMARY KEY, - token TEXT NOT NULL, - last_login BIGINT NOT NULL - )"); +fn setup_tables(conn: &rusqlite::Connection) { + conn.execute_batch(" +CREATE TABLE IF NOT EXISTS tokens ( + user_id BIGINT NOT NULL PRIMARY KEY, + token TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS migration ( + token TEXT NOT NULL PRIMARY KEY, + password TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS userdata ( + user_id BIGINT NOT NULL PRIMARY KEY, + userdata TEXT NOT NULL, + friend_request_disabled INT NOT NULL +); +CREATE TABLE IF NOT EXISTS userhome ( + user_id BIGINT NOT NULL PRIMARY KEY, + userhome TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS missions ( + user_id BIGINT NOT NULL PRIMARY KEY, + missions TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS loginbonus ( + user_id BIGINT NOT NULL PRIMARY KEY, + loginbonus TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS sifcards ( + user_id BIGINT NOT NULL PRIMARY KEY, + sifcards TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS friends ( + user_id BIGINT NOT NULL PRIMARY KEY, + friends TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS chats ( + user_id BIGINT NOT NULL PRIMARY KEY, + chats TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS event ( + user_id BIGINT NOT NULL PRIMARY KEY, + event TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS eventloginbonus ( + user_id BIGINT NOT NULL PRIMARY KEY, + eventloginbonus TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS server_data ( + user_id BIGINT NOT NULL PRIMARY KEY, + server_data TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS webui ( + user_id BIGINT NOT NULL PRIMARY KEY, + token TEXT NOT NULL, + last_login BIGINT NOT NULL +); + ").unwrap(); } fn acc_exists(uid: i64) -> bool { diff --git a/src/sql.rs b/src/sql.rs index e0e0f87..ab02081 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -1,45 +1,29 @@ use rusqlite::{Connection, params, ToSql}; -use std::sync::Mutex; use json::{JsonValue, array}; use crate::router::clear_rate::Live; -macro_rules! lock_onto_mutex { - ($mutex:expr) => {{ - loop { - match $mutex.lock() { - Ok(value) => { - break value; - } - Err(_) => { - $mutex.clear_poison(); - std::thread::sleep(std::time::Duration::from_millis(10)); - } - } - } - }}; -} - pub struct SQLite { - engine: Mutex + path: String } impl SQLite { - pub fn new(path: &str, setup: fn(&SQLite)) -> SQLite { - let conn = Connection::open(crate::get_data_path(path)).unwrap(); - conn.execute("PRAGMA foreign_keys = ON;", ()).unwrap(); + pub fn new(path: &str, setup: fn(&Connection)) -> SQLite { let instance = SQLite { - engine: Mutex::new(conn) + path: crate::get_data_path(path) }; - setup(&instance); + let conn = Connection::open(&instance.path).unwrap(); + conn.busy_timeout(std::time::Duration::from_secs(10)).unwrap(); + conn.execute("PRAGMA foreign_keys = ON;", ()).unwrap(); + setup(&conn); instance } pub fn lock_and_exec(&self, command: &str, args: &[&dyn ToSql]) { - let conn = lock_onto_mutex!(self.engine); + let conn = Connection::open(&self.path).unwrap(); conn.execute(command, args).unwrap(); } pub fn lock_and_select(&self, command: &str, args: &[&dyn ToSql]) -> Result { - let conn = lock_onto_mutex!(self.engine); + let conn = Connection::open(&self.path).unwrap(); let mut stmt = conn.prepare(command)?; stmt.query_row(args, |row| { match row.get::(0) { @@ -49,7 +33,7 @@ impl SQLite { }) } pub fn lock_and_select_all(&self, command: &str, args: &[&dyn ToSql]) -> Result { - let conn = lock_onto_mutex!(self.engine); + let conn = Connection::open(&self.path).unwrap(); let mut stmt = conn.prepare(command)?; let map = stmt.query_map(args, |row| { match row.get::(0) { @@ -62,13 +46,13 @@ impl SQLite { let res = val?; match res.clone().parse::() { Ok(v) => rv.push(v).unwrap(), - Err(_) => rv.push(res).unwrap() + Err(_) => rv.push(res).unwrap() }; } Ok(rv) } pub fn get_live_data(&self, id: i64) -> Result { - let conn = lock_onto_mutex!(self.engine); + let conn = Connection::open(&self.path).unwrap(); let mut stmt = conn.prepare("SELECT * FROM lives WHERE live_id=?1")?; stmt.query_row(params!(id), |row| { Ok(Live { @@ -84,7 +68,4 @@ impl SQLite { }) }) } - pub fn create_store_v2(&self, table: &str) { - self.lock_and_exec(table, params!()); - } }