use error::Result; const SCHEMA: &'static str = " CREATE TABLE `tracks` ( artist varchar(1024) NOT NULL, album varchar(1024) DEFAULT NULL, name varchar(1024) NOT NULL, timestamp integer(11) NOT NULL ); "; pub struct DB { conn: rusqlite::Connection, } impl DB { pub fn new>(path: &P) -> Result { let conn = if path.as_ref().exists() { rusqlite::Connection::open(path)? } else { Self::create(path)? }; return Ok(DB { conn }) } fn create>( path: &P ) -> Result { println!( "Initializing database at {}", path.as_ref().to_string_lossy(), ); if let Some(parent) = path.as_ref().parent() { std::fs::create_dir_all(parent)?; let conn = rusqlite::Connection::open(path)?; conn.execute(SCHEMA, rusqlite::NO_PARAMS)?; Ok(conn) } else { unimplemented!(); } } pub fn most_recent_timestamp(&self) -> Result> { Ok(self.conn.query_row( "SELECT timestamp FROM tracks ORDER BY timestamp DESC LIMIT 1", rusqlite::NO_PARAMS, |row| Some(row.get(0)) ).or_else(|e| { match e { rusqlite::Error::QueryReturnedNoRows => Ok(None), _ => Err(e), } })?) } }