summaryrefslogtreecommitdiff
path: root/src/database
diff options
context:
space:
mode:
Diffstat (limited to 'src/database')
-rw-r--r--src/database/database.rs53
-rw-r--r--src/database/sql/fetch_problem.sql1
-rw-r--r--src/database/sql/initialize.sql5
-rw-r--r--src/database/sql/insert_submission.sql1
-rw-r--r--src/database/submission.rs15
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 }
+
}