<?php

/*******************************************************************************
*
* Debug info
*
*******************************************************************************/
$print_debug = 0;

/*******************************************************************************
* mysql> describe machineInfo;
* +--------------+----------+------+-----+---------+----------------+
* | Field        | Type     | Null | Key | Default | Extra          |
* +--------------+----------+------+-----+---------+----------------+
* | id           | int(11)  |      | PRI | NULL    | auto_increment |
* | targetTriple | tinytext |      |     |         |                |
* | hostname     | tinytext |      |     |         |                |
* | nickname     | tinytext |      |     |         |                |
* +--------------+----------+------+-----+---------+----------------+
* id = unqiue id assigned to machine
* targetTriple = llvm TARGET_TRIPLE value
* hostname = full hostname (ie. zion.llvm.org)
* nickname = short name (ie. zion)
*
* Returns id of machine and adds machine if it is not already in database.
*******************************************************************************/
function getMachineID($targetTriple, $hostname, $nickname) {
  $sqlQuery = "SELECT id from machineInfo WHERE targetTriple=\"$targetTriple\" " 
               . "AND hostname=\"$hostname\" AND nickname=\"$nickname\"";
  $result = mysql_query($sqlQuery) or die(mysql_error());

  $row = mysql_fetch_assoc($result);
  
  if($row) {
    return $row['id']; 
  }
  else {
    $sqlQuery = "INSERT into machineInfo (targetTriple, hostname, nickname) VALUES "
                . "(\"$targetTriple\", \"$hostname\", \"$nickname\")";
    mysql_query($sqlQuery) or die(mysql_error());
    $id =  mysql_insert_id() or die(mysql_error());
    return $id;
  }
}

/*******************************************************************************
* mysql> describe testRunInfo;
* +-------------------+-----------------------------------+------+-----+---------------------+----------------+
* | Field             | Type                              | Null | Key | Default             | Extra          |
* +-------------------+-----------------------------------+------+-----+---------------------+----------------+
* | id                | int(11)                           |      | PRI | NULL                | auto_increment |
* | runDateTime       | datetime                          |      |     | 0000-00-00 00:00:00 |                |
* | machineId         | int(11)                           |      |     | 0                   |                |
* | machineUname      | text                              | YES  |     | NULL                |                |
* | gccVersion        | text                              | YES  |     | NULL                |                |
* | cvsCpuTime        | double                            | YES  |     | NULL                |                |
* | cvsWallTime       | double                            | YES  |     | NULL                |                |
* | configureCpuTime  | double                            | YES  |     | NULL                |                |
* | configureWallTime | double                            | YES  |     | NULL                |                |
* | buildCpuTime      | double                            | YES  |     | NULL                |                |
* | buildWallTime     | double                            | YES  |     | NULL                |                |
* | dejagnuCpuTime    | double                            | YES  |     | NULL                |                |
* | dejagnuWallTime   | double                            | YES  |     | NULL                |                |
* | warnings          | mediumtext                        | YES  |     | NULL                |                |
* | warningsAdded     | text                              | YES  |     | NULL                |                |
* | warningsRemoved   | text                              | YES  |     | NULL                |                |
* | cvsUsersAdd       | text                              | YES  |     | NULL                |                |
* | cvsUsersCO        | text                              | YES  |     | NULL                |                |
* | cvsFilesAdded     | text                              | YES  |     | NULL                |                |
* | cvsFilesRemoved   | text                              | YES  |     | NULL                |                |
* | cvsFilesModified  | text                              | YES  |     | NULL                |                |
* | buildStatus       | tinyint(4)                        | YES  |     | NULL                |                |
* | type              | enum('release','debug','unknown') | YES  |     | unknown             |                |
* +-------------------+-----------------------------------+------+-----+---------------------+----------------+
* Add a test run configuration to the database for logging test results.
*
*******************************************************************************/
function addTestRunConfig($runDateTime, $machineId, $machineUname, $gccVersion,
                         $cvsCpuTime, $cvsWallTime, $configureCpuTime,
                         $configureWallTime,
                         $buildCpuTime, $buildWallTime, $dejagnuCpuTime,
                         $dejagnuWallTime, $warnings, $warningsAdded, 
                         $warningsRemoved, $cvsUsersAdd, $cvsUsersCO, 
                         $cvsFilesAdded, $cvsFilesRemoved, $cvsFilesModified,
                         $buildStatus) {
  
  $sqlQuery = "INSERT into testRunInfo (runDateTime, machineId, machineUname," .
              " gccVersion, cvsCpuTime, cvsWallTime, configureCpuTime," .
              " configureWallTime, buildCpuTime, buildWallTime," .
              " dejagnuCpuTime, dejagnuWallTime, warnings, warningsAdded," .
              " warningsRemoved, cvsUsersAdd, cvsUsersCO, cvsFilesAdded," .
              " cvsFilesRemoved, cvsFilesModified, buildStatus) VALUES (".
              " \"$runDateTime\", \"$machineId\", \"$machineUname\"," .
              " \"$gccVersion\", \"$cvsCpuTime\", \"$cvsWallTime\"," . 
              " \"$configureCpuTime\", \"$configureWallTime\", \"$buildCpuTime\"," .
              " \"$buildWallTime\", \"$dejagnuCpuTime\", \"$dejagnuWallTime\"," .
              " \"$warnings\", \"$warningsAdded\", \"$warningsRemoved\"," .
              " \"$cvsUsersAdd\", \"$cvsUsersCO\", \"$cvsFilesAdded\"," .
              " \"$cvsFilesRemoved\", \"$cvsFilesModified\", \"$buildStatus\")";
  mysql_query($sqlQuery) or die(mysql_error());
  $id = mysql_insert_id() or die(mysql_error());  
  return $id;
}

/*******************************************************************************
*
* mysql> describe dejagnuTests;
* +-------+----------+------+-----+---------+----------------+
* | Field | Type     | Null | Key | Default | Extra          |
* +-------+----------+------+-----+---------+----------------+
* | id    | int(11)  |      | PRI | 0       | auto_increment |
* | name  | tinytext | YES  |     | NULL    |                |
* +-------+----------+------+-----+---------+----------------+
*
* mysql> describe dejagnuTestResults;
* +----------+-------------------------------------+------+-----+---------+----------------+
* | Field    | Type                                | Null | Key | Default | Extra          |
* +----------+-------------------------------------+------+-----+---------+----------------+
* | id       | int(11)                             |      | PRI | NULL    | auto_increment |
* | testId   | int(11)                             | YES  |     | NULL    |                |
* | configId | int(11)                             | YES  |     | NULL    |                |
* | result   | enum('PASS','FAIL','XFAIL','XPASS') | YES  |     | NULL    |                |
* +----------+-------------------------------------+------+-----+---------+----------------+
*
* Add dejagnu test and its status (PASS, XPASS, XFAIL, FAIL).
* Dejagnu tests each have their own unique id to represent them.
*******************************************************************************/
function addDejagnuTestResult($testName, $status, $testRunConfigId) {
  // Strip off path from testName $path/test/($testName)
  
  // Get testID for testName
  $sqlQuery = "SELECT id FROM dejagnuTests WHERE name=\"$testName\"";
  $result = mysql_query($sqlQuery) or die(mysql_error());
  $row = mysql_fetch_assoc($result);
  
  if($row) {
    $id = $row['id']; 
  }
  else {
    $sqlQuery = "INSERT into dejagnuTests (name) VALUES (\"$testName\")";
    mysql_query($sqlQuery) or die(mysql_error());
    $id =  mysql_insert_id() or die(mysql_error());
  }

  // Insert test result
  $query = "INSERT into dejagnuTestResults (testId, configId, result) " .
    "VALUES (\"$id\", \"$testRunConfigId\", \"$status\")";
  mysql_query($query) or die(mysql_error());
  $testResultId = mysql_insert_id() or die(mysql_error());
  return $testResultId;
  
}
/*******************************************************************************
* mysql> describe programs;
* +-------+------------+------+-----+---------+----------------+
* | Field | Type       | Null | Key | Default | Extra          |
* +-------+------------+------+-----+---------+----------------+
* | id    | int(11)    |      | PRI | NULL    | auto_increment |
* | name  | mediumtext | YES  |     | NULL    |                |
* +-------+------------+------+-----+---------+----------------+
*
* mysql> describe programResults;
* +--------------------+---------+------+-----+---------+----------------+
* | Field              | Type    | Null | Key | Default | Extra          |
* +--------------------+---------+------+-----+---------+----------------+
* | id                 | int(11) |      | PRI | NULL    | auto_increment |
* | testId             | int(11) | YES  |     | NULL    |                |
* | nightId            | int(11) | YES  |     | NULL    |                |
* | gccasTime          | double  | YES  |     | NULL    |                |
* | bytecodeSize       | int(11) | YES  |     | NULL    |                |
* | llcTime            | double  | YES  |     | NULL    |                |
* | llcBetaTime        | double  | YES  |     | NULL    |                |
* | jitTime            | double  | YES  |     | NULL    |                |
* | gccExecuteTime     | double  | YES  |     | NULL    |                |
* | cbeExecuteTime     | double  | YES  |     | NULL    |                |
* | llcExecuteTime     | double  | YES  |     | NULL    |                |
* | llcBetaExecuteTime | double  | YES  |     | NULL    |                |
* | jitExecuteTime     | double  | YES  |     | NULL    |                |
* +--------------------+---------+------+-----+---------+----------------+
*
*
*
*******************************************************************************/
function addProgramResult($programLine, $configId, $prefix) {
  if (!$programLine) {
    return;
  }
  
  // Skip headers
  $subpatterns = array();
  if (preg_match("/^Program,(.+)/", $programLine, $subpatterns)) {
    return;
  }

  $results = split(",", $programLine);
  
  // If the output order changes, so must this
  if(count($results) != 15) {
    return;
  }
  
  $program = $results[0];
  $program = $prefix . $program;
  $gccasTime = $results[1];
  $byteCodeSize = $results[2];
  $llcTime = $results[3];
  $llcBetaTime = $results[4];
  $jitTime = $results[5];
  $gccRunTime = $results[6];
  $cbeRunTime = $results[7];
  $llcRunTime = $results[8];
  $llcBetaRunTime = $results[9];
  $jitRunTime = $results[10];
    
  // Get id for program name 
  $sqlQuery = "SELECT id FROM programs WHERE name=\"$program\"";
  $result = mysql_query($sqlQuery) or die(mysql_error());
  $row = mysql_fetch_assoc($result);
  
  if($row) {
    $id = $row['id']; 
  }
  else {
    $sqlQuery = "INSERT into programs (name) VALUES (\"$program\")";
    mysql_query($sqlQuery) or die(mysql_error());
    $id =  mysql_insert_id() or die(mysql_error());
  }
    
  $query = "INSERT INTO programResults (testId, nightId, gccasTime, 
                                        bytecodeSize, llcTime, llcBetaTime, 
                                        jitTime, gccExecuteTime, 
                                        cbeExecuteTime, llcExecuteTime,
                                        llcBetaExecuteTime, jitExecuteTime)" .
    " VALUES (\"$id\", \"$configId\", \"$gccasTime\", \"$byteCodeSize\",
              \"$llcTime\", \"$llcBetaTime\", \"$jitTime\", \"$gccRunTime\",
              \"$cbeRunTime\", \"$llcRunTime\", \"$llcBetaRunTime\",
              \"$jitRunTime\")";
  
  mysql_query($query) or die(mysql_error());
}

/*******************************************************************************
* mysql> describe files;
* +----------+----------+------+-----+---------+----------------+
* | Field    | Type     | Null | Key | Default | Extra          |
* +----------+----------+------+-----+---------+----------------+
* | id       | int(11)  |      | PRI | NULL    | auto_increment |
* | filename | tinytext | YES  |     | NULL    |                |
* +----------+----------+------+-----+---------+----------------+
*
*
* mysql> describe fileSizes;
* +---------+---------+------+-----+---------+----------------+
* | Field   | Type    | Null | Key | Default | Extra          |
* +---------+---------+------+-----+---------+----------------+
* | id      | int(11) |      | PRI | NULL    | auto_increment |
* | fileId  | int(11) | YES  |     | NULL    |                |
* | nightId | int(11) | YES  |     | NULL    |                |
* | size    | int(11) | YES  |     | NULL    |                |
* +---------+---------+------+-----+---------+----------------+
*
* Adds a file and its size to the database.
*******************************************************************************/
function addFileSize($file, $size, $configId) {
  
  // Get file id
  $query = "SELECT id FROM files WHERE filename=\"$file\"";
  $result = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($result);
  
  if($row) {
    $id = $row['id']; 
  }
  else {
    $sqlQuery = "INSERT into files (filename) VALUES (\"$file\")";
    mysql_query($sqlQuery) or die(mysql_error());
    $id =  mysql_insert_id() or die(mysql_error());
  }
  
  $insertQuery = "INSERT INTO fileSizes (fileId, nightId, size) VALUES".
  " (\"$id\", \"$configId\", \"$size\")";
  mysql_query($insertQuery) or die(mysql_error());
}

/*******************************************************************************
*
* mysql> describe llvmStats;
* +-------+----------+------+-----+---------+----------------+
* | Field | Type     | Null | Key | Default | Extra          |
* +-------+----------+------+-----+---------+----------------+
* | id    | int(11)  |      | PRI | NULL    | auto_increment |
* | date  | datetime | YES  |     | NULL    |                |
* | loc   | int(11)  | YES  |     | NULL    |                |
* | files | int(11)  | YES  |     | NULL    |                |
* | dirs  | int(11)  | YES  |     | NULL    |                |
* +-------+----------+------+-----+---------+----------------+
* 5 rows in set (0.00 sec)
*
* Updates the loc, num files, and num dirs for the date. 
*
*******************************************************************************/
function updateLLVMStats($date, $loc, $files, $dirs, $configId) {
    $query = "INSERT INTO llvmStats (date, loc, files, dirs, nightId) VALUES (\"$date\", \"$loc\", \"$files\", \"$dirs\", \"$configId\")";
    mysql_query($query) or die(mysql_error());
}

/*******************************************************************************
*
* Match one substring and return string result.
*
*******************************************************************************/
function matchOne($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 match($pattern, $string) {
  $subpatterns = array();
  if (isset($string) && preg_match($pattern, $string, $subpatterns)) {
    return $subpatterns;
  }
  
  return array();
}


function shutdown($mysql_link) {
 mysql_close($mysql_link); 
}



/*******************************************************************************
*
* Begin processing data
*
*******************************************************************************/

function acceptTestResults() {
  //print "content-type: text/text\n\n";
  
  // Database connection info
  $database = "llvmTestResults";
  $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";
  }
  
  
// Extract the machine information (FIXME: create regex)
$machine_data = $_POST['machine_data'];

if (!isset($_POST['machine_data'])) {
  shutdown($mysql_link);
}

$MACHINE_DATA = split("\n", $machine_data);
$uname    = matchOne("/uname\:\s*(.+)/",    $MACHINE_DATA[0], "");
$hardware = matchOne("/hardware\:\s*(.+)/", $MACHINE_DATA[1], "");
$os       = matchOne("/os\:\s*(.+)/",       $MACHINE_DATA[2], "");
$hostname = matchOne("/name\:\s*(.+)/",     $MACHINE_DATA[3], "");
$date     = matchOne("/date\:\s*(.+)/",     $MACHINE_DATA[4], "");
$time     = matchOne("/time\:\s*(.+)/",     $MACHINE_DATA[5], "");
$nickname = $_POST['nickname'];

$targetTriple = $_POST['target_triple'];

//Get machine id or add new machine
$machineId = getMachineID($targetTriple, $hostname, $nickname);

if(!$machineId) {
  shutdown($mysql_link); 
}

//Extract addition test run information, bail out if missing starttime
if( !isset($_POST['starttime']) ) {
  shutdown($mysql_link);
}
           
$runDateTime = $_POST['starttime'];
$gcc_version = $_POST['gcc_version']; 
$cvsCpuTime = $_POST['cvscheckouttime_cpu'];
$cvsWallTime = $_POST['cvscheckouttime_wall'];
$configureWallTime = $_POST['configtime_wall'];
$configureCpuTime = $_POST['configtime_cpu'];
$buildCpuTime = $_POST['buildtime_cpu'];
$buildWallTime = $_POST['buildtime_wall'];
$dejagnuCpuTime = $_POST['dejagnutime_cpu'];
$dejagnuWallTime = $_POST['dejagnutime_wall'];
$cvsFilesAdded = $_POST['cvsaddedfiles'];
$cvsFilesRemoved = $_POST['cvsremovedfiles'];
$cvsFilesModified = $_POST['cvsmodifiedfiles'];
$cvsUsersAdd = $_POST['cvsusercommitlist'];
$cvsUsersCO = $_POST['cvsuserupdatelist'];
$warnings = $_POST['warnings'];
$warningsAdded = $_POST['warnings_removed'];
$warningsRemoved = $_POST['warnings_added'];
$buildstatus = $_POST['buildstatus'];


// Add new test run config
$testRunConfigId = addTestRunConfig($runDateTime, $machineId, $machineUname, 
                                    $gccVersion, $cvsCpuTime, $cvsWallTime, 
                                    $configureCpuTime, $configureWallTime,
                                    $buildCpuTime, 
                                    $buildWallTime, $dejagnuCpuTime,
                                    $dejagnuWallTime, $warnings, $warningsAdded, 
                                    $warningsRemoved, $cvsUsersAdd, $cvsUsersCO, 
                                    $cvsFilesAdded, $cvsFilesRemoved, $cvsFilesModified,
                                    $buildStatus);


//Print data obtained so far
if ($print_debug) {

  print "Machine ID: $machineId\n";
  print "TargetTriple: $targetTriple\n";
  print "Hostname: $hostname\n";
  print "Nickname: $nickname\n";
 
  print "\n";
  print "Test Run Config ID: $testRunConfigID\n";
  print "Start Time: $runDateTime\n";
  print "Uname: $uname\n";
  print "GCC Version: $gccVersion\n";
  print "Cvs Cpu Time: $cvsCpuTime\n";
  print "Cvs Wall Time: $cvsWallTime\n";
  print "Configure Cpu Time: $configureCpuTime\n";
  print "Configure Wall Time: $configureWallTime\n";
  print "Build Cpu Time: $buildCpuTime\n";
  print "Build Wall Time: $buildWallTime\n";
  print "Dejagnu Cpu Time: $dejagnuCupTime\n";
  print "Dejagnu Wall Time: $dejagnuWallTime\n";
  print "Warnings: $warnings\n";
  print "Warnings Added: $warningsAdded\n";
  print "Warnings Removed: $warningsRemoved\n";
  print "Cvs Files Added: $cvsFilesAdded\n";
  print "Cvs Files Removed: $cvsFilesRemoved\n";
  print "Cvs Files Modified: $cvsFilesModified\n";
  print "Cvs Users Commit: $cvsUsersAdd\n";
  print "Cvs Users Checkout: $cvsUsersCO\n";
  print "Build Status: $buildStatus\n";

}

// Extract dejagnu tests and their results
$dejagnutests_results = $_POST['dejagnutests_results'];
if (!isset($dejagnutests_results)) {
  $dejagnutests_results = "";
}
$DEJAGNUTESTS_RESULTS = split("\n", $dejagnutests_results);

foreach ($DEJAGNUTESTS_RESULTS as $info) {
  $subpatterns = array();
  if (preg_match("/^(XPASS|PASS|XFAIL|FAIL):\s(.[^:]+):?/", $info, $subpatterns)) {
    list($ignore, $result, $program) = $subpatterns;
    if($program) {
      addDejagnuTestResult($program, $result, $testRunConfigId);
      if($print_debug) {
        print "Program: $program\n";
        print "Result: $result\n";
      }
    }
  }
}

// Extract single source, multisource, and external tests into the database
$singlesource_tests = $_POST['singlesource_programstable'];
if (!isset($singlesource_tests)) {
  $singlesource_tests = "";
}
$ss_programs = split("\n", $singlesource_tests);

foreach ($ss_programs as $programLine) {
  addProgramResult($programLine, $testRunConfigId, "SingleSource/"); 
}

$multisource_tests = $_POST['multisource_programstable'];
if (!isset($multisource_tests)) {
  $multisource_tests = "";
}
$ms_programs = split("\n", $multisource_tests);

foreach ($ms_programs as $programLine) {
  addProgramResult($programLine, $testRunConfigId, "MultiSource/"); 
}

$external_tests = $_POST['externalsource_programstable'];
if (!isset($external_tests)) {
  $external_tests = "";
}
$ext_programs = split("\n", $external_tests);

foreach ($ext_programs as $programLine) {
  addProgramResult($programLine, $testRunConfigId, "External/"); 
}

// Extract ofile sizes
$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("\n", $o_file_size);

foreach ($O_FILE_SIZE as $info) {
  list($ignore, $size, $file, $type) = match("/(.+)\s+(.+)\s+(.+)/", $info);
  addFileSize($file, $size, $testRunConfigId, $type);
}

// Extract afile sizes
$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("\n", $a_file_size);

foreach ($A_FILE_SIZE as $info) {
  list($ignore, $size, $file, $type) = match("/(.+)\s+(.+)\s+(.+)/", $info);
  addFileSize($file, $size, $testRunConfigId, $type);
}

// Extract code size
$loc = $_POST['lines_of_code'];
$filesincvs = $_POST['cvs_file_count'];
$dirsincvs = $_POST['cvs_dir_count'];
if(strcmp($buildstatus, "OK") ==  0) {
  
  // only update loc if successful build
  updateLLVMStats($runDateTime, $loc, $filesincvs, $dirsincvs, $testRunConfigId);
}

shutdown($mysql_link);
}

?>
