diff options
Diffstat (limited to 'src/database/database.rs')
| -rw-r--r-- | src/database/database.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/database/database.rs b/src/database/database.rs index 7444779..6ebbe1c 100644 --- a/src/database/database.rs +++ b/src/database/database.rs @@ -4,6 +4,8 @@ use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; use r2d2_sqlite::rusqlite::OptionalExtension; +use crate::database::submission::Submission; + use super::problem::Problem; use super::user::User; @@ -120,6 +122,27 @@ impl Database { .map_err(|e| DatabaseError::Query(e.to_string()))? ) } + + pub fn fetch_problem(&self, problem_id: i64) -> Result<Option<Problem>, DatabaseError> { + static QUERY: &str = include_str!("sql/fetch_problem.sql"); + let conn = self.pool + .get() + .map_err(|e| DatabaseError::Connection(e.to_string()))?; + let mut statement = conn.prepare(QUERY) + .map_err(|e| DatabaseError::Query(e.to_string()))?; + + Ok(statement + .query_one([problem_id], |row| { + Ok(Problem::new( + row.get("id")?, + row.get("title")?, + row.get("description")?, + )) + }) + .optional() + .map_err(|e| DatabaseError::Query(e.to_string()))? + ) + } pub fn fetch_problems(&self) -> Result<Vec<Problem>, DatabaseError> { static QUERY: &str = include_str!("sql/fetch_problems.sql"); @@ -143,6 +166,36 @@ impl Database { ) } + pub fn insert_submission( + &self, + user_id: i64, + problem_id: i64, + language: &str, + details: &str, + code: &str, + ) -> Result<Submission, DatabaseError> { + static QUERY: &str = include_str!("sql/insert_submission.sql"); + let conn = self.pool + .get() + .map_err(|e| DatabaseError::Connection(e.to_string()))?; + let mut statement = conn.prepare(QUERY) + .map_err(|e| DatabaseError::Query(e.to_string()))?; + + Ok(statement + .query_one((user_id, problem_id, language, details, code), |row| { + Ok(Submission::new( + row.get("id")?, + user_id, + problem_id, + language.to_owned(), + details.to_owned(), + code.to_owned() + )) + }) + .map_err(|e| DatabaseError::Query(e.to_string()))? + ) + } + pub fn initialize(&self) -> Result<(), DatabaseError> { static QUERY: &str = include_str!("sql/initialize.sql"); let conn = self.pool |
