diff --git a/src/data.rs b/src/data.rs index fc52ac3..47e7649 100644 --- a/src/data.rs +++ b/src/data.rs @@ -110,6 +110,8 @@ pub(crate) struct JobExitStatus { pub(crate) duration: time::Duration, /// The name of the container this job ran in pub(crate) container_name: String, + /// Uuid + pub(crate) job_uuid: String } // ========================== diff --git a/src/logging.rs b/src/logging.rs index 72d5083..529f3d2 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -5,7 +5,7 @@ use std::env; use std::fs::{create_dir_all, File, OpenOptions}; use std::io::Write; use std::path::Path; -use std::time::Instant; +use std::time::{Instant, SystemTime}; /// Logging for a [`Job`] // TODO: log to postgres instead; maybe i already made a comment todo-ing this idk @@ -75,14 +75,15 @@ impl JobLogger { } pub(crate) mod sql { + use chrono::{DateTime, Utc}; use sqlx::{Connection, PgConnection}; - use std::{env, time::Instant}; + use std::{env, time::SystemTime}; /// Returns a new connection to postgres /// /// *x*: How many times to retry the reconnect - pub(crate) async fn start(x: u16) -> Box<PgConnection> { - let mut conn = Box::new(db_connect_with_retries(x).await); + pub(crate) async fn start(x: u16) -> PgConnection { + let mut conn = db_connect_with_retries(x).await; create_tables(&mut conn).await; return conn; } @@ -138,38 +139,34 @@ pub(crate) mod sql { // TODO: when adding logging to postgres directly, update this so it 1) adds the job at the start, 2) logs line-by-line, and 3) adds the end time and exit code at the end of the job pub(crate) async fn log_job( - mut conn: Box<PgConnection>, - start_time: Instant, - end_time: Instant, + conn: &mut PgConnection, + start_time: SystemTime, + end_time: SystemTime, exit_code: Option<i32>, job_id: String, revision: String, uuid: String, log_path: String, ) { - let start_time = - chrono::DateTime::from_timestamp_millis(start_time.elapsed().as_millis() as i64) - .unwrap() - .format("%+") - .to_string(); - let end_time = - chrono::DateTime::from_timestamp_millis(end_time.elapsed().as_millis() as i64) - .unwrap() - .format("%+") - .to_string(); + let start_time: DateTime<Utc> = start_time.into(); + let start_time = start_time.format("%+").to_string(); + let end_time: DateTime<Utc> = end_time.into(); + let end_time = end_time.format("%+").to_string(); let exit_code = match exit_code { Some(code) => code.to_string(), None => "NULL".to_string(), }; - sqlx::query(format!("INSERT INTO job_logs (start_time, end_time, exit_code, job_id, revision, uuid, log_path) - VALUES ('{start_time}', '{end_time}', {exit_code}, '{job_id}', '{revision}', '{uuid}', '{log_path}')); -").as_str()).execute(conn.as_mut()).await.unwrap(); + let query = format!("INSERT INTO job_logs (start_time, end_time, exit_code, job_id, revision, uuid, log_path) VALUES ('{start_time}', '{end_time}', {exit_code}, '{job_id}', '{revision}', '{uuid}', '{log_path}')"); + sqlx::query(query.as_str()) + .execute(conn.as_mut()) + .await + .unwrap(); } /// Tries to connect to the database *x* times, panics after reaching that limit /// Creates table(s) for gregory if they don't exist already - pub(crate) async fn create_tables(conn: &mut Box<PgConnection>) { + pub(crate) async fn create_tables(conn: &mut PgConnection) { sqlx::query( "CREATE TABLE IF NOT EXISTS job_logs ( start_time timestamp, @@ -184,7 +181,7 @@ pub(crate) mod sql { ); ", ) - .execute(conn.as_mut()) + .execute(conn) .await .unwrap(); } diff --git a/src/main.rs b/src/main.rs index f18d1f1..1919b5c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,7 @@ use std::process::Command; use std::sync::Arc; use std::sync::Mutex; use std::time::Instant; +use std::time::SystemTime; use uuid::Uuid; mod cli; @@ -71,15 +72,34 @@ async fn run(config_path: String) { // TODO: Add logic to add repo update repos when relevant (see dependencies) here - or maybe do that logic earlier? let failed_packages: Vec<String> = Vec::new(); - + + + let mut pg_connection = sql::start(5).await; + // runs the jobs (will need to be updated after sorting is added) for (job_id, job) in state.jobs { - let job_exit_status = run_job(&state.conf, job_id, job); - println!("{:#?}", job_exit_status); + let start_time = SystemTime::now(); + let job_exit_status = run_job(&state.conf, job_id.clone(), job.clone()); + + // TODO: PUSH IT TO THE DB HERE + sql::log_job( + pg_connection.as_mut(), + start_time, + start_time + job_exit_status.duration, + job_exit_status.exit_code, + job_id, + job.revision, + job_exit_status.job_uuid, + job_exit_status.log_path, + ).await; } } -fn run_job(conf: &Config, job_id: String, job: Job) -> JobExitStatus { +fn run_job( + conf: &Config, + job_id: String, + job: Job, +) -> JobExitStatus { // limit threads to max_threads in the config let mut threads = job.threads; if job.threads > conf.max_threads { @@ -165,14 +185,13 @@ fn run_job(conf: &Config, job_id: String, job: Job) -> JobExitStatus { let log_path = job_logger.lock().unwrap().path(); - // TODO: PUSH IT TO THE DB HERE - return JobExitStatus { container_name: script_path, duration: cmd_output.clone().duration(), job, exit_code: cmd_output.status_code(), log_path, + job_uuid: run_id.to_string(), }; } @@ -289,7 +308,7 @@ struct State { /// ```ignore /// sqlx::query("DELETE FROM table").execute(&mut state.conn).await?; /// ``` - sql: Box<PgConnection>, + sql: PgConnection, } impl State {