1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2024-11-26 07:19:22 +00:00

Can log select queries

This commit is contained in:
Pierre HUBERT 2020-07-08 13:33:55 +02:00
parent 11051b28a0
commit df1e2ffd7b
3 changed files with 44 additions and 2 deletions

View File

@ -26,4 +26,7 @@ database:
host: localhost host: localhost
name: comunic name: comunic
username: pierre username: pierre
password: pierre password: pierre
# If set to true, every requests made on the database will be shown on the terminal
log_all_queries: true

View File

@ -11,6 +11,7 @@ pub struct DatabaseConfig {
pub name: String, pub name: String,
pub username: String, pub username: String,
pub password: String, pub password: String,
pub log_all_queries: bool,
} }
#[derive(Debug)] #[derive(Debug)]
@ -59,6 +60,7 @@ impl Config {
name: Config::yaml_str(parsed_db, "name"), name: Config::yaml_str(parsed_db, "name"),
username: Config::yaml_str(parsed_db, "username"), username: Config::yaml_str(parsed_db, "username"),
password: Config::yaml_str(parsed_db, "password"), password: Config::yaml_str(parsed_db, "password"),
log_all_queries: Config::yaml_bool(parsed_db, "log_all_queries"),
}; };
let proxy = Config::yaml_str(parsed, "proxy"); let proxy = Config::yaml_str(parsed, "proxy");

View File

@ -8,7 +8,7 @@ use chrono::{TimeZone, Utc};
use mysql::{Binary, Pool, ResultSet, Value}; use mysql::{Binary, Pool, ResultSet, Value};
use mysql::prelude::Queryable; use mysql::prelude::Queryable;
use crate::data::config::DatabaseConfig; use crate::data::config::{conf, DatabaseConfig};
use crate::data::error::{ExecError, ResultBoxError}; use crate::data::error::{ExecError, ResultBoxError};
use crate::data::group_id::GroupID; use crate::data::group_id::GroupID;
use crate::data::user::UserID; use crate::data::user::UserID;
@ -477,6 +477,11 @@ pub fn query<E, F: Fn(&RowResult) -> ProcessRowResult<E>>(info: QueryInfo, proce
query = query.add(&format!(" LIMIT {}", info.limit)); query = query.add(&format!(" LIMIT {}", info.limit));
} }
// Log query, if required
if conf().database.log_all_queries {
watcher::ExecDatabaseQuery::new(&query, &params).display()
}
// Execute query // Execute query
let mut con = get_connection()?; let mut con = get_connection()?;
let stmt = con.prep(&query).or_else(|err| { let stmt = con.prep(&query).or_else(|err| {
@ -859,4 +864,36 @@ pub fn update(u: UpdateInfo) -> ResultBoxError<()> {
)?; )?;
Ok(()) Ok(())
}
/// Private module used to watch what is going on the database
mod watcher {
/// Database logging & optimisation
pub struct ExecDatabaseQuery {
query: String,
values: Vec<mysql::Value>,
}
impl ExecDatabaseQuery {
/// Construct a new instance of this structure
pub fn new(query: &str, values: &Vec<mysql::Value>) -> ExecDatabaseQuery {
ExecDatabaseQuery {
query: query.to_string(),
values: values.clone(),
}
}
/// Display the values stored inside this query
pub fn display(&self) {
println!("==================");
println!("DB: {}", self.query);
println!("Arguments:");
for arg in &self.values {
println!("* {:?} ", arg);
}
println!()
}
}
} }