true)); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $ex) { print_error("Couldn't open database $db_server -> $ex"); ob_flush(); exit(); } // check if the table exists; otherwise create it. try { $q = $db->query("SELECT dval FROM data_cache LIMIT 1"); $q->fetch(); $q->closeCursor(); } catch (Exception $ex) { $db->exec("CREATE TABLE data_cache (apicall VARCHAR(64), kval CHAR(64), dval INTEGER, value TEXT)"); $db->exec("CREATE INDEX data_key_index ON data_cache(kval)"); } } // this should query for data matching ($ac,$k) function eproxy_db_query($ac, $k) { global $db; global $APICacheTimer; $d = time() - $APICacheTimer[$ac]; $q = $db->query("SELECT dval, value FROM data_cache WHERE apicall = '$ac' AND kval = '$k' AND dval > $d"); $row = $q->fetch(); $res = null; if ($row != false) { $res = $row['value']; } $q->closeCursor(); return $res; } function eproxy_db_insert($ac, $k, $value) { global $db; $db->exec("DELETE FROM data_cache WHERE apicall = '$ac' AND kval = '$k'"); $stmt = $db->prepare("INSERT INTO data_cache (apicall, kval, dval, value) VALUES (?,?,?,?)"); $stmt->bindParam(1, $ac); $stmt->bindParam(2, $k); $stmt->bindParam(3, time()); $stmt->bindParam(4, $value); $stmt->execute(); } } else if ($dbtype == "mysql") { function eproxy_db_connect() { global $db; global $db_server, $db_user, $db_password; global $mysql_db_name; if (!$mysql_db_name) { print_error("mysql_db_name must be specified"); exit(); } $db = mysql_connect($db_server, $db_user, $db_password); if (!$db) { print_error("couldn't connect to mysql database"); exit(); } if (!mysql_select_db($mysql_db_name)) { print_error("couldn't select database"); exit(); } $q = mysql_query("SHOW TABLES LIKE 'data_cache'"); if ($q == false || mysql_num_rows($q) == 0) { mysql_query("CREATE TABLE data_cache (apicall VARCHAR(64), kval CHAR(64), dval INTEGER, value TEXT)"); mysql_query("CREATE INDEX data_key_index ON data_cache(kval)"); } if ($q != false) mysql_free_result($q); } function eproxy_db_query($ac, $k) { $d = time() - $APICacheTimer[$ac]; $q = mysql_query("SELECT dval, value FROM data_cache WHERE apicall = '$ac' AND kval = '$k' AND dval > $d"); $res = null; if ($q != false && mysql_num_rows($q) > 0) { $row = mysql_fetch_assoc($q); $res = $row['value']; } if ($q != false) mysql_free_result($q); return $res; } function eproxy_db_insert($ac, $k, $value) { $d = time(); mysql_query("DELETE FROM data_cache where apicall = '$ac' AND kval = '$k'"); mysql_query("INSERT INTO data_cache (apicall, kval, dval, value) VALUES('$ac', '$k', $d, '" . mysql_real_escape_string($value) . "')"); } } else { print_error("invalid proxy dbtype defined"); exit(); } // print an error in the eve-api error style function print_error($str) { print "\n"; print "\n"; print "2007-12-20 01:45:24\n"; print "eproxy error: $str\n"; print "2007-12-20 01:50:24\n"; print "\n"; } function exception_handler($exception) { print_error("Uncaught exception: " . $exception->getMessage()); exit(); } set_exception_handler('exception_handler'); if (array_key_exists("PATH_INFO", $_SERVER) && $_SERVER['PATH_INFO']) { $pathinfo = $_SERVER['PATH_INFO']; } else { // try to emulate PATH_INFO; courtesy of Shinhan // find the first '/' after the first '.' -- this won't work if, for some reason, the path // to eproxy.php has a directory component with a period in it beforehand. You can // fix that by changing the '.' to the script name, e.g. 'eproxy.php' $start = strpos($_SERVER['REQUEST_URI'],'/',strpos($_SERVER['REQUEST_URI'],'.')); $end = strpos($_SERVER['REQUEST_URI'],'?'); if ($end > 0) { // we've got a GET query string at the end $pathinfo = substr($_SERVER['REQUEST_URI'],$start,$end - $start); } else { $pathinfo = substr($_SERVER['REQUEST_URI'],$start); } } $apicall = preg_replace('/[^A-Za-z0-9\/.-]/', '', $pathinfo); // Which arguments each api call takes $APIArgs = array( "/eve/SkillTree.xml.aspx" => array(), "/eve/RefTypes.xml.aspx" => array(), "/eve/AllianceList.xml.aspx" => array(), "/map/Sovereignty.xml.aspx" => array(), "/account/Characters.xml.aspx" => array("userID", "apiKey"), "/char/CharacterSheet.xml.aspx" => array("userID", "apiKey", "characterID"), "/char/SkillInTraining.xml.aspx" => array("userID", "apiKey", "characterID"), "/char/AssetList.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/eve/ConquerableStationList.xml.aspx" => array("version"), "/eve/ErrorList.xml.aspx" => array("version"), "/eve/RefTypes.xml.aspx" => array("version"), "/eve/CharacterID.xml.aspx" => array("names"), "/map/Jumps.xml.aspx" => array("version"), "/map/Kills.xml.aspx" => array("version"), "/char/AccountBalance.xml.aspx" => array("userID", "apiKey", "characterID"), "/corp/AccountBalance.xml.aspx" => array("userID", "apiKey", "characterID"), "/corp/MemberTracking.xml.aspx" => array("userID", "apiKey", "characterID"), "/corp/AssetList.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/char/IndustryJobs.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/corp/IndustryJobs.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/char/WalletJournal.xml.aspx" => array("userID", "apiKey", "characterID"), "/corp/WalletJournal.xml.aspx" => array("userID", "apiKey", "characterID"), "/char/WalletTransactions.xml.aspx" => array("userID", "apiKey", "characterID"), "/corp/WalletTransactions.xml.aspx" => array("userID", "apiKey", "characterID"), "/char/KillLog.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/corp/KillLog.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/corp/StarbaseDetail.xml.aspx" => array("userID", "apiKey", "characterID", "version", "starbaseID"), "/corp/StarbaseList.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/char/MarketOrders.xml.aspx" => array("userID", "apiKey", "characterID", "version"), "/corp/MarketOrders.xml.aspx" => array("userID", "apiKey", "characterID", "version"), ); $OptionalAPIArgs = array( "/char/KillLog.xml.aspx" => array("beforeKillID"), "/corp/KillLog.xml.aspx" => array("beforeKillID"), "/char/WalletJournal.xml.aspx" => array("beforeRefID"), "/corp/WalletJournal.xml.aspx" => array("beforeRefID"), "/char/WalletTransactions.xml.aspx" => array("beforeTransID"), "/corp/WalletTransactions.xml.aspx" => array("beforeTransID"), ); define("DAYS", 24*60*60); define("HOURS", 60*60); define("MINUTES", 60); // how long to cache the results of each api call $APICacheTimer = array( "/eve/SkillTree.xml.aspx" => 7*DAYS, "/eve/RefTypes.xml.aspx" => 7*DAYS, "/eve/AllianceList.xml.aspx" => 60*MINUTES, "/map/Sovereignty.xml.aspx" => 1*DAYS, "/account/Characters.xml.aspx" => 1*DAYS, "/char/CharacterSheet.xml.aspx" => 1*HOURS, "/char/SkillInTraining.xml.aspx" => 15*MINUTES, "/char/AssetList.xml.aspx" => 1*DAYS, "/eve/ConquerableStationList.xml.aspx" => 1*HOURS, "/eve/ErrorList.xml.aspx" => 7*DAYS, "/eve/RefTypes.xml.aspx" => 7*DAYS, "/eve/CharacterID.xml.aspx" => 1*DAYS, "/map/Jumps.xml.aspx" => 1*HOUR, "/map/Kills.xml.aspx" => 1*HOUR, "/char/AccountBalance.xml.aspx" => 15*MINUTES, "/corp/AccountBalance.xml.aspx" => 15*MINUTES, "/corp/MemberTracking.xml.aspx" => 6*HOURS, "/corp/AssetList.xml.aspx" => 1*DAYS, "/char/IndustryJobs.xml.aspx" => 30*MINUTES, // can be 15 "/corp/IndustryJobs.xml.aspx" => 30*MINUTES, // can be 15 "/char/WalletJournal.xml.aspx" => 1*HOURS, "/corp/WalletJournal.xml.aspx" => 1*HOURS, "/char/WalletTransactions.xml.aspx" => 1*HOURS, "/corp/WalletTransactions.xml.aspx" => 1*HOURS, "/char/KillLog.xml.aspx" => 1*HOURS, "/corp/KillLog.xml.aspx" => 1*HOURS, "/corp/StarbaseDetail.xml.aspx" => 15*MINUTES, "/corp/StarbaseList.xml.aspx" => 15*MINUTES, "/char/MarketOrders.xml.aspx" => 1*HOURS, "/corp/MarketOrders.xml.aspx" => 1*HOURS ); function encryptionKey($api, $params) { global $APIArgs; $i = array_search("apiKey", $APIArgs[$api]); if ($i === NULL || $i === FALSE) return null; return base64_decode($params["apiKey"]); } function extractArgs($api, $params) { global $APIArgs; global $OptionalAPIArgs; $k = array(); foreach ($APIArgs[$api] as $a) { $k[$a] = $params[$a]; } if (array_key_exists($api, $OptionalAPIArgs)) { foreach ($OptionalAPIArgs[$api] as $a) { if (array_key_exists($a, $params)) $k[$a] = $params[$a]; } } return $k; } function decryptData($data, $key) { global $do_crypt; if(!$do_crypt || $key == null || substr_compare($data, "