<?php
/*******************************************************************************
 *
 * Background: Written on June 1st 2006 by Patrick Jenkins <pjenkins@apple.com>
 * to accept test results  from the llvm NightlyTest.pl script.
 * Rewritten by Jim Laskey to use php, so that we can reuse code in
 * ProgramResults.php
 *
 *******************************************************************************/
 
/*******************************************************************************
 *
 * Start response early for debugging purposes
 *
 *******************************************************************************/
print "content-type: text/text\n\n";

$print_debug = 0;
$print_env = 0;


if ($print_debug) {
  print "Debug Printing On\n";
}

if ($print_env) {
  foreach ($_ENV as $key => $value) {
    print "_ENV $key => $value<br>\n";
  }
  
  foreach ($_SERVER as $key => $value) {
    print "_SERVER $key => $value<br>\n";
  }
  
  foreach ($_GET as $key => $value) {
    print "_GET $key => $value<br>\n";
  }
  
  foreach ($_POST as $key => $value) {
    print "_POST $key => $value<br>\n";
  }
  
  foreach ($_COOKIE as $key => $value) {
    print "_COOKIE $key => $value<br>\n";
  }
  
  foreach ($_FILES as $key => $value) {
  print "_FILES $key => $value<br>\n";
  }
  
  // Same as _POST
  foreach ($_REQUEST as $key => $value) {
    print "_REQUEST $key => $value<br>\n";
  }
}

/*******************************************************************************
 *
 * Include support code
 *
 *******************************************************************************/

if(!(include "NightlyTester.php")){
  print "Error: could not load necessary files!\n";
  die();
}

if(!(include"ProgramResults.php")){
  print "Error: could not load necessary files!\n";
  die();
}

if(!(include"AcceptTestResults.php")){
  print "Error: could not load necessary files!\n";
  die();
}

if ($print_debug) {
  print "Support Included\n";
}

/*******************************************************************************
 *
 * Some methods to help the process
 *
 *******************************************************************************/
 
/*******************************************************************************
 *
 * Test if two values are equal as strings
 *
 *******************************************************************************/
function StringEqual($value1, $value2) {
  return strcmp("$value1", "$value2") == 0;
}

/*******************************************************************************
 *
 * Test if a value is equal to null string
 *
 *******************************************************************************/
function StringIsNull($value) {
  return strlen("$value") == 0;
}

/*******************************************************************************
 *
 * Opens a file handle to the specified filename, then writes the contents out,
 * and finally closes the filehandle.
 *
 *******************************************************************************/
function WriteFile($filename, $contents) {
  $file = fopen($filename, "w") or die("Could not open file $filename for writing");
  fwrite($file, $contents) or die("Could not write to file $filename");
  fclose($file);
}

/*******************************************************************************
 *
 * Queries database to see if there is a machine with the same uname as
 * the value passed in
 *
 *******************************************************************************/
function DoesMachineExist($uname, $hardware, $os, $name, $nickname, $gcc_version) {
  $query = "SELECT * FROM machine WHERE uname=\"$uname\" AND hardware=\"$hardware\" AND nickname=\"$nickname\" AND gcc=\"$gcc_version\"";

  $machine_query = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($machine_query);
  mysql_free_result($machine_query);
    
  if ($row) {
    return true;
  }

  return false;
}

/*******************************************************************************
 *
 * mysql> describe machine;
 * +-----------+----------+------+-----+---------+----------------+
 * | Field     | Type     | Null | Key | Default | Extra          |
 * +-----------+----------+------+-----+---------+----------------+
 * | id        | int(11)  |      | PRI | NULL    | auto_increment |
 * | uname     | text     |      |     |         |                |
 * | hardware  | text     |      |     |         |                |
 * | os        | text     |      |     |         |                |
 * | name      | text     |      |     |         |                |
 * | nickname  | tinytext | YES  |     | NULL    |                |
 * | gcc       | text     | YES  |     | NULL    |                |
 * | directory | text     | YES  |     | NULL    |                |
 * +-----------+----------+------+-----+---------+----------------+
 * 8 rows in set (0.00 sec)
 *
 *
 * Creates an entry in the machine table in the database
 *
 *******************************************************************************/
function AddMachine($uname, $hardware, $os, $name, $nickname, $gcc_version, $directory) {
  $query = "INSERT INTO machine (uname, hardware, os, name, nickname, gcc, directory) " .
           "VALUES (\"$uname\",\"$hardware\",\"$os\",\"$name\",\"$nickname\",\"$gcc_version\",\"$directory\")";
  $insert_query = mysql_query($query) or die(mysql_error());
  mysql_free_result($insert_query);
}

/*******************************************************************************
 *
 * Returns the id number of the machine with the passed in uname
 *
 *******************************************************************************/
function GetMachineIdNum($uname, $hardware, $os, $name, $nickname, $gcc_version) {
  $query = "SELECT * FROM machine WHERE uname=\"$uname\" AND hardware=\"$hardware\" AND nickname=\"$nickname\" AND gcc=\"$gcc_version\"";
  $machine_query = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($machine_query);
  mysql_free_result($machine_query);

  if($row) {
    return $row['id'];
  } else {
    return -1;
  }
}

/*******************************************************************************
 *Since this is ugly, iv included an example call and a view of the table.
 *
 * +---------------------+------------+------+-----+---------+----------------+
 * | Field               | Type       | Null | Key | Default | Extra          |
 * +---------------------+------------+------+-----+---------+----------------+
 * | id                  | int(11)    |      | PRI | NULL    | auto_increment |
 * | machine             | text       |      |     |         |                |
 * | added               | datetime   | YES  |     | NULL    |                |
 * | buildstatus         | tinytext   | YES  |     | NULL    |                |
 * | getcvstime_cpu      | double     | YES  |     | NULL    |                |
 * | getcvstime_wall     | double     | YES  |     | NULL    |                |
 * | configuretime_cpu   | double     | YES  |     | NULL    |                |
 * | configuretime_wall  | double     | YES  |     | NULL    |                |
 * | buildtime_cpu       | double     | YES  |     | NULL    |                |
 * | buildtime_wall      | double     | YES  |     | NULL    |                |
 * | dejagnutime_cpu     | double     | YES  |     | NULL    |                |
 * | dejagnutime_wall    | double     | YES  |     | NULL    |                |
 * | warnings            | mediumtext | YES  |     | NULL    |                |
 * | warnings_added      | text       | YES  |     | NULL    |                |
 * | warnings_removed    | text       | YES  |     | NULL    |                |
 * | teststats_exppass   | int(11)    | YES  |     | NULL    |                |
 * | teststats_unexpfail | int(11)    | YES  |     | NULL    |                |
 * | teststats_expfail   | int(11)    | YES  |     | NULL    |                |
 * | all_tests           | text       | YES  |     | NULL    |                |
 * | passing_tests       | text       | YES  |     | NULL    |                |
 * | unexpfail_tests     | text       | YES  |     | NULL    |                |
 * | expfail_tests       | text       | YES  |     | NULL    |                |
 * | newly_passing_tests | text       | YES  |     | NULL    |                |
 * | newly_failing_tests | text       | YES  |     | NULL    |                |
 * | new_tests           | text       | YES  |     | NULL    |                |
 * | removed_tests       | text       | YES  |     | NULL    |                |
 * | cvs_added           | text       | YES  |     | NULL    |                |
 * | cvs_removed         | text       | YES  |     | NULL    |                |
 * | cvs_modified        | text       | YES  |     | NULL    |                |
 * | cvs_usersadd        | text       | YES  |     | NULL    |                |
 * | cvs_usersco         | text       | YES  |     | NULL    |                |
 * | a_file_size         | text       | YES  |     | NULL    |                |
 * | o_file_size         | text       | YES  |     | NULL    |                |
 * +---------------------+------------+------+-----+---------+----------------+
 *
 *
 *******************************************************************************/

function CreateNight($machine_id,
                $added,
                $buildstatus,
                $getcvstime_cpu,
                $getcvstime_wall,
                $configuretime_cpu,
                $configuretime_wall,
                $buildtime_cpu,
                $buildtime_wall,
                $dejagnutime_cpu,
                $dejagnutime_wall,
                $warnings,
                $warnings_added,
                $warnings_removed,
                $teststats_exppass,
                $teststats_unexpfail,
                $teststats_expfail,
                $all_tests,
                $passing_tests,
                $unexpfail_tests,
                $expfail_tests,
                $newly_passing_tests,
                $newly_failing_tests,
                $new_tests,
                $removed_tests,
                $cvs_added,
                $cvs_removed,
                $cvs_modified,
                $cvs_usersadd,
                $cvs_usersco,
                $a_file_size,
                $o_file_size) {
  $query = "INSERT INTO night (".
      "machine, added, buildstatus, configuretime_cpu, configuretime_wall," .
      "getcvstime_cpu, getcvstime_wall, buildtime_cpu, buildtime_wall," .
      "dejagnutime_cpu, dejagnutime_wall, warnings, warnings_added, warnings_removed," .
      "teststats_exppass, teststats_unexpfail, teststats_expfail," .
      "all_tests, passing_tests, unexpfail_tests, expfail_tests," .
      "newly_passing_tests, newly_failing_tests, new_tests, removed_tests," .
      "cvs_added, cvs_removed, cvs_modified, cvs_usersadd, cvs_usersco" .
      ") VALUES (".
      "\"$machine_id\", \"$added\", \"$buildstatus\", \"$configuretime_cpu\", \"$configuretime_wall\"," .
      "\"$getcvstime_cpu\", \"$getcvstime_wall\", \"$buildtime_cpu\", \"$buildtime_wall\"," .
      "\"$dejagnutime_cpu\", \"$dejagnutime_wall\", \"$warnings\", \"$warnings_added\", \"$warnings_removed\"," .
      "\"$teststats_exppass\", \"$teststats_unexpfail\", \"$teststats_expfail\"," .
      "\"$all_tests\", \"$passing_tests\", \"$unexpfail_tests\", \"$expfail_tests\", \"$newly_passing_tests\"," .
      "\"$newly_failing_tests\", \"$new_tests\", \"$removed_tests\", \"$cvs_added\"," .
      "\"$cvs_removed\", \"$cvs_modified\", \"$cvs_usersadd\", \"$cvs_usersco\"" .
      ")";
  $insert_query = mysql_query($query) or die(mysql_error());
  mysql_free_result($insert_query);
  
  $query = "SELECT id FROM night WHERE machine=$machine_id AND added=\"$added\"";
  $machine_query = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($machine_query);
  mysql_free_result($machine_query);
  
  if($row) {
    return $row['id'];
  } else {
    return -1;
  }
}

/*******************************************************************************
 *******************************************************************************/
function GetMachineNights($machine_id) {
  $result = array();
  $query = "SELECT * FROM night WHERE machine = \"$machine_id\"";
  $night_query = mysql_query($query) or die(mysql_error());
  while ($row = mysql_fetch_assoc($night_query)) {
    array_push($result, $row['id']);
  }
  mysql_free_result($night_query);
  return $result;
}

/*******************************************************************************
 *
 * mysql> describe program;
 * +---------+---------+------+-----+---------+-------+
 * | Field   | Type    | Null | Key | Default | Extra |
 * +---------+---------+------+-----+---------+-------+
 * | program | text    |      |     |         |       |
 * | result  | text    | YES  |     | NULL    |       |
 * | type    | text    | YES  |     | NULL    |       |
 * | night   | int(11) |      |     | 0       |       |
 * +---------+---------+------+-----+---------+-------+
 * 4 rows in set (0.00 sec)
 *
 *******************************************************************************/
function AddProgram($program, $result, $type, $night) {
  if (!StringIsNull($program)) {
    $query = "INSERT INTO program (program, result, type, night) VALUES".
             " (\"$program\", \"$result\", \"$type\", $night)";
    $program_query = mysql_query($query) or die(mysql_error());
    mysql_free_result($program_query);
  }
}

/*******************************************************************************
 *
 * mysql> describe tests;
 * +---------+-----------------------------+------+-----+---------+-------+
 * | Field   | Type                        | Null | Key | Default | Extra |
 * +---------+-----------------------------+------+-----+---------+-------+
 * | program | tinytext                    |      |     |         |       |
 * | result  | enum('PASS','FAIL','XFAIL') |      |     | PASS    |       |
 * | measure | tinytext                    | YES  |     | NULL    |       |
 * | night   | int(11)                     | YES  |     | NULL    |       |
 * +---------+-----------------------------+------+-----+---------+-------+
 * 4 rows in set (0.00 sec)
 *
 *******************************************************************************/
function AddTests($program, $result, $measure, $night) {
  if (!StringIsNull($program)) {
    $query = "INSERT INTO tests (program, result, measure, night) VALUES".
             " (\"$program\", \"$result\", \"$measure\", $night)";
    $program_query = mysql_query($query) or die(mysql_error());
    mysql_free_result($program_query);
  }
}


/*******************************************************************************
 *
 * mysql> describe file;
 * +-------+---------+------+-----+---------+-------+
 * | Field | Type    | Null | Key | Default | Extra |
 * +-------+---------+------+-----+---------+-------+
 * | file  | text    |      |     |         |       |
 * | size  | int(11) |      |     | 0       |       |
 * | night | int(11) |      |     | 0       |       |
 * | type  | text    | YES  |     | NULL    |       |
 * +-------+---------+------+-----+---------+-------+
 * 4 rows in set (0.00 sec)
 *
 *******************************************************************************/
function AddFile($file, $size, $night, $type) {
  $query = "INSERT INTO file (file, size, night, type) VALUES".
           " (\"$file\", \"$size\", \"$night\", \"$type\")";
  $file_query = mysql_query($query) or die(mysql_error());
  mysql_free_result($file_query);
}

/*******************************************************************************
 *
 * mysql> describe code;
 * +-------+----------+------+-----+---------------------+-------+
 * | Field | Type     | Null | Key | Default             | Extra |
 * +-------+----------+------+-----+---------------------+-------+
 * | added | datetime |      |     | 0000-00-00 00:00:00 |       |
 * | loc   | int(11)  |      |     | 0                   |       |
 * | files | int(11)  |      |     | 0                   |       |
 * | dirs  | int(11)  |      |     | 0                   |       |
 * +-------+----------+------+-----+---------------------+-------+
 * 4 rows in set (0.00 sec)
 *
 * This function checks to see if the last entered values in the database
 * about code information are the same as our current information. If they
 * differ we will put our information into the database.
 *
 *******************************************************************************/
function UpdateCodeInfo($date, $loc, $files, $dirs) {
  $query = "SELECT * FROM code ORDER BY added DESC";
  $code_query = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($code_query);
  mysql_free_result($code_query);
  if ($row &&
      ($row['loc'] != $loc ||
       $row['files'] != $files ||
       $row['dirs'] != $dirs)) {
    $query = "INSERT INTO code (added, loc, files, dirs) VALUES (\"$date\", \"$loc\", \"$files\", \"$dirs\")";
    $code_query = mysql_query($query) or die(mysql_error());
    mysql_free_result($code_query);
  }
}

/*******************************************************************************
 *
 * Match one substring and return string result.
 *
 *******************************************************************************/
function MatchOnePattern($pattern, $string, $default) {
  $subpatterns = array();
  if (isset($string) && preg_match($pattern, $string, $subpatterns)) {
    return rtrim($subpatterns[1]);
  }
  
  return $default;
}

/*******************************************************************************
 *
 * Match all substrings and return array result.
 *
 *******************************************************************************/
function MatchPattern($pattern, $string) {
  $subpatterns = array();
  if (isset($string) && preg_match($pattern, $string, $subpatterns)) {
    return $subpatterns;
  }
  
  return array();
}

/*******************************************************************************
 *
 * ProcessProgram Test Table Logs
 *
 * The logs are start out like;
 *    Program,GCCAS,Bytecode,LLC compile,LLC-BETA compile,JIT codegen,GCC,CBE,LLC,LLC-BETA,JIT,GCC/CBE,GCC/LLC,GCC/LLC-BETA
 *    Benchmarks/CoyoteBench/almabench,0.0230,11702,0.0278,0.0211,0.0255,  15.26,  14.36,  14.40,   0.01,  16.26,1.06,1.06,-,-
 *    ...
 *
 *******************************************************************************/
function ProcessProgramLogs($tests) {
  $processed = array();
  $headings = $tests[0];
  $headings = preg_replace("/<br>/", " ", $headings);
  $headings = split(",", $headings);
  for ($i = 1; $i < count($tests); $i++) {
    $results = split(",", $tests[$i]);
    $program = $results[0];
    $outcome = "";
    for ($j = 1; $j < count($headings); $j++) {
      $heading = $headings[$j];
      $result = $results[$j];
      $outcome .= "$heading: $result, ";
    }
    $processed[$program] = $outcome;
  }
  return $processed;
}
 
/*******************************************************************************
 *
 * Setting up variables
 *
 *******************************************************************************/
function acceptTest() {
 
  // If no nickname is set, die here
  if (!isset($_POST['nickname'])) {
    return;
  }
 
  $database = "nightlytestresults";
  $loginname = "llvm";
  $password = "ll2002vm";
  
  // connect to database
  $mysql_link = mysql_connect("127.0.0.1", $loginname, $password) or die("Error: could not connect to database!");
  mysql_select_db($database) or die("Error: could not find \"$database\" database!");
  
  if ($print_debug) {
    print "Database connected\n";
  }
  
  
  if ($print_debug) {
    print "Reading _POST Variables\n";
  }

  $spliton ="\n";

  $machine_data = $_POST['machine_data'];
  if (!isset($machine_data)) {
    $machine_data = "";
  }
  $MACHINE_DATA = split($spliton, $machine_data);

  $cvs_log = $_POST['cvs_data'];
  if (!isset($cvs_log)) {
    $cvs_log = "";
  }
  $CVS_LOG = split($spliton, $cvs_log);

  $build_log = $_POST['build_data'];
  if (!isset($build_log)) {
    $build_log = "";
  }
  $BUILD_LOG = split($spliton, $build_log);

  $dejagnutests_results = $_POST['dejagnutests_results'];
  if (!isset($dejagnutests_results)) {
    $dejagnutests_results = "";
  }
  $DEJAGNUTESTS_RESULTS = split($spliton, $dejagnutests_results);

  $dejagnutests_log = $_POST['dejagnutests_log'];
  if (!isset($dejagnutests_log)) {
    $dejagnutests_log = "";
  }
  $DEJAGNUTESTS_LOG = split($spliton, $dejagnutests_log);

  $singlesource_tests = $_POST['singlesource_programstable'];
  if (!isset($singlesource_tests)) {
    $singlesource_tests = "";
  }
  $SINGLESOURCE_TESTS = split($spliton, $singlesource_tests);

  $multisource_tests = $_POST['multisource_programstable'];
  if (!isset($multisource_tests)) {
    $multisource_tests = "";
  }
  $MULTISOURCE_TESTS = split($spliton, $multisource_tests);

  $external_tests = $_POST['externalsource_programstable'];
  if (!isset($external_tests)) {
    $external_tests = "";
  }
  $EXTERNAL_TESTS = split($spliton, $external_tests);

  $o_file_size = $_POST['o_file_sizes']; 
  if (!isset($o_file_size)) {
    $o_file_size = "";
  }
  $o_file_size = rtrim($o_file_size);
  $O_FILE_SIZE = split($spliton, $o_file_size);

  $a_file_size = $_POST['a_file_sizes']; 
  if (!isset($a_file_size)) {
    $a_file_size = "";
  }
  $a_file_size = rtrim($a_file_size);
  $A_FILE_SIZE = split($spliton, $a_file_size);

  $filesincvs = $_POST['cvs_file_count'];
  $dirsincvs = $_POST['cvs_dir_count'];
  $loc = $_POST['lines_of_code'];
  $nickname = $_POST['nickname'];
  $cvscheckouttime_cpu = $_POST['cvscheckouttime_cpu'];
  $cvscheckouttime_wall = $_POST['cvscheckouttime_wall'];
  $configtime_wall = $_POST['configtime_wall'];
  $configtime_cpu = $_POST['configtime_cpu'];
  $buildtime_cpu = $_POST['buildtime_cpu'];
  $buildtime_wall = $_POST['buildtime_wall'];
  $dejagnutime_cpu = $_POST['dejagnutime_cpu'];
  $dejagnutime_wall = $_POST['dejagnutime_wall'];
  $buildwarnings = $_POST['warnings'];
  $cvsaddedfiles = $_POST['cvsaddedfiles'];
  $cvsremovedfiles = $_POST['cvsremovedfiles'];
  $cvsmodifiedfiles = $_POST['cvsmodifiedfiles'];
  $cvsusercommitlist = $_POST['cvsusercommitlist'];
  $cvsuserupdatelist = $_POST['cvsuserupdatelist'];
  $buildstatus = $_POST['buildstatus'];
  $warnings_added = $_POST['warnings_removed'];
  $warnings_removed = $_POST['warnings_added'];
  $all_tests = $_POST['all_tests'];
  $unexpfail_tests = $_POST['unexpfail_tests'];
  $passing_tests = $_POST['passing_tests'];
  $expfail_tests = $_POST['expfail_tests'];
  $newly_passing_tests = $_POST['newly_passing_tests'];
  $newly_failing_tests = $_POST['newly_failing_tests'];
  $new_tests = $_POST['new_tests'];
  $removed_tests = $_POST['removed_tests'];
  $gcc_version = $_POST['gcc_version'];            
  $warnings = $_POST['warnings'];            
  $lines_of_code = $_POST['lines_of_code'];

  if ($print_debug) {
    print "Finished Reading _POST Variables\n";
  }

  /*******************************************************************************
   *
   * Extracting the machine information
   *
   *******************************************************************************/
  $uname    = MatchOnePattern("/uname\:\s*(.+)/",    $MACHINE_DATA[0], "");
  $hardware = MatchOnePattern("/hardware\:\s*(.+)/", $MACHINE_DATA[1], "");
  $os       = MatchOnePattern("/os\:\s*(.+)/",       $MACHINE_DATA[2], "");
  $name     = MatchOnePattern("/name\:\s*(.+)/",     $MACHINE_DATA[3], "");
  $date     = MatchOnePattern("/date\:\s*(.+)/",     $MACHINE_DATA[4], "");
  $time     = MatchOnePattern("/time\:\s*(.+)/",     $MACHINE_DATA[5], "");

  if ($print_debug) {
    print "uname: $uname\n";
    print "hardware: $hardware\n";
    print "os: $os\n";
    print "name: $name\n";
    print "date: $date\n";
    print "time: $time\n";
  }

  /*******************************************************************************
   *
   * Extracting the dejagnu test numbers
   *
   *******************************************************************************/

  $dejagnu_exp_passes     = MatchOnePattern("/\# of expected passes\s*([0-9]+)/",   $dejagnutests_log, 0);
  $dejagnu_unexp_failures = MatchOnePattern("/unexpected failures\s*([0-9]+)/",     $dejagnutests_log, 0);
  $dejagnu_exp_failures   = MatchOnePattern("/\# of expected failures\s*([0-9]+)/", $dejagnutests_log, 0);

  if ($print_debug) {
    print "dejagnu_exp_passes: $dejagnu_exp_passes\n";
    print "dejagnu_unexp_failures: $dejagnu_unexp_failures\n";
    print "dejagnu_exp_failures: $dejagnu_exp_failures\n";
  }

  /*******************************************************************************
   *
   * Processing Program Test Table Logs
   *
   *******************************************************************************/
   
  $singlesource_processed = ProcessProgramLogs($SINGLESOURCE_TESTS);
  $multisource_processed = ProcessProgramLogs($MULTISOURCE_TESTS);
  $external_processed = ProcessProgramLogs($EXTERNAL_TESTS);

  if ($print_debug) {
    $singlesource_processed_count = count($singlesource_processed);
    $multisource_processed_count = count($multisource_processed);
    $external_processed_count = count($external_processed);
    print "singlesource_processed#: $singlesource_processed_count\n";
    print "multisource_processed#: $multisource_processed_count\n";
    print "external_processed#: $external_processed_count\n";
  }

  /*******************************************************************************
   *
   * creating the response
   *
   *******************************************************************************/
  if (!DoesMachineExist($uname, $hardware, $os, $name, $nickname, $gcc_version)) {
    AddMachine($uname, $hardware, $os, $name, $nickname, $gcc_version, "test");
  }
  $machine_id = GetMachineIdNum($uname, $hardware, $os, $name, $nickname, $gcc_version);

  if ($print_debug) {
    print "machine_id: $machine_id\n";
  }

  /*******************************************************************************
   *
   * Submitting information to database
   *
   *******************************************************************************/
  $db_date = date("Y-m-d H:i:s");
  $blank="";
  $night_id= CreateNight($machine_id, $db_date, $buildstatus, 
              $configtime_cpu, $configtime_wall, $cvscheckouttime_cpu,
              $cvscheckouttime_wall, $buildtime_cpu, $buildtime_wall,
              $dejagnutime_cpu, $dejagnutime_wall, $warnings, 
              $warnings_added, $warnings_removed,
              $dejagnu_exp_passes, $dejagnu_unexp_failures, $dejagnu_exp_failures,
              $blank, $blank, $blank,       // $all_tests, $passing_tests, $unexpfail_tests, 
              $blank, $blank, $blank,       // $expfail_tests, $TestsFixed, $TestsBroken,
              $blank, $blank,               // $TestsAdded, $TestsRemoved,
              $cvsaddedfiles, $cvsremovedfiles, $cvsmodifiedfiles,
              $cvsusercommitlist, $cvsuserupdatelist);

  if ($print_debug) {
    print "db_date: $db_date\n";
    print "night_id: $night_id\n";
  }

  foreach ($singlesource_processed as $key => $value) {
     AddProgram($key, $value, "singlesource", $night_id); 
  }

  foreach ($multisource_processed as $key => $value) {
     AddProgram($key, $value, "multisource", $night_id); 
  }

  foreach ($external_processed as $key => $value) {
     AddProgram($key, $value, "external", $night_id); 
  }

  if ($print_debug) {
    print "Programs Added\n";
  }

  foreach ($O_FILE_SIZE as $info) {
    list($ignore, $size, $file, $type) = MatchPattern("/(.+)\s+(.+)\s+(.+)/", $info);
    AddFile($file, $size, $night_id, $type);
  }

  if ($print_debug) {
    $O_FILE_SIZE_COUNT = count($O_FILE_SIZE);
    print "o file sizes#: $O_FILE_SIZE_COUNT\n";
  }

  foreach ($A_FILE_SIZE as $info) {
    list($ignore, $size, $file, $type) = MatchPattern("/(.+)\s+(.+)\s+(.+)/", $info);
    AddFile($file, $size, $night_id, $type);
  }

  if ($print_debug) {
    $A_FILE_SIZE_COUNT = count($A_FILE_SIZE);
    print "a file sizes#: $A_FILE_SIZE_COUNT\n";
  }

  /*******************************************************************************
   *
   * Adding test results pass/fail/xfail status to database
   *
   *******************************************************************************/
  $ALL_TESTS = split("\n", $all_tests);
  foreach ($ALL_TESTS as $info) {
    $subpatterns = array();
    if (preg_match("/(TEST-)?(XPASS|PASS|XFAIL|FAIL):\s(.+?)\s(.+)/", $info, $subpatterns)) {
      list($ignore1, $ignore2, $result, $measure, $program) = $subpatterns;
      AddTests($program, $result, $measure, $night_id);
    }
  }

  if ($print_debug) {
    print "Program Tests Added\n";
  }

  foreach ($DEJAGNUTESTS_RESULTS as $info) {
    $subpatterns = array();
    if (preg_match("/^(XPASS|PASS|XFAIL|FAIL):\s(.+):?/", $info, $subpatterns)) {
      list($ignore, $result, $program) = $subpatterns;
      AddTests($program, $result, "dejagnu", $night_id);
    }
  }

  if ($print_debug) {
    print "Dejagnu Test Results Added\n";
  }

  /*******************************************************************************
   *
   * Adding lines of code to the database
   *
   *******************************************************************************/
  if(StringEqual($buildstatus, "OK")) {
    // only update loc if successful build
    UpdateCodeInfo($db_date, $loc, $filesincvs, $dirsincvs);
  }

  print "received ${_SERVER['CONTENT_LENGTH']} bytes\n";
           
  $nights = GetMachineNights($machine_id);
  $length = count($nights);
  print "DB date : $db_date\n";
  print "Machine $machine_id now has ids [$nights]{$length} ".
        "associated with it in the database\n";

  /*******************************************************************************
   *
   * building hash of arrays of signifigant changes to place into the nightly
   * test results email. This is ugly code and is somewhat of a hack. However, it
   * adds very useful information to the nightly test email.
   *
   *******************************************************************************/
  $query = "SELECT id FROM night WHERE id<$night_id AND machine=$machine_id AND ".
           "buildstatus=\"OK\" ORDER BY id DESC";
  $night_query = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($night_query);
  $prev_night = $row['id'];
  if (!isset($prev_night)) {
    $prev_night = $night_id;
  }
  mysql_free_result($night_query);

  if ($print_debug) {
    print "prev_night: $prev_night\n";
  }

  $query = "SELECT * FROM program WHERE night=$night_id";
  $program_query = mysql_query($query) or die(mysql_error());

  $prog_hash_new = array();
  while ($row = mysql_fetch_assoc($program_query)) {
    $program = $row['type']."/".$row['program'];
    $result = $row['result'];
    $prog_hash_new[$program] = $result;
  }
  mysql_free_result($program_query);

  if ($print_debug) {
    print "Gathered all tonight\'s programs\n";
  }

  $query = "SELECT * FROM program WHERE night=$prev_night";
  $program_query = mysql_query($query) or die(mysql_error());

  $prog_hash_old = array();
  while ($row = mysql_fetch_assoc($program_query)) {
    $program = $row['type']."/".$row['program'];
    $result = $row['result'];
    $prog_hash_old[$program] = $result;
  }
  mysql_free_result($program_query);

  if ($print_debug) {
    print "Gathered all previous night\'s programs\n";
  }

  $monitoring = array("Bytecode", "CBE", "GCCAS", "JIT", "LLC", "LLC-BETA", "LLC compile", "LLC-BETA compile");
  $output_big_changes = array();
  foreach ($prog_hash_new as $prog => $prog_new) {
    $prog_old = $prog_hash_old[$prog];
      
    // get data from server
    $vals_new = split(", ", $prog_new);
    $vals_old = split(", ", $prog_old);
    
    // get list of values measured from newest test
    $new_measures = array();
    foreach ($vals_new as $measure) {
      list($measure, $value) = split(": ", $measure);
      $new_measures[$measure] = $value;
    }
    
    // get list of values measured from older test
    $old_measures = array();
    foreach ($vals_old as $measure) {
      list($measure, $value) = split(": ", $measure);
      $old_measures[$measure] = $value;
    }

    // put measures into hash of arrays
    foreach ($monitoring as $measure) {
      $value_new = MatchOnePattern("/(\d+\.?\d*)/", $new_measures[$measure], "");
      $value_old = MatchOnePattern("/(\d+\.?\d*)/", $old_measures[$measure], "");
      
      if (StringIsNull($value_new) || StringIsNull($value_old)) continue;
      
      $diff = ($value_old - $value_new);
      $perc = 0;
      
      if ($value_old != 0 && ($diff > 0.2 || $diff < -0.2) ) {
        $perc = ($diff / $value_old) * 100;
      }
      
      if ($perc > 5 || $perc < -5) {
        $changes = $output_big_changes[$measure];
        
        if (!isset($changes)) {
          $changes = array();
        }
        
        $rounded_perc = sprintf("%1.2f", $perc);
        array_push($changes, "$prog: $rounded_perc% ($value_old => $value_new)\n");
        $output_big_changes[$measure] = $changes;
      }
    }
  }

  if ($print_debug) {
    print "Determined measures\n";
  }

  /*******************************************************************************
   *
   * Determining changes in new tests and old tests
   *
   *******************************************************************************/
   
  $removed = getRemovedTests($night_id, $prev_night);
  $added = getNewTests($night_id, $prev_night);
  $passing = getFixedTests($night_id, $prev_night);
  $failing = getBrokenTests($night_id, $prev_night);

  if ($print_debug) {
    print "Determined changes in new tests and old tests\n";
  }

  /*******************************************************************************
   *
   * Encode date for file name use
   *
   *******************************************************************************/
   
  $db_date = preg_replace("/ /", "_", $db_date);

  /*******************************************************************************
   *
   * Sending email to nightly test email archive
   *
   *******************************************************************************/
  $link_to_page="http://llvm.org/nightlytest/test.php?machine=$machine_id&".
                "night=$night_id";
  $email  = "$link_to_page\n";
  $email .= "Name: $name\n";
  $email .= "Nickname: $nickname\n";
  $email .= "Buildstatus: $buildstatus\n";

  if(StringEqual($buildstatus, "OK")) {
    if (StringIsNull($passing)) {
      $passing = "None";
    } 
    $email .= "\nNew Test Passes:\n$passing\n";
    if (StringIsNull($failing)) {
      $failing = "None";
    } 
    $email .= "\nNew Test Failures:\n$failing\n";
    if (StringIsNull($added)) {
      $added = "None";
    } 
    $email .= "\nAdded Tests:\n$added\n";
    if (StringIsNull($removed)) {
      $removed= "None";
    } 
    $email .= "\nRemoved Tests:\n$removed\n";

    $email .= "\nSignificant changes in test results:\n";
    foreach ($output_big_changes as $measure => $values) {
      $email.= "$measure:\n";
      foreach ($values as $value) {
        $email.= " $value";
      }
    }
  }
  else{
    $email .= "\nBuildlog available at http://llvm.org/nightlytest/".
              "machines/$db_date-Build-Log.txt\n";
  }

  $email_addr = "llvm-testresults\@cs.uiuc.edu";
  `echo "$email" | mail -s '$nickname $hardware nightly tester results' $email_addr`;

  /*******************************************************************************
   *
   * writing logs to directory
   *
   *******************************************************************************/
  $cwd = getcwd();

  if (!file_exists('machines')) {
    mkdir('machines', 777);
  }
  chdir("$cwd/machines");

  if (!file_exists("$machine_id")) {
    mkdir("$machine_id", 777);
  }
  chdir("$cwd/machines/$machine_id");

  WriteFile("$db_date-Build-Log.txt", $build_log);

  $sentdata="";
  foreach ($_GET as $key => $value) {
    if(strpos($value, "\n") == 0) {
      $sentdata .= "'$key'  =>  \"$value\",\n";
    } else {
      $sentdata .= "'$key'  =>  <<EOD\n$value\nEOD\n,\n";
    }
  }
  foreach ($_POST as $key => $value) {
    if(strpos($value, "\n") == 0) {
      $sentdata .= "'$key'  =>  \"$value\",\n";
    } else {
      $sentdata .= "'$key'  =>  <<EOD\n$value\nEOD\n,\n";
    }
  }
  WriteFile("$db_date-senddata.txt", $sentdata);


  mysql_close($mysql_link);
}

acceptTest();
acceptTestResults();
?>
