// auto-imports use crate::config::ScootalooConfig; // std use std::{ fs::{read_to_string, write}, error::Error, }; // log use log::debug; // rusqlite use rusqlite::{Connection, OpenFlags, params}; /// Reads last tweet id from a file pub fn read_state(s: &str) -> Option { let state = read_to_string(s); if let Ok(s) = state { debug!("Last Tweet ID (from file): {}", &s); return s.parse::().ok(); } None } /// Writes last treated tweet id to a file pub fn write_state(f: &str, s: u64) -> Result<(), std::io::Error> { write(f, format!("{}", s)) } /********* * Main functions *********/ /// Initiates the DB from path pub fn init_db(config: &ScootalooConfig) -> Result<(), Box> { let conn = Connection::open(&config.db_path)?; conn.execute( "CREATE TABLE IF NOT EXISTS tweet_to_toot ( tweet_id INTEGER PRIMARY KEY, toot_id TEXT UNIQUE )", [], )?; Ok(()) } #[cfg(test)] mod tests { use super::*; use std::{ fs::remove_file, path::Path, }; #[test] fn test_init_db() { let scootaloo_config = ScootalooConfig { db_path: String::from("/tmp/test_init_db.sqlite"), cache_path: String::from("/tmp/scootaloo"), }; init_db(&scootaloo_config).unwrap(); // check that file exist assert!(Path::new(&scootaloo_config.db_path).exists()); // open said file let conn = Connection::open_with_flags(&scootaloo_config.db_path, OpenFlags::SQLITE_OPEN_READ_ONLY).unwrap(); conn.execute( "SELECT * from tweet_to_toot;", [], ).unwrap(); conn.close().unwrap(); remove_file(&scootaloo_config.db_path).unwrap(); } #[test] fn test_read_state() { let scootaloo_config = ScootalooConfig { db_path: String::from("/tmp/test_read_state.sqlite"), cache_path: String::from("/tmp/scootaloo"), }; init_db(&scootaloo_config).unwrap(); let conn = Connection::open(&scootaloo_config.db_path).unwrap(); conn.execute( "INSERT INTO tweet_to_toot (tweet_id, toot_id) VALUES (?1, ?2)", params![123456789 as u64, String::from("987654321")], ).unwrap(); } }