diff options
Diffstat (limited to 'src/database')
| -rw-r--r-- | src/database/database.rs | 53 | ||||
| -rw-r--r-- | src/database/sql/fetch_problem.sql | 1 | ||||
| -rw-r--r-- | src/database/sql/initialize.sql | 5 | ||||
| -rw-r--r-- | src/database/sql/insert_submission.sql | 1 | ||||
| -rw-r--r-- | src/database/submission.rs | 15 |
5 files changed, 66 insertions, 9 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 diff --git a/src/database/sql/fetch_problem.sql b/src/database/sql/fetch_problem.sql new file mode 100644 index 0000000..f319c2f --- /dev/null +++ b/src/database/sql/fetch_problem.sql @@ -0,0 +1 @@ +SELECT * FROM problem WHERE problem.id == ?1; diff --git a/src/database/sql/initialize.sql b/src/database/sql/initialize.sql index 72b7468..8c0f2ef 100644 --- a/src/database/sql/initialize.sql +++ b/src/database/sql/initialize.sql @@ -16,9 +16,10 @@ CREATE TABLE IF NOT EXISTS submission ( id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL, problem_id INTEGER NOT NULL, - code TEXT NOT NULL, language TEXT NOT NULL, - validated INTEGER NOT NULL + details TEXT NOT NULL, + code TEXT NOT NULL + ); INSERT INTO problem (title, description) VALUES ( diff --git a/src/database/sql/insert_submission.sql b/src/database/sql/insert_submission.sql new file mode 100644 index 0000000..96df322 --- /dev/null +++ b/src/database/sql/insert_submission.sql @@ -0,0 +1 @@ +INSERT INTO submission (user_id, problem_id, language, details, code) VALUES (?1, ?2, ?3, ?4, ?5) RETURNING id; diff --git a/src/database/submission.rs b/src/database/submission.rs index 2ec1287..4a83edd 100644 --- a/src/database/submission.rs +++ b/src/database/submission.rs @@ -5,9 +5,9 @@ pub struct Submission { id: i64, user_id: i64, problem_id: i64, - code: String, language: String, - validated: bool, + details: String, + code: String, } impl Submission { @@ -15,17 +15,18 @@ impl Submission { id: i64, user_id: i64, problem_id: i64, - code: String, language: String, - validated: bool, + details: String, + code: String, ) -> Self { - Self { id, user_id, problem_id, code, language, validated } + Self { id, user_id, problem_id, language, details, code } } pub fn id(&self) -> i64 { self.id } pub fn user_id(&self) -> i64 { self.user_id } pub fn problem_id(&self) -> i64 { self.problem_id } - pub fn code(&self) -> &str { &self.code } pub fn language(&self) -> &str { &self.language } - pub fn validated(&self) -> bool { self.validated } + pub fn details(&self) -> &str { &self.details } + pub fn code(&self) -> &str { &self.code } + } |
