github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/migration/migrations/1537546150_global_resource_version_history.down.go (about) 1 package migrations 2 3 import ( 4 "database/sql" 5 "encoding/json" 6 ) 7 8 type ResourceConfig struct { 9 Name string `json:"name"` 10 Public bool `json:"public,omitempty"` 11 WebhookToken string `json:"webhook_token,omitempty"` 12 Type string `json:"type"` 13 Source Source `json:"source"` 14 CheckEvery string `json:"check_every,omitempty"` 15 CheckTimeout string `json:"check_timeout,omitempty"` 16 Tags []string `json:"tags,omitempty"` 17 Version Version `json:"version,omitempty"` 18 } 19 20 type Source map[string]interface{} 21 22 type Params map[string]interface{} 23 24 type Version map[string]string 25 26 func (self *migrations) Down_1537546150() error { 27 tx, err := self.DB.Begin() 28 if err != nil { 29 return err 30 } 31 32 rows, err := tx.Query(`SELECT id, config, nonce FROM resources`) 33 if err != nil { 34 return err 35 } 36 37 type resource struct { 38 id int 39 type_ string 40 } 41 42 resources := []resource{} 43 for rows.Next() { 44 var ( 45 configBlob string 46 nonce sql.NullString 47 ) 48 49 r := resource{} 50 if err = rows.Scan(&r.id, &configBlob, &nonce); err != nil { 51 return err 52 } 53 54 var noncense *string 55 if nonce.Valid { 56 noncense = &nonce.String 57 } 58 59 decryptedConfig, err := self.Decrypt(string(configBlob), noncense) 60 if err != nil { 61 return err 62 } 63 64 var config ResourceConfig 65 err = json.Unmarshal(decryptedConfig, &config) 66 if err != nil { 67 return err 68 } 69 70 r.type_ = config.Type 71 72 resources = append(resources, r) 73 } 74 75 for _, r := range resources { 76 _, err = tx.Exec(`INSERT INTO versioned_resources (version, metadata, type, resource_id, check_order, enabled) 77 SELECT rcv.version, rcv.metadata, $2, r.id, rcv.check_order, 78 NOT EXISTS ( SELECT 1 FROM resource_disabled_versions d WHERE d.version_md5 = rcv.version_md5 AND d.resource_id = r.id ) 79 FROM resource_config_versions rcv, resources r 80 WHERE r.resource_config_id = rcv.resource_config_id AND r.id = $1 81 ON CONFLICT (resource_id, md5(version), type) DO UPDATE SET 82 metadata = EXCLUDED.metadata, 83 check_order = EXCLUDED.check_order, 84 enabled = EXCLUDED.enabled 85 `, r.id, r.type_) 86 if err != nil { 87 tx.Rollback() 88 return err 89 } 90 } 91 92 _, err = tx.Exec(`ALTER TABLE resources 93 ADD COLUMN last_checked timestamp with time zone, 94 DROP CONSTRAINT resources_resource_config_id_fkey, 95 ADD CONSTRAINT resources_resource_config_id_fkey FOREIGN KEY (resource_config_id) REFERENCES resource_configs(id) ON DELETE SET NULL`) 96 if err != nil { 97 tx.Rollback() 98 return err 99 } 100 101 _, err = tx.Exec(`ALTER TABLE resource_types 102 ADD COLUMN last_checked timestamp with time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, 103 ADD COLUMN version text`) 104 if err != nil { 105 tx.Rollback() 106 return err 107 } 108 109 _, err = tx.Exec(`ALTER TABLE resource_configs DROP COLUMN last_checked, 110 DROP COLUMN check_error`) 111 if err != nil { 112 tx.Rollback() 113 return err 114 } 115 116 _, err = tx.Exec(`ALTER TABLE resource_types DROP COLUMN check_error`) 117 if err != nil { 118 tx.Rollback() 119 return err 120 } 121 122 _, err = tx.Exec(`DROP TABLE build_resource_config_version_inputs`) 123 if err != nil { 124 tx.Rollback() 125 return err 126 } 127 128 _, err = tx.Exec(`DROP TABLE build_resource_config_version_outputs`) 129 if err != nil { 130 tx.Rollback() 131 return err 132 } 133 134 _, err = tx.Exec(`TRUNCATE TABLE next_build_inputs`) 135 if err != nil { 136 tx.Rollback() 137 return err 138 } 139 140 _, err = tx.Exec(`ALTER TABLE next_build_inputs DROP COLUMN resource_config_version_id, 141 DROP COLUMN resource_id, 142 ADD COLUMN version_id integer NOT NULL`) 143 if err != nil { 144 tx.Rollback() 145 return err 146 } 147 148 _, err = tx.Exec(`CREATE INDEX next_build_inputs_version_id ON next_build_inputs USING btree (version_id)`) 149 if err != nil { 150 tx.Rollback() 151 return err 152 } 153 154 _, err = tx.Exec(`ALTER TABLE ONLY next_build_inputs 155 ADD CONSTRAINT next_build_inputs_version_id_fkey FOREIGN KEY (version_id) REFERENCES versioned_resources(id) ON DELETE CASCADE`) 156 if err != nil { 157 tx.Rollback() 158 return err 159 } 160 161 _, err = tx.Exec(`TRUNCATE TABLE independent_build_inputs`) 162 if err != nil { 163 tx.Rollback() 164 return err 165 } 166 167 _, err = tx.Exec(`ALTER TABLE independent_build_inputs DROP COLUMN resource_config_version_id, DROP COLUMN resource_id, ADD COLUMN version_id integer NOT NULL`) 168 if err != nil { 169 tx.Rollback() 170 return err 171 } 172 173 _, err = tx.Exec(`CREATE INDEX independent_build_inputs_version_id ON independent_build_inputs USING btree (version_id)`) 174 if err != nil { 175 tx.Rollback() 176 return err 177 } 178 179 _, err = tx.Exec(`ALTER TABLE ONLY independent_build_inputs 180 ADD CONSTRAINT independent_build_inputs_version_id_fkey FOREIGN KEY (version_id) REFERENCES versioned_resources(id) ON DELETE CASCADE`) 181 if err != nil { 182 tx.Rollback() 183 return err 184 } 185 186 _, err = tx.Exec(`DROP TABLE resource_config_versions`) 187 if err != nil { 188 tx.Rollback() 189 return err 190 } 191 192 _, err = tx.Exec(`DROP TABLE resource_disabled_versions`) 193 if err != nil { 194 tx.Rollback() 195 return err 196 } 197 198 _, err = tx.Exec(`DROP INDEX resource_caches_resource_config_id_version_params_hash_uniq`) 199 if err != nil { 200 tx.Rollback() 201 return err 202 } 203 204 _, err = tx.Exec(`ALTER TABLE resource_caches ALTER COLUMN version TYPE text USING version::text`) 205 if err != nil { 206 tx.Rollback() 207 return err 208 } 209 210 _, err = tx.Exec(`CREATE UNIQUE INDEX resource_caches_resource_config_id_version_params_hash_key ON resource_caches (resource_config_id, md5(version), params_hash)`) 211 if err != nil { 212 tx.Rollback() 213 return err 214 } 215 216 _, err = tx.Exec(`ALTER TABLE worker_resource_config_check_sessions ADD COLUMN team_id integer`) 217 if err != nil { 218 tx.Rollback() 219 return err 220 } 221 222 _, err = tx.Exec(`ALTER TABLE ONLY worker_resource_config_check_sessions 223 ADD CONSTRAINT worker_resource_config_check_sessions_team_id_fkey FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE`) 224 if err != nil { 225 tx.Rollback() 226 return err 227 } 228 229 _, err = tx.Exec(`DROP INDEX worker_resource_config_check_sessions_uniq`) 230 if err != nil { 231 tx.Rollback() 232 return err 233 } 234 235 _, err = tx.Exec(`CREATE UNIQUE INDEX worker_resource_config_check_sessions_uniq 236 ON worker_resource_config_check_sessions (resource_config_check_session_id, worker_base_resource_type_id, team_id)`) 237 if err != nil { 238 tx.Rollback() 239 return err 240 } 241 242 err = tx.Commit() 243 if err != nil { 244 tx.Rollback() 245 return err 246 } 247 248 return nil 249 }