From 0832c96c116f4c3a28bd22a0cdd287a3b0764c7b Mon Sep 17 00:00:00 2001 From: iximeow Date: Thu, 29 Dec 2022 19:08:01 +0000 Subject: record and present metrics --- src/dbctx.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'src/dbctx.rs') diff --git a/src/dbctx.rs b/src/dbctx.rs index 804f083..67740e8 100644 --- a/src/dbctx.rs +++ b/src/dbctx.rs @@ -39,6 +39,14 @@ pub enum TokenValidity { } #[derive(Debug, Clone, PartialEq, Eq)] +pub struct MetricRecord { + pub id: u64, + pub job_id: u64, + pub name: String, + pub value: String +} + +#[derive(Debug, Clone, PartialEq, Eq)] pub struct ArtifactRecord { pub id: u64, pub job_id: u64, @@ -58,6 +66,7 @@ impl DbCtx { let conn = self.conn.lock().unwrap(); conn.execute(sql::CREATE_ARTIFACTS_TABLE, ()).unwrap(); conn.execute(sql::CREATE_JOBS_TABLE, ()).unwrap(); + conn.execute(sql::CREATE_METRICS_TABLE, ()).unwrap(); conn.execute(sql::CREATE_COMMITS_TABLE, ()).unwrap(); conn.execute(sql::CREATE_REPOS_TABLE, ()).unwrap(); conn.execute(sql::CREATE_REPO_NAME_INDEX, ()).unwrap(); @@ -67,6 +76,17 @@ impl DbCtx { Ok(()) } + pub fn insert_metric(&self, job_id: u64, name: &str, value: &str) -> Result<(), String> { + let conn = self.conn.lock().unwrap(); + conn + .execute( + "insert into metrics (job_id, name, value) values (?1, ?2, ?3) on conflict (job_id, name) do update set value=excluded.value", + (job_id, name, value) + ) + .expect("can upsert"); + Ok(()) + } + pub fn new_commit(&self, sha: &str) -> Result { let conn = self.conn.lock().unwrap(); conn @@ -218,6 +238,21 @@ impl DbCtx { Ok(conn.last_insert_rowid() as u64) } + pub fn metrics_for_job(&self, job: u64) -> Result, String> { + let conn = self.conn.lock().unwrap(); + + let mut metrics_query = conn.prepare(sql::METRICS_FOR_JOB).unwrap(); + let mut result = metrics_query.query([job]).unwrap(); + let mut metrics = Vec::new(); + + while let Some(row) = result.next().unwrap() { + let (id, job_id, name, value): (u64, u64, String, String) = row.try_into().unwrap(); + metrics.push(MetricRecord { id, job_id, name, value }); + } + + Ok(metrics) + } + pub fn artifacts_for_job(&self, job: u64) -> Result, String> { let conn = self.conn.lock().unwrap(); -- cgit v1.1