[BE] Re-enable database pool for latency measuring

This commit is contained in:
Araozu 2023-12-13 15:05:17 -05:00
parent 39ab479ad5
commit bc671ea789
5 changed files with 73 additions and 17 deletions

View File

@ -1,6 +1,10 @@
use cors::Cors; use cors::Cors;
use once_cell::sync::OnceCell;
use sqlx::Connection; use sqlx::Connection;
use sqlx::MySql;
use sqlx::MySqlConnection; use sqlx::MySqlConnection;
use sqlx::Pool;
use sqlx::mysql::MySqlPoolOptions;
use std::env; use std::env;
use std::time::Instant; use std::time::Instant;
@ -14,15 +18,17 @@ mod online_classroom;
pub mod json_result; pub mod json_result;
static DB: OnceCell<Pool<MySql>> = OnceCell::new();
/// Opens & returns a connection to the database /// Opens & returns a connection to the database
/// ///
/// We don't use a connection pool because it often times out, /// We don't use a connection pool because it often times out,
/// we don't have a lot of traffic and reiniting the pool would /// we don't have a lot of traffic and reiniting the pool would
/// require to change a lot of code in multiple places. /// require to change a lot of code in multiple places.
pub async fn db() -> Result<MySqlConnection, String> { pub async fn db() -> Result<&'static Pool<MySql>, String> {
/* /*
Init DB and set it as a global variable Init DB and set it as a global variable
*/ * /
let db_url = match env::var("DATABASE_URL") { let db_url = match env::var("DATABASE_URL") {
Ok(url) => url, Ok(url) => url,
Err(_) => return Err("env DATABASE_URL not found".to_string()), Err(_) => return Err("env DATABASE_URL not found".to_string()),
@ -39,6 +45,53 @@ pub async fn db() -> Result<MySqlConnection, String> {
Err("Error connecting to DB".to_string()) Err("Error connecting to DB".to_string())
} }
} }
// */
let attempts = 3;
for _ in 0..attempts {
match DB.get() {
Some(db) => return Ok(db),
None => {
log::info!("DB not initialized, initializing from db()");
let _ = init_db().await;
}
}
}
log::error!("Failed to initialize DB after {} attempts", attempts);
Err("Failed to initialize DB".to_string())
}
pub async fn init_db() -> Result<(), String> {
/*
Init DB and set it as a global variable
*/
let db_url = match env::var("DATABASE_URL") {
Ok(url) => url,
Err(_) => return Err("env DATABASE_URL not found".to_string()),
};
let start = Instant::now();
let pool = MySqlPoolOptions::new()
.max_connections(5)
.connect(db_url.as_str())
.await;
log::info!("DB Pool connection took: {:?} ms", start.elapsed().as_millis());
match pool {
Ok(pool) => match DB.set(pool) {
Ok(_) => Ok(()),
Err(_) => {
log::error!("Failed to set DB global variable");
Err("Failed to set DB".to_string())
}
},
Err(e) => {
log::error!("Error connecting to DB: {}", e);
Err("Error connecting to DB".to_string())
}
}
} }
#[launch] #[launch]

View File

@ -36,7 +36,7 @@ impl Course {
}; };
let results = sqlx::query!("SELECT * FROM course") let results = sqlx::query!("SELECT * FROM course")
.fetch_all(&mut db) .fetch_all(db)
.await; .await;
let results = match results { let results = match results {
@ -73,7 +73,7 @@ impl Course {
"SELECT course_name FROM course WHERE course_id = ?", "SELECT course_name FROM course WHERE course_id = ?",
course_id course_id
) )
.fetch_one(&mut db) .fetch_one(db)
.await; .await;
match res { match res {

View File

@ -20,7 +20,7 @@ impl CustomLabel {
FROM custom_label FROM custom_label
"#, "#,
) )
.fetch_all(&mut db) .fetch_all(db)
.await; .await;
match result { match result {
@ -42,7 +42,7 @@ impl CustomLabel {
"SELECT custom_label_id FROM custom_label WHERE custom_label_value = ?", "SELECT custom_label_id FROM custom_label WHERE custom_label_value = ?",
value value
) )
.fetch_all(&mut db) .fetch_all(db)
.await; .await;
let result = match result { let result = match result {
@ -72,7 +72,7 @@ impl CustomLabel {
"INSERT INTO custom_label (custom_label_value) VALUES (?)", "INSERT INTO custom_label (custom_label_value) VALUES (?)",
value value
) )
.execute(&mut db) .execute(db)
.await; .await;
if let Err(err) = result { if let Err(err) = result {

View File

@ -36,16 +36,19 @@ pub struct Person {
impl Person { impl Person {
pub async fn get_by_dni(dni: i32) -> Result<Person, DBError> { pub async fn get_by_dni(dni: i32) -> Result<Person, DBError> {
let mut db = match db().await { let db = match db().await {
Ok(db) => db, Ok(db) => db,
Err(reason) => return Err(DBError::Str(reason)), Err(reason) => return Err(DBError::Str(reason)),
}; };
let start = Instant::now(); let start = Instant::now();
let result = sqlx::query_as!(Person, "SELECT * FROM person WHERE person_dni = ?", dni) let result = sqlx::query_as!(Person, "SELECT * FROM person WHERE person_dni = ?", dni)
.fetch_one(&mut db) .fetch_one(db)
.await; .await;
log::info!("DB query (person by dni) took: {:?} ms", start.elapsed().as_millis()); log::info!(
"DB query (person by dni) took: {:?} ms",
start.elapsed().as_millis()
);
match result { match result {
Ok(v) => Ok(v), Ok(v) => Ok(v),
@ -79,7 +82,7 @@ impl PersonCreate {
self.person_paternal_surname, self.person_paternal_surname,
self.person_maternal_surname, self.person_maternal_surname,
) )
.execute(&mut db) .execute(db)
.await; .await;
match result { match result {
@ -113,7 +116,7 @@ impl PersonLink {
self.person_classroom_username, self.person_classroom_username,
self.person_id, self.person_id,
) )
.execute(&mut db) .execute(db)
.await; .await;
match res { match res {

View File

@ -83,7 +83,7 @@ impl RegisterCreate {
self.person_id, self.person_id,
self.course_id self.course_id
) )
.execute(&mut db) .execute(db)
.await; .await;
match result { match result {
@ -107,7 +107,7 @@ impl RegisterCreate {
WHERE register_course_id IN WHERE register_course_id IN
(SELECT course_id FROM course WHERE course_name LIKE 'Matpel%')", (SELECT course_id FROM course WHERE course_name LIKE 'Matpel%')",
) )
.fetch_one(&mut db) .fetch_one(db)
.await; .await;
match res { match res {
@ -126,7 +126,7 @@ impl RegisterCreate {
WHERE register_course_id=?", WHERE register_course_id=?",
course_id course_id
) )
.fetch_one(&mut db) .fetch_one(db)
.await; .await;
match res { match res {
@ -345,7 +345,7 @@ impl Register {
WHERE register_person_id = (SELECT person_id FROM person WHERE person_dni = ?)", WHERE register_person_id = (SELECT person_id FROM person WHERE person_dni = ?)",
dni dni
) )
.fetch_all(&mut db) .fetch_all(db)
.await; .await;
log::info!( log::info!(
"DB (get register by id) took: {:?} ms", "DB (get register by id) took: {:?} ms",
@ -381,7 +381,7 @@ impl Register {
let mut db = db().await?; let mut db = db().await?;
let res = sqlx::query!("DELETE FROM register WHERE register_id = ?", register_id) let res = sqlx::query!("DELETE FROM register WHERE register_id = ?", register_id)
.execute(&mut db) .execute(db)
.await; .await;
match res { match res {