summaryrefslogtreecommitdiff
path: root/src/dbctx.rs
diff options
context:
space:
mode:
authoriximeow <git@iximeow.net>2022-12-29 19:08:01 +0000
committeriximeow <git@iximeow.net>2022-12-29 19:08:01 +0000
commit0832c96c116f4c3a28bd22a0cdd287a3b0764c7b (patch)
tree9b58beaf733a7ded11eb8519d37d41653f1e77fe /src/dbctx.rs
parente28b277980763b88d2828812bff2c0b9546d3d25 (diff)
record and present metrics
Diffstat (limited to 'src/dbctx.rs')
-rw-r--r--src/dbctx.rs35
1 files changed, 35 insertions, 0 deletions
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<u64, String> {
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<Vec<MetricRecord>, 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<Vec<ArtifactRecord>, String> {
let conn = self.conn.lock().unwrap();