/** Create a new build as a parent of $this and sets $this->ParentId. * Assumes many fields have been set prior to calling this function. **/ public function CreateParentBuild($numErrors, $numWarnings) { if ($numErrors < 0) { $numErrors = 0; } if ($numWarnings < 0) { $numWarnings = 0; } // Check if there's an existing build that should be the parent. // This would be a standalone build (parent=0) with no subproject // that matches our name, site, stamp, and projectid. $query = "SELECT id FROM build\n WHERE parentid = 0 AND name = '{$this->Name}' AND\n siteid = '{$this->SiteId}' AND stamp = '{$this->Stamp}' AND\n projectid = '{$this->ProjectId}'\n "; $result = pdo_query($query); if (pdo_num_rows($result) > 0) { $result_array = pdo_fetch_array($result); $this->SetParentId($result_array['id']); // Mark it as a parent (parentid of -1). pdo_query("UPDATE build SET parentid = -1 WHERE id = {$this->ParentId}"); } else { // Generate a UUID for the parent build. It is distinguished // from its children by the lack of SubProject (final parameter). $uuid = Build::GenerateUuid($this->Stamp, $this->Name, $this->SiteId, $this->ProjectId, ''); // Create the parent build here. Note how parent builds // are indicated by parentid == -1. $query = "INSERT INTO build\n (parentid, siteid, projectid, stamp, name, type, generator,\n starttime, endtime, submittime, builderrors, buildwarnings,\n uuid, changeid)\n VALUES\n ('-1', '{$this->SiteId}', '{$this->ProjectId}', '{$this->Stamp}',\n '{$this->Name}', '{$this->Type}', '{$this->Generator}',\n '{$this->StartTime}', '{$this->EndTime}', '{$this->SubmitTime}',\n {$numErrors}, {$numWarnings}, '{$uuid}', '{$this->PullRequest}')"; if (!pdo_query($query)) { // Check if somebody else beat us to creating this parent build. $existing_id_result = pdo_single_row_query("SELECT id FROM build WHERE uuid = '{$uuid}'"); if ($existing_id_result && array_key_exists('id', $existing_id_result)) { $this->SetParentId($existing_id_result['id']); return false; } else { add_last_sql_error('Build Insert Parent', $this->ProjectId, $this->Id); return false; } } if (!$this->ParentId) { $this->SetParentId(pdo_insert_id('build')); } } // Update the parent's tally of build errors & warnings. $this->UpdateBuild($this->ParentId, $numErrors, $numWarnings); // Give the parent a label for this build's subproject. $label = new Label(); $label->Text = $this->SubProjectName; $parent = new Build(); $parent->Id = $this->ParentId; $parent->AddLabel($label); $parent->InsertLabelAssociations(); // Since we just created a parent we should also update any existing // builds that should be a child of this parent but aren't yet. // This happens when Update.xml is parsed first, because it doesn't // contain info about what subproject it came from. // TODO: maybe we don't need this any more? $query = "UPDATE build SET parentid={$this->ParentId}\n WHERE parentid=0 AND siteid='{$this->SiteId}' AND\n name='{$this->Name}' AND stamp='{$this->Stamp}' AND\n projectid={$this->ProjectId}"; if (!pdo_query($query)) { add_last_sql_error('Build Insert Update Parent', $this->ProjectId, $this->ParentId); } return true; }