From 1c8e1d068b2cb28794025e12c174e0967a6cb601 Mon Sep 17 00:00:00 2001 From: Mikhail Klementev Date: Wed, 28 Feb 2024 01:48:00 +0000 Subject: [PATCH] feat(daemon): query jobs by update time --- api/api.go | 8 +++----- cmd/daemon.go | 9 ++------- daemon/commands.go | 14 +------------- daemon/daemon.go | 2 +- daemon/db/job.go | 39 +++++++++++++++++++++++---------------- daemon/db/job_test.go | 2 +- 6 files changed, 31 insertions(+), 43 deletions(-) diff --git a/api/api.go b/api/api.go index a4cd85f..c1f1698 100644 --- a/api/api.go +++ b/api/api.go @@ -47,6 +47,8 @@ const ( type Job struct { ID int64 + UpdatedAt time.Time + // Job UUID UUID string // Group UUID @@ -83,11 +85,7 @@ type ListJobsParams struct { // Status of the job Status Status - // Time range (unix timestamps) - Time struct { - After int64 - Before int64 - } + UpdatedAfter int64 } type Repo struct { diff --git a/cmd/daemon.go b/cmd/daemon.go index e2de06b..91785ea 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -33,8 +33,7 @@ type DaemonJobsListCmd struct { Repo string `help:"repo name"` Commit string `help:"commit sha"` Status string `help:"job status"` - After time.Time `help:"created after" format:"2006-01-02 15:04:05"` - Before time.Time `help:"created before" format:"2006-01-02 15:04:05"` + After time.Time `help:"updated after" format:"2006-01-02 15:04:05"` } func (cmd *DaemonJobsListCmd) Run(dm *DaemonCmd, g *Globals) (err error) { @@ -48,11 +47,7 @@ func (cmd *DaemonJobsListCmd) Run(dm *DaemonCmd, g *Globals) (err error) { } if !cmd.After.IsZero() { - params.Time.After = cmd.After.Unix() - } - - if !cmd.Before.IsZero() { - params.Time.Before = cmd.Before.Unix() + params.UpdatedAfter = cmd.After.Unix() } jobs, err := c.Jobs(params) diff --git a/daemon/commands.go b/daemon/commands.go index 743abcf..e43665b 100644 --- a/daemon/commands.go +++ b/daemon/commands.go @@ -104,7 +104,7 @@ func listJobs(req *api.Req, resp *api.Resp, e cmdenv) (err error) { return } - jobs, err := db.Jobs(e.DB) + jobs, err := db.Jobs(e.DB, "updated >= ?", params.UpdatedAfter) if err != nil { return } @@ -123,18 +123,6 @@ func listJobs(req *api.Req, resp *api.Resp, e cmdenv) (err error) { if params.Status != "" && j.Status != params.Status { continue } - if params.Time.After != 0 { - if time.Unix(params.Time.After, 0). - After(j.Created) { - continue - } - } - if params.Time.Before != 0 { - if time.Unix(params.Time.Before, 0). - Before(j.Created) { - continue - } - } result = append(result, j) } diff --git a/daemon/daemon.go b/daemon/daemon.go index c66aedd..cbc5376 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -67,7 +67,7 @@ func (d *Daemon) Daemon() { for !d.shutdown { d.wg.Add(1) - jobs, err := db.Jobs(d.db) + jobs, err := db.Jobs(d.db, "") if err != nil && !d.shutdown { log.Error().Err(err).Msg("") d.wg.Done() diff --git a/daemon/db/job.go b/daemon/db/job.go index 5bf07b8..28e7d9d 100644 --- a/daemon/db/job.go +++ b/daemon/db/job.go @@ -12,6 +12,7 @@ func createJobTable(db *sql.DB) (err error) { _, err = db.Exec(` CREATE TABLE IF NOT EXISTS job ( id INTEGER PRIMARY KEY, + updated INT, uuid TEXT, group_uuid TEXT, repo TEXT, @@ -27,9 +28,9 @@ func createJobTable(db *sql.DB) (err error) { } func AddJob(db *sql.DB, job *api.Job) (err error) { - stmt, err := db.Prepare(`INSERT INTO job (uuid, group_uuid, repo, "commit", ` + + stmt, err := db.Prepare(`INSERT INTO job (updated, uuid, group_uuid, repo, "commit", ` + `config, target, created, started, finished) ` + - `VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9);`) + `VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);`) if err != nil { return } @@ -39,7 +40,7 @@ func AddJob(db *sql.DB, job *api.Job) (err error) { config := api.Marshal(job.Artifact) target := api.Marshal(job.Target) - res, err := stmt.Exec(job.UUID, job.Group, + res, err := stmt.Exec(time.Now().Unix(), job.UUID, job.Group, job.RepoName, job.Commit, config, target, job.Created.Unix(), job.Started.Unix(), job.Finished.Unix(), @@ -54,11 +55,11 @@ func AddJob(db *sql.DB, job *api.Job) (err error) { func UpdateJob(db *sql.DB, job *api.Job) (err error) { stmt, err := db.Prepare(`UPDATE job ` + - `SET uuid=$1, group_uuid=$2, repo=$3, ` + - `"commit"=$4, config=$5, target=$6, ` + - `created=$7, started=$8, finished=$9, ` + - `status=$10 ` + - `WHERE id=$11`) + `SET updated=$1, uuid=$2, group_uuid=$3, repo=$4, ` + + `"commit"=$5, config=$6, target=$7, ` + + `created=$8, started=$9, finished=$10, ` + + `status=$11 ` + + `WHERE id=$12`) if err != nil { return } @@ -67,7 +68,7 @@ func UpdateJob(db *sql.DB, job *api.Job) (err error) { config := api.Marshal(job.Artifact) target := api.Marshal(job.Target) - _, err = stmt.Exec(job.UUID, job.Group, + _, err = stmt.Exec(time.Now().Unix(), job.UUID, job.Group, job.RepoName, job.Commit, config, target, job.Created.Unix(), job.Started.Unix(), @@ -77,8 +78,8 @@ func UpdateJob(db *sql.DB, job *api.Job) (err error) { func scanJob(scan func(dest ...any) error) (job api.Job, err error) { var config, target []byte - var created, started, finished int64 - err = scan(&job.ID, &job.UUID, &job.Group, + var updated, created, started, finished int64 + err = scan(&job.ID, &updated, &job.UUID, &job.Group, &job.RepoName, &job.Commit, &config, &target, &created, &started, &finished, &job.Status) if err != nil { @@ -95,23 +96,28 @@ func scanJob(scan func(dest ...any) error) (job api.Job, err error) { return } + job.UpdatedAt = time.Unix(updated, 0) job.Created = time.Unix(created, 0) job.Started = time.Unix(started, 0) job.Finished = time.Unix(finished, 0) return } -func Jobs(db *sql.DB) (jobs []api.Job, err error) { - stmt, err := db.Prepare(`SELECT id, uuid, group_uuid, ` + +func Jobs(db *sql.DB, where string, args ...any) (jobs []api.Job, err error) { + q := `SELECT id, updated, uuid, group_uuid, ` + `repo, "commit", config, target, created, ` + - `started, finished, status FROM job`) + `started, finished, status FROM job` + if len(where) != 0 { + q += ` WHERE ` + where + } + stmt, err := db.Prepare(q) if err != nil { return } defer stmt.Close() - rows, err := stmt.Query() + rows, err := stmt.Query(args...) if err != nil { return } @@ -130,7 +136,8 @@ func Jobs(db *sql.DB) (jobs []api.Job, err error) { } func Job(db *sql.DB, uuid string) (job api.Job, err error) { - stmt, err := db.Prepare(`SELECT id, uuid, group_uuid, ` + + stmt, err := db.Prepare(`SELECT id, updated, uuid, ` + + `group_uuid, ` + `repo, "commit", config, target, ` + `created, started, finished, status ` + `FROM job WHERE uuid=$1`) diff --git a/daemon/db/job_test.go b/daemon/db/job_test.go index 0f08539..db44076 100644 --- a/daemon/db/job_test.go +++ b/daemon/db/job_test.go @@ -31,7 +31,7 @@ func TestJobTable(t *testing.T) { err = UpdateJob(db, &job) assert.Nil(t, err) - jobs, err := Jobs(db) + jobs, err := Jobs(db, "") assert.Nil(t, err) assert.Equal(t, 1, len(jobs))