forked from vmware-archive/atc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sqldb_builds.go
130 lines (109 loc) · 2.44 KB
/
sqldb_builds.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package db
import (
"database/sql"
"strconv"
"strings"
)
func (db *SQLDB) FindJobIDForBuild(buildID int) (int, bool, error) {
row := db.conn.QueryRow(`
SELECT j.id
FROM jobs j
LEFT OUTER JOIN builds b ON j.id = b.job_id
LEFT OUTER JOIN pipelines p ON j.pipeline_id = p.id
WHERE b.id = $1
`, buildID)
var id int
err := row.Scan(&id)
if err != nil {
if err == sql.ErrNoRows {
return 0, false, nil
}
return 0, false, err
}
return id, true, nil
}
func (db *SQLDB) GetAllStartedBuilds() ([]Build, error) {
rows, err := db.conn.Query(`
SELECT ` + qualifiedBuildColumns + `
FROM builds b
LEFT OUTER JOIN jobs j ON b.job_id = j.id
LEFT OUTER JOIN pipelines p ON j.pipeline_id = p.id
LEFT OUTER JOIN teams t ON b.team_id = t.id
WHERE b.status = 'started'
`)
if err != nil {
return nil, err
}
defer rows.Close()
bs := []Build{}
for rows.Next() {
build, _, err := db.buildFactory.ScanBuild(rows)
if err != nil {
return nil, err
}
bs = append(bs, build)
}
return bs, nil
}
func (db *SQLDB) DeleteBuildEventsByBuildIDs(buildIDs []int) error {
if len(buildIDs) == 0 {
return nil
}
interfaceBuildIDs := make([]interface{}, len(buildIDs))
for i, buildID := range buildIDs {
interfaceBuildIDs[i] = buildID
}
indexStrings := make([]string, len(buildIDs))
for i := range indexStrings {
indexStrings[i] = "$" + strconv.Itoa(i+1)
}
tx, err := db.conn.Begin()
if err != nil {
return err
}
defer tx.Rollback()
_, err = tx.Exec(`
DELETE FROM build_events
WHERE build_id IN (`+strings.Join(indexStrings, ",")+`)
`, interfaceBuildIDs...)
if err != nil {
return err
}
_, err = tx.Exec(`
UPDATE builds
SET reap_time = now()
WHERE id IN (`+strings.Join(indexStrings, ",")+`)
`, interfaceBuildIDs...)
if err != nil {
return err
}
err = tx.Commit()
return err
}
func (db *SQLDB) FindLatestSuccessfulBuildsPerJob() (map[int]int, error) {
rows, err := db.conn.Query(
`SELECT max(id), job_id
FROM builds
WHERE job_id is not null
AND status = 'succeeded'
GROUP BY job_id`)
if err != nil {
if err == sql.ErrNoRows {
return map[int]int{}, nil
}
return nil, err
}
latestSuccessfulBuildsPerJob := map[int]int{}
for rows.Next() {
var id, job_id int
err := rows.Scan(&id, &job_id)
if err != nil {
if err == sql.ErrNoRows {
return map[int]int{}, nil
}
return nil, err
}
latestSuccessfulBuildsPerJob[job_id] = id
}
return latestSuccessfulBuildsPerJob, nil
}