feat(daemon): timestamps
This commit is contained in:
		| @@ -3,6 +3,7 @@ package db | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"encoding/json" | ||||
| 	"time" | ||||
|  | ||||
| 	"code.dumpstack.io/tools/out-of-tree/api" | ||||
| ) | ||||
| @@ -17,6 +18,9 @@ func createJobTable(db *sql.DB) (err error) { | ||||
| 		"commit"	TEXT, | ||||
| 		config		TEXT, | ||||
| 		target		TEXT, | ||||
| 		created		INT, | ||||
| 		started		INT, | ||||
| 		finished	INT, | ||||
| 		status		TEXT DEFAULT "new" | ||||
| 	)`) | ||||
| 	return | ||||
| @@ -24,8 +28,8 @@ 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", ` + | ||||
| 		`config, target) ` + | ||||
| 		`VALUES ($1, $2, $3, $4, $5, $6);`) | ||||
| 		`config, target, created, started, finished) ` + | ||||
| 		`VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9);`) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| @@ -36,8 +40,9 @@ func AddJob(db *sql.DB, job *api.Job) (err error) { | ||||
| 	target := api.Marshal(job.Target) | ||||
|  | ||||
| 	res, err := stmt.Exec(job.UUID, job.Group, | ||||
| 		job.RepoName, job.Commit, | ||||
| 		config, target, | ||||
| 		job.RepoName, job.Commit, config, target, | ||||
| 		job.Created.Unix(), job.Started.Unix(), | ||||
| 		job.Finished.Unix(), | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| @@ -48,8 +53,12 @@ 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, status=$7 WHERE id=$8`) | ||||
| 	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`) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| @@ -61,13 +70,41 @@ func UpdateJob(db *sql.DB, job *api.Job) (err error) { | ||||
| 	_, err = stmt.Exec(job.UUID, job.Group, | ||||
| 		job.RepoName, job.Commit, | ||||
| 		config, target, | ||||
| 		job.Status, job.ID) | ||||
| 		job.Created.Unix(), job.Started.Unix(), | ||||
| 		job.Finished.Unix(), job.Status, job.ID) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| 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, | ||||
| 		&job.RepoName, &job.Commit, &config, &target, | ||||
| 		&created, &started, &finished, &job.Status) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	err = json.Unmarshal(config, &job.Artifact) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	err = json.Unmarshal(target, &job.Target) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	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, repo, "commit", ` + | ||||
| 		`config, target, status FROM job`) | ||||
| 	stmt, err := db.Prepare(`SELECT id, uuid, group_uuid, ` + | ||||
| 		`repo, "commit", config, target, created, ` + | ||||
| 		`started, finished, status FROM job`) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| @@ -82,24 +119,10 @@ func Jobs(db *sql.DB) (jobs []api.Job, err error) { | ||||
|  | ||||
| 	for rows.Next() { | ||||
| 		var job api.Job | ||||
| 		var config, target []byte | ||||
| 		err = rows.Scan(&job.ID, &job.UUID, &job.Group, | ||||
| 			&job.RepoName, &job.Commit, | ||||
| 			&config, &target, &job.Status) | ||||
| 		job, err = scanJob(rows.Scan) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		err = json.Unmarshal(config, &job.Artifact) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		err = json.Unmarshal(target, &job.Target) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		jobs = append(jobs, job) | ||||
| 	} | ||||
|  | ||||
| @@ -108,22 +131,15 @@ 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, ` + | ||||
| 		`repo, "commit", ` + | ||||
| 		`config, target, status ` + | ||||
| 		`repo, "commit", config, target, ` + | ||||
| 		`created, started, finished, status ` + | ||||
| 		`FROM job WHERE uuid=$1`) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	defer stmt.Close() | ||||
|  | ||||
| 	err = stmt.QueryRow(uuid).Scan(&job.ID, &job.UUID, | ||||
| 		&job.Group, &job.RepoName, &job.Commit, | ||||
| 		&job.Artifact, &job.Target, &job.Status) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| 	return scanJob(stmt.QueryRow(uuid).Scan) | ||||
| } | ||||
|  | ||||
| func JobStatus(db *sql.DB, uuid string) (st api.Status, err error) { | ||||
|   | ||||
| @@ -26,6 +26,8 @@ func TestJobTable(t *testing.T) { | ||||
|  | ||||
| 	job.Group = uuid.New().String() | ||||
|  | ||||
| 	job.Status = api.StatusSuccess | ||||
|  | ||||
| 	err = UpdateJob(db, &job) | ||||
| 	assert.Nil(t, err) | ||||
|  | ||||
| @@ -35,4 +37,14 @@ func TestJobTable(t *testing.T) { | ||||
| 	assert.Equal(t, 1, len(jobs)) | ||||
|  | ||||
| 	assert.Equal(t, job.Group, jobs[0].Group) | ||||
|  | ||||
| 	job, err = Job(db, job.UUID) | ||||
| 	assert.Nil(t, err) | ||||
|  | ||||
| 	assert.Equal(t, api.StatusSuccess, job.Status) | ||||
|  | ||||
| 	st, err := JobStatus(db, job.UUID) | ||||
| 	assert.Nil(t, err) | ||||
|  | ||||
| 	assert.Equal(t, job.Status, st) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user