| OLD | NEW |
| 1 package buildbot | 1 package buildbot |
| 2 | 2 |
| 3 import ( | 3 import ( |
| 4 "database/sql" | 4 "database/sql" |
| 5 "encoding/json" | 5 "encoding/json" |
| 6 "fmt" | 6 "fmt" |
| 7 "time" |
| 7 ) | 8 ) |
| 8 | 9 |
| 9 // build from the database. | 10 // build from the database. |
| 10 func GetCommitsForBuild(master, builder string, buildNumber int) ([]string, erro
r) { | 11 func GetCommitsForBuild(master, builder string, buildNumber int) ([]string, erro
r) { |
| 11 stmt, err := DB.Preparex(fmt.Sprintf("SELECT revision FROM %s WHERE mast
er = ? AND builder = ? AND number = ?", TABLE_BUILD_REVISIONS)) | 12 stmt, err := DB.Preparex(fmt.Sprintf("SELECT revision FROM %s WHERE mast
er = ? AND builder = ? AND number = ?", TABLE_BUILD_REVISIONS)) |
| 12 if err != nil { | 13 if err != nil { |
| 13 return nil, fmt.Errorf("Unable to retrieve build revisions from
database - failed to prepare query: %v", err) | 14 return nil, fmt.Errorf("Unable to retrieve build revisions from
database - failed to prepare query: %v", err) |
| 14 } | 15 } |
| 15 defer stmt.Close() | 16 defer stmt.Close() |
| 16 commits := []string{} | 17 commits := []string{} |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // Get the commits associated with this build. | 85 // Get the commits associated with this build. |
| 85 build.Commits, err = GetCommitsForBuild(master, builder, buildNumber) | 86 build.Commits, err = GetCommitsForBuild(master, builder, buildNumber) |
| 86 if err != nil { | 87 if err != nil { |
| 87 return nil, fmt.Errorf("Could not retrieve commits for build: %v
", err) | 88 return nil, fmt.Errorf("Could not retrieve commits for build: %v
", err) |
| 88 } | 89 } |
| 89 | 90 |
| 90 return &build, nil | 91 return &build, nil |
| 91 } | 92 } |
| 92 | 93 |
| 93 // ReplaceIntoDB inserts or updates the Build in the database. | 94 // ReplaceIntoDB inserts or updates the Build in the database. |
| 94 func (b Build) ReplaceIntoDB() (rv error) { | 95 func (b Build) ReplaceIntoDB() error { |
| 96 » var err error |
| 97 » for attempt := 0; attempt < 5; attempt++ { |
| 98 » » if err = b.replaceIntoDB(); err == nil { |
| 99 » » » return nil |
| 100 » » } |
| 101 » » time.Sleep(500 * time.Millisecond) |
| 102 » } |
| 103 » return err |
| 104 } |
| 105 |
| 106 // replaceIntoDB inserts or updates the Build in the database. |
| 107 func (b Build) replaceIntoDB() (rv error) { |
| 95 // Insert the build itself. | 108 // Insert the build itself. |
| 96 tx, err := DB.Beginx() | 109 tx, err := DB.Beginx() |
| 97 if err != nil { | 110 if err != nil { |
| 98 return fmt.Errorf("Unable to push build into database - Could no
t begin transaction: %v", err) | 111 return fmt.Errorf("Unable to push build into database - Could no
t begin transaction: %v", err) |
| 99 } | 112 } |
| 100 defer func() { | 113 defer func() { |
| 101 if rv != nil { | 114 if rv != nil { |
| 102 if err := tx.Rollback(); err != nil { | 115 if err := tx.Rollback(); err != nil { |
| 103 err = fmt.Errorf("Failed to rollback the transac
tion! %v... Previous error: %v", err, rv) | 116 err = fmt.Errorf("Failed to rollback the transac
tion! %v... Previous error: %v", err, rv) |
| 104 } | 117 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 134 if err != nil { | 147 if err != nil { |
| 135 return fmt.Errorf("Failed to delete build steps from database: %
v", err) | 148 return fmt.Errorf("Failed to delete build steps from database: %
v", err) |
| 136 } | 149 } |
| 137 // Actually insert the steps. | 150 // Actually insert the steps. |
| 138 insertStepStmt, err := tx.Preparex(fmt.Sprintf("REPLACE INTO %s (builder
,master,buildNumber,name,results,number,started,finished) VALUES (?,?,?,?,?,?,?,
?);", TABLE_BUILD_STEPS)) | 151 insertStepStmt, err := tx.Preparex(fmt.Sprintf("REPLACE INTO %s (builder
,master,buildNumber,name,results,number,started,finished) VALUES (?,?,?,?,?,?,?,
?);", TABLE_BUILD_STEPS)) |
| 139 if err != nil { | 152 if err != nil { |
| 140 return fmt.Errorf("Unable to push buildsteps into database - Cou
ld not prepare statement: %v", err) | 153 return fmt.Errorf("Unable to push buildsteps into database - Cou
ld not prepare statement: %v", err) |
| 141 } | 154 } |
| 142 defer insertStepStmt.Close() | 155 defer insertStepStmt.Close() |
| 143 for _, s := range b.Steps { | 156 for _, s := range b.Steps { |
| 144 » » _, err = insertStepStmt.Exec(s.BuilderName, s.MasterName, s.Buil
dNumber, s.Name, s.Results, s.Number, s.Started, s.Finished) | 157 » » _, err = insertStepStmt.Exec(b.BuilderName, b.MasterName, b.Numb
er, s.Name, s.Results, s.Number, s.Started, s.Finished) |
| 145 if err != nil { | 158 if err != nil { |
| 146 » » » return fmt.Errorf("Failed to push build into database: %
v", err) | 159 » » » return fmt.Errorf("Failed to push build step into databa
se: %v", err) |
| 147 } | 160 } |
| 148 | 161 |
| 149 } | 162 } |
| 150 | 163 |
| 151 // Commits. | 164 // Commits. |
| 152 | 165 |
| 153 // First, delete existing revisions so that we don't have leftovers | 166 // First, delete existing revisions so that we don't have leftovers |
| 154 // hanging around from before. | 167 // hanging around from before. |
| 155 delCmtsStmt, err := tx.Preparex(fmt.Sprintf("DELETE FROM %s WHERE master
= ? AND builder = ? AND number = ?;", TABLE_BUILD_REVISIONS)) | 168 delCmtsStmt, err := tx.Preparex(fmt.Sprintf("DELETE FROM %s WHERE master
= ? AND builder = ? AND number = ?;", TABLE_BUILD_REVISIONS)) |
| 156 if err != nil { | 169 if err != nil { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 if err != nil { | 217 if err != nil { |
| 205 return nil, fmt.Errorf("Unable to retrieve unfinished builds - C
ould not prepare statement: %v", err) | 218 return nil, fmt.Errorf("Unable to retrieve unfinished builds - C
ould not prepare statement: %v", err) |
| 206 } | 219 } |
| 207 defer stmt.Close() | 220 defer stmt.Close() |
| 208 b := []*Build{} | 221 b := []*Build{} |
| 209 if err = stmt.Select(&b); err != nil { | 222 if err = stmt.Select(&b); err != nil { |
| 210 return nil, fmt.Errorf("Unable to retrieve unfinished builds: %v
", err) | 223 return nil, fmt.Errorf("Unable to retrieve unfinished builds: %v
", err) |
| 211 } | 224 } |
| 212 return b, nil | 225 return b, nil |
| 213 } | 226 } |
| OLD | NEW |