Example #1
0
 /** 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;
 }