include.php

<?php
    
//Add the include directory to our include path
    //This directory isn't accessible from HTTP: it only
    //contains the database access information.
    
ini_set('include_path',ini_get('include_path').':../../include');   

    
//This file (not accessible from HTTP) contains
    //the database username, password and so on.
    
include ("dbaccess.php");

    
//The link to the database
    
$link;

    
//A debug tool: if this flag is set,
    //we print out the queries
    
$echoqueries $_GET["echoqueries"];

    
//Three text matching strings
    //TODO: I think these are all wrong...
    
define ('PATTERN_NUMERIC''[^0-9]');
    
define ('PATTERN_ALPHANUMERIC''[^A-Za-z0-9]');
    
define ('PATTERN_STANDARD_TEXT'"[^A-Za-z0-9 ,.!\'&*()+@?-]");

    function 
refreshVariables()
    {
        
$_SESSION['otheruserid'] = 0;
        
$_SESSION['gameid'] = 0;       
        
$_SESSION['gameusermapid'] = 0;       
        
$_SESSION['othergameusermapid'] = 0;       
    }

    
//This function gets a parameter, checking
    //it matches the pattern given and exiting
    //with an error if not. It requires the database
    //to be open (see openDatabase).
    
function getAndCheckParameter($strParameterName$strPattern$strErrorMessage)
    {
       
$parameter $_GET[$strParameterName];
       
       
$strReturn "";

       if (
ereg($strPattern$parameter)) 
       {
           
exitWithError($strErrorMessage);
       }
       else
       {
          
$strReturn mysql_real_escape_string($parameter);
       }

       return 
$strReturn;
    }

    function 
exitWithError($strErrorMessage)
    {
           
//In the future, we can use the PHP error handling here
           
die("<gwerror>".$strErrorMessage."</gwerror>");
    }

    
//Gets the ID of the other user. We use
    //a local cache for this, to save querying
    //the database every time
    
function getOtherUserId()
    {
       
$sGameId getGameId();

       if (
$_SESSION['otheruserid'] == 0)
       {
           
$sOtherUserQuery "SELECT DISTINCT gameusermap2.userid AS otheruserid FROM gameusermap INNER JOIN gameusermap AS gameusermap2 ON gameusermap.gameid = gameusermap2.gameid AND gameusermap.userid <> gameusermap2.userid AND gameusermap.invitationstatus = 'willing' AND gameusermap2.invitationstatus = 'willing' AND gameusermap.gameid = ".$sGameId." AND gameusermap.userid = ".$_SESSION['userid'];

           
$row queryDatabaseForSingleRow($sOtherUserQuery);

           
$_SESSION['otheruserid'] = $row["otheruserid"];
       }

       return 
$_SESSION['otheruserid'];
    }

    
//Gets the game id. Similarly, we use a cache for this.
    
function getGameId()
    {
       if (
$_SESSION['gameid'] == 0)
       {
           
$sGameQuery "SELECT DISTINCT gameusermap2.gameid, game.timelastactive FROM (gameusermap INNER JOIN gameusermap AS gameusermap2 ON gameusermap.gameid = gameusermap2.gameid AND gameusermap.userid <> gameusermap2.userid AND gameusermap.invitationstatus = 'willing' AND gameusermap2.invitationstatus = 'willing' AND gameusermap.userid =".$_SESSION['userid'].") INNER JOIN game ON gameusermap2.gameid = game.gameid ORDER BY timelastactive DESC";

           
$row queryDatabaseForSingleRow($sGameQuery);

           
$_SESSION['gameid'] = $row["gameid"];
       }

       return 
$_SESSION['gameid'];
    }

    
//TODO: There's no need for this to be a session variable
    
$_SESSION['gameusermapid'] = 0;
    
    function 
getGameUserMapId()
    {
       if (
$_SESSION['gameusermapid'] == 0)
       {
           
$sGameQuery "SELECT DISTINCT gameusermapid FROM gameusermap WHERE userid = ".$_SESSION['userid']." AND gameid = ".getGameId();

           
$row queryDatabaseForSingleRow($sGameQuery);

           
$_SESSION['gameusermapid']= $row["gameusermapid"];
       }

       return 
$_SESSION['gameusermapid'];
    }

    
//TODO: There's no need for this to be a session variable
    
$_SESSION['othergameusermapid'] = 0;
    
    function 
getOtherGameUserMapId()
    {
       if (
$_SESSION['othergameusermapid'] == 0)
       {
           
$sGameQuery "SELECT DISTINCT gameusermapid FROM gameusermap WHERE userid = ".getOtherUserId()." AND gameid = ".getGameId();

           
$row queryDatabaseForSingleRow($sGameQuery);

           
$_SESSION['othergameusermapid']= $row["gameusermapid"];
       }

       return 
$_SESSION['othergameusermapid'];
    }

    function 
queryDatabase($query$callback)
    {
       global 
$echoqueries;

       if (
$echoqueries == "1")
       {
           echo 
$query;
       }

          if(
$oResult mysql_query($query) and mysql_num_rows($oResult) > 0
          {
              while (
$row mysql_fetch_array($oResultMYSQL_ASSOC)) 
             {
                 
$callback($row);
             }
      }

          if (!
$oResult)
          {
              
exitWithError("There has been an error in the database (queryDatabase; ".$query."; ".mysql_error().";)");
          }
    }

    function 
queryDatabaseForSingleRow($query)
    {
       global 
$echoqueries;

       if (
$echoqueries == "1")
       {
           echo 
$query;
       }

          if(
$oResult mysql_query($query) and mysql_num_rows($oResult) > 0
          {
             
$row mysql_fetch_array($oResultMYSQL_ASSOC);

             return 
$row;
      }

          if (!
$oResult)
          {
              
exitWithError("There has been an error in the database (queryDatabaseForSingleRow; ".$query."; ".mysql_error().";)");
          }
          
    }

    function 
openDatabase()
    {
      global 
$link;
      
$sInfo "";

      global 
$sDBServer;
      global 
$sDBPassword;
      global 
$sDBName;
      global 
$sDBUsername;

      
//make the database connection
      
$link mysql_connect($sDBServer$sDBUsername$sDBPassword);
      @
mysql_select_db($sDBName) or $sInfo "Unable to open database";
    }


    function 
closeDatabase()
    {
       global 
$link;

       
mysql_close($link);
    }

    
//A function to perform queries that don't
    //return a result (such as UPDATE and INSERT).
    //This function returns the ID of any row that was inserted.
    //If the caller is interested in this ID, they should
    //check the return value; if not, they don't have to.
    
function updateDatabase($query)
    {
      global 
$link;
       global 
$echoqueries;

       if (
$echoqueries == "1")
       {
           echo 
$query;
       }

//TODO: Clean up
//       openDatabase();

       
$oResult mysql_query($query);

          if (!
$oResult)
          {
              
exitWithError("There has been an error in the database (updateDatabase; ".$query."; ".mysql_error().";)");
          }

       
$autoId mysql_insert_id();

  
//     mysql_close($link);

       
return $autoId;
    }

    
//This function takes a row returned from a database query.
    //and outputs it as XML. For example, a row with a single value
    //(field "name", value "Graham") will be outputted as
    //<name>Graham</name>
    
function outputRowAsXML($rowOutput)
    {
        
$iArrayLength sizeof($rowOutput);

        
$arrayValues array_values($rowOutput);
        
$arrayKeys array_keys($rowOutput);

        for (
$i 0$i $iArrayLength$i++)
        { 
           
outputXMLTag($arrayKeys[$i], $arrayValues[$i]);
        }
     }

//The status (active or passive) alternates
//between the players: a player will be
//active one turn and passive the next; and,
//if a player is passive on the first turn
//of a date, he will be active on the first
//turn of the second date. This function calculates
//and outputs the status
function outputStatus($turn$dateno)
{
    
$boolStatus = (($turn 2) == ($dateno 2));

    if (
$_SESSION['userid'] < getOtherUserId())
    {
         
$boolStatus = !$boolStatus;    
    }

    
$strStatus $boolStatus "active" "passive";

    
outputXMLTag("status"$strStatus);
}

//This function queries the database
//for the Traits and outputs them as XML
function outputTraits()
{
    echo 
"<mytraits>";

    
$sMyTraitQuery "SELECT name AS mytrait FROM trait WHERE gameusermapid = ".getGameUserMapId();

    
queryDatabase($sMyTraitQueryoutputMyTrait);

    echo 
"</mytraits>";
    echo 
"<theirtraits>";

    
$sTheirTraitQuery "SELECT name AS theirtrait FROM trait WHERE gameusermapid = ".getOtherGameUserMapId();

    
queryDatabase($sTheirTraitQueryoutputTheirTrait);

    echo 
"</theirtraits>";
}

//This function queries the database
//for the two Conflicts and outputs them as XML.
function outputConflicts()
{
    
$sMyConflictQuery "SELECT gameusermapid, conflict, conflictdicetoaward, invocationstatus FROM game INNER JOIN gameusermap ON game.gameid = gameusermap.gameid WHERE game.gameid = ".getGameId()." AND gameusermap.userid = ".$_SESSION['userid'];

    
queryDatabase($sMyConflictQueryoutputMyConflict);

    
$sTheirConflictQuery "SELECT gameusermapid, conflict, conflictdicetoaward, invocationstatus FROM game INNER JOIN gameusermap ON game.gameid = gameusermap.gameid WHERE game.gameid = ".getGameId()." AND gameusermap.userid = ".$_SESSION['otheruserid'];

    
queryDatabase($sTheirConflictQueryoutputTheirConflict);
}

//TODO: Change to outputCharacterNames
//This function queries the database for
//the two character names and outputs them as XML.
function outputCharacterNames()
{
    
$_SESSION['otheruserid'] = getOtherUserId();

    
$sMyNameQuery "SELECT charactername AS myname FROM game INNER JOIN gameusermap ON game.gameid = gameusermap.gameid WHERE game.gameid = ".getGameId()." AND gameusermap.userid = ".$_SESSION['userid'];

    
queryDatabase($sMyNameQueryoutputMyCharacterName);

    
$sTheirNameQuery "SELECT charactername AS theirname FROM game INNER JOIN gameusermap ON game.gameid = gameusermap.gameid WHERE game.gameid = ".getGameId()." AND gameusermap.userid = ".$_SESSION['otheruserid'];

    
queryDatabase($sTheirNameQueryoutputTheirCharacterName);
}

//And this function queries the database
//for compatibilities and outputs them as XML.
function outputCompatibilities()
{
    echo 
"<compatibilities>";

    
$_SESSION['gameid'] = getGameId();

    
$sCompatibilityQuery "SELECT compatibilityid, name, compatibilitydicetoaward, invocationstatus FROM compatibility WHERE gameid = ".$_SESSION['gameid'];

    
queryDatabase($sCompatibilityQueryoutputCompatibility);

    echo 
"</compatibilities>";
}

    
//This is a callback function to output
    //a compatibility
    
function outputCompatibility($rowCompatibility)
    {
         echo 
"<compatibility>";
         
outputRowAsXML($rowCompatibility);
         echo 
"</compatibility>";
    }

    
//A callback function to output a trait
    
function outputMyTrait($rowTrait)
    {
         
outputRowAsXML($rowTrait);
    }

    
//A callback function to output
    //traits belonging to the other user
    
function outputTheirTrait($rowTrait)
    {
         
outputRowAsXML($rowTrait);
    }

    
//A callback function to output conflicts
    
function outputMyConflict($rowConflict)
    {
         echo 
"<myconflict>";
         
outputRowAsXML($rowConflict);
         echo 
"</myconflict>";
    }

    
//A callback function to output conflicts belonging
    //to the other user
    
function outputTheirConflict($rowConflict)
    {
         echo 
"<theirconflict>";
         
outputRowAsXML($rowConflict);
         echo 
"</theirconflict>";
    }

    
//A callback function to output the character's name
    
function outputMyCharacterName($row)
    {
         
outputRowAsXML($row);
    }

    
//A callback function to output
    //the name of the other character
    
function outputTheirCharacterName($row)
    {
         
outputRowAsXML($row);
    }

//A simple function to output an XML tag
function outputXMLTag($tagname$contents)
{
   echo 
"<".$tagname.">".stripslashes($contents)."</".$tagname.">";
}

//This function deletes all the games the user has played and all
//the gameusermaps, traits, compatibilities and webitems
//associated with that game
function deleteGame($userDeleteDetails)
{
        
updateDatabase("DELETE webitem, compatibility, trait, trait2, gameusermap, gameusermap2, game FROM webitem RIGHT JOIN (compatibility RIGHT JOIN (trait AS trait2 RIGHT JOIN (trait RIGHT JOIN (gameusermap AS gameusermap2 RIGHT JOIN (gameusermap INNER JOIN game ON gameusermap.gameid = game.gameid) ON game.gameid = gameusermap2.gameid) ON gameusermap.gameusermapid = trait.gameusermapid) ON gameusermap2.gameusermapid = trait2.gameusermapid) ON compatibility.gameid = game.gameid) ON webitem.gameid = game.gameid WHERE gameusermap.userid = ".$userDeleteDetails);
}

?>