use crate::lang::CardStatistics; use crate::repetitions::CardSetSettings; use rusqlite::Connection; use std::time::Instant; pub fn load_stats_of_set(set: &CardSetSettings, connection: &Connection) -> Vec { let mut stmt = connection.prepare("SELECT id, word_id, score, last_opened FROM card_stats WHERE set_id = ?1").unwrap(); let iter = stmt.query_map((set.id,), |row| { Ok(CardStatistics { id: row.get(0)?, word_id: row.get(1)?, set_id: set.id, score: row.get(2)?, last_open: row.get(3)?, }) }).unwrap(); let mut buffer = vec![]; for word in iter { buffer.push(word.unwrap()); } buffer } pub fn add_stat_list(stat: &mut Vec, connection: &Connection) { let inserting = stat.iter().map(|stat| format!("({}, {}, {}, {})", stat.word_id.to_string(), stat.set_id.to_string(), stat.score.to_string(), stat.last_open.timestamp().to_string())).collect::>().join(", "); let query = format!("INSERT INTO card_stats (word_id, set_id, score, last_opened) VALUES {}", inserting); let count = connection .execute( query.as_str(), ( ), ); if count.is_err() { println!("{}", count.unwrap_err()); return; } let last_index : u32 = connection.query_one("SELECT seq from sqlite_sequence WHERE name == ?1", ("card_stats".to_string(),), |row| row.get(0)).unwrap(); let start_index = last_index - (count.unwrap() as u32) + 1; let mut index = 0; for id in start_index..=last_index { stat[index].id = id as u32; index += 1; } } pub fn add_stat(stat: &mut CardStatistics, connection: &Connection) { let time = Instant::now(); let index = connection .query_row( "INSERT INTO card_stats (word_id, set_id, score, last_opened) VALUES (?1, ?2, ?3, ?4) RETURNING id", ( &stat.word_id, &stat.set_id, &stat.score, &stat.last_open.timestamp(), ), |row| row.get(0) ) .unwrap_or_else(|e| {println!("{}", e); 0}); stat.id = index; println!("Added stat: {}", time.elapsed().as_millis()); } pub fn update_stat_score(stat: &CardStatistics, connection: &Connection){ let time = Instant::now(); connection .execute( "UPDATE card_stats SET score = ?1, last_opened = ?2 WHERE id = ?3", ( &stat.score, &stat.last_open.timestamp(), &stat.id ), ) .unwrap_or_else(|e| {println!("{}", e); 0}); println!("Updated stat: {}", time.elapsed().as_millis()); } pub fn delete_stat(stat: &CardStatistics, connection: &Connection) { if stat.id == 0 { return; } connection .execute("DELETE FROM card_stats WHERE id = ?1", (&stat.id,)) .unwrap_or_else(|e| { println!("{}", e); 0 }); }