Radish alpha
r
Radicle CI broker
Radicle
Git (anonymous pull)
Log in to clone via SSH
refactor: add Db::get_all_runs
Lars Wirzenius committed 1 year ago
commit bbf65cb29a892f6527160c0477922876c7098392
parent 968d0e091b0b3c9943aef24f9dd08504296a6673
3 files changed +50 -18
modified src/bin/cibtool.rs
@@ -551,9 +551,8 @@ impl ListRuns {
    fn run(&self, args: &Args) -> Result<(), CibToolError> {
        let db = args.open_db()?;

-
        for run_id in db.list_runs()? {
-
            let run = db.get_run(&run_id)?;
-
            println!("{run_id} {run:#?}");
+
        for run in db.get_all_runs()? {
+
            println!("{} {run:#?}", run.adapter_run_id().unwrap());
        }

        Ok(())
@@ -571,16 +570,9 @@ impl ReportCmd {
    fn run(&self, args: &Args) -> Result<(), CibToolError> {
        let db = args.open_db()?;

-
        let mut runs = vec![];
-
        for id in db.list_runs()? {
-
            if let Some(run) = db.get_run(&id)? {
-
                runs.push(run);
-
            }
-
        }
-

        let mut page = PageBuilder::default()
            .node_alias("FIXME")
-
            .runs(runs)
+
            .runs(db.get_all_runs()?)
            .build()?;

        page.write(&self.output_dir)?;
modified src/broker.rs
@@ -45,13 +45,7 @@ impl Broker {

    #[allow(clippy::result_large_err)]
    pub fn all_runs(&mut self) -> Result<Vec<Run>, BrokerError> {
-
        let mut runs = vec![];
-
        for run_id in self.db.list_runs().map_err(BrokerError::Db)? {
-
            if let Some(run) = self.db.get_run(&run_id).map_err(BrokerError::Db)? {
-
                runs.push(run);
-
            }
-
        }
-
        Ok(runs)
+
        Ok(self.db.get_all_runs()?)
    }

    pub fn set_default_adapter(&mut self, adapter: &Adapter) {
modified src/db.rs
@@ -386,6 +386,45 @@ impl Db {
        Ok(run_ids)
    }

+
    /// Return all CI runs currently in the database.
+
    pub fn get_all_runs(&self) -> Result<Vec<Run>, DbError> {
+
        let mut select = self.prepare("SELECT json FROM ci_runs")?;
+

+
        let started = Instant::now();
+
        let max_wait = Duration::from_millis(MAX_WAIT);
+

+
        let mut runs = vec![];
+

+
        loop {
+
            let next = select.stmt.next();
+
            match next {
+
                Ok(State::Row) => {
+
                    let json: String = select
+
                        .stmt
+
                        .read("json")
+
                        .map_err(|e| DbError::get_run(&select.sql, e))?;
+
                    let run = serde_json::from_str(&json)
+
                        .map_err(|e| DbError::run_from_json(&json, e))?;
+
                    runs.push(run);
+
                }
+
                Ok(State::Done) => {
+
                    break;
+
                }
+
                Err(e) if e.code.unwrap() == sqlite3_sys::SQLITE_BUSY as isize => {
+
                    if started.elapsed() < max_wait {
+
                        continue;
+
                    }
+
                    return Err(DbError::get_all_runs(&select.sql, e));
+
                }
+
                Err(e) => {
+
                    return Err(DbError::get_all_runs(&select.sql, e));
+
                }
+
            }
+
        }
+

+
        Ok(runs)
+
    }
+

    /// Return a specific CI run, given is id, if one exists.
    pub fn get_run(&self, id: &RunId) -> Result<Option<Run>, DbError> {
        let mut select = self.prepare("SELECT json FROM ci_runs WHERE run_id = :id")?;
@@ -605,6 +644,9 @@ pub enum DbError {
    #[error("failed to list CI runs in database")]
    ListRuns(String, #[source] sqlite::Error),

+
    #[error("failed to get all CI runs from database")]
+
    GetAllRuns(String, #[source] sqlite::Error),
+

    #[error("failed to parse CI run as JSON: {0}")]
    RunFromJson(String, #[source] serde_json::Error),

@@ -675,6 +717,10 @@ impl DbError {
        Self::ListRuns(sql.into(), e)
    }

+
    fn get_all_runs(sql: &str, e: sqlite::Error) -> Self {
+
        Self::GetAllRuns(sql.into(), e)
+
    }
+

    fn run_from_json(json: &str, e: serde_json::Error) -> Self {
        Self::RunFromJson(json.into(), e)
    }