From 13cccebf943b8a8a7bd34f01a3213bb600dba89b Mon Sep 17 00:00:00 2001 From: Martin Ambrus Date: Mon, 20 Nov 2017 17:55:27 +0100 Subject: [PATCH] refactor: s1_enforcement caching implemented #313 --- GameEngine/Automation.php | 26 ++++++++++---- GameEngine/Database.php | 74 ++++++++++++++++++++++++++++++++++----- 2 files changed, 84 insertions(+), 16 deletions(-) diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php index 6221d6a4..dd357f5a 100755 --- a/GameEngine/Automation.php +++ b/GameEngine/Automation.php @@ -617,7 +617,9 @@ class Automation { foreach($res as $indi) { $vilIDs[$indi['wid']] = true; } - $database->getProfileVillages(array_keys($vilIDs), 5); + $vilIDs = array_keys($vilIDs); + $database->getProfileVillages($vilIDs, 5); + $database->getEnforceVillage($vilIDs, 0); // complete buildings foreach($res as $indi) { @@ -1221,7 +1223,8 @@ class Automation { } $vilIDs = array_keys($vilIDs); $database->getProfileVillages($vilIDs, 5); - $database->getUnit($vilIDs); + $database->$ + $database->getEnforceVillage($vilIDs, 0); // calculate battles foreach($dataarray as $data) { @@ -1306,7 +1309,7 @@ class Automation { $enforDefender = array(); $rom = $ger = $gal = $nat = $natar = 0; $Defender = $database->getUnit($data['to'], false); - $enforcementarray = $database->getEnforceVillage($data['to'], 0, false); + $enforcementarray = $database->getEnforceVillage($data['to'], 0); if(count($enforcementarray) > 0) { foreach($enforcementarray as $enforce) { @@ -1452,7 +1455,7 @@ class Automation { $enforDefender = array(); $rom = $ger = $gal = $nat = $natar = 0; $Defender = $database->getUnit($data['to'], false); - $enforcementarray = $database->getEnforceVillage($data['to'],0, false); + $enforcementarray = $database->getEnforceVillage($data['to'],0); if(count($enforcementarray) > 0) { foreach($enforcementarray as $enforce) { @@ -1643,7 +1646,7 @@ class Automation { } // our reinforcements count could have changed at this point, thus the re-select - $enforcementarray2 = $database->getEnforceVillage($data['to'],0, false); + $enforcementarray2 = $database->getEnforceVillage($data['to'],0); if(count($enforcementarray2) > 0) { foreach($enforcementarray2 as $enforce2) { $Defender['hero'] += $enforce2['hero']; @@ -1770,7 +1773,7 @@ class Automation { //kill other defence in village // ... once again, units could have changed, so we need to reselect - $enforcementarray3 = $database->getEnforceVillage($data['to'],0, false); + $enforcementarray3 = $database->getEnforceVillage($data['to'],0); foreach ($enforcementarray3 as $enforce) { $life=''; $notlife=''; $wrong='0'; if($enforce['from'] != 0){ @@ -3897,7 +3900,7 @@ class Automation { global $database; $ownunit = $database->getUnit($base, $use_cache); - $enforcementarray = $database->getEnforceVillage($base, 0, $use_cache); + $enforcementarray = $database->getEnforceVillage($base, 0); if(count($enforcementarray) > 0) { foreach($enforcementarray as $enforce) { @@ -4268,6 +4271,7 @@ class Automation { $database->getProfileVillages($vilIDs, 5); $database->cacheResourceLevels($vilIDs); $database->getUnit($vilIDs); + $database->getEnforceVillage($vilIDs, 0); // calculate training updates foreach($trainlist as $train){ @@ -4847,6 +4851,14 @@ class Automation { $starvarray = array(); $starvarray = $database->getStarvation(); + + $vilIDs = []; + foreach ($starvarray as $starv){ + $vilIDs[$starv['wref']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getEnforceVillage($vilIDs, 0); + foreach ($starvarray as $starv){ $unitarrays = $this->getAllUnits($starv['wref']); $howweeating=$this->getUpkeep($unitarrays, 0,$starv['wref']); diff --git a/GameEngine/Database.php b/GameEngine/Database.php index ed40535f..d7b5b2dd 100755 --- a/GameEngine/Database.php +++ b/GameEngine/Database.php @@ -6018,6 +6018,10 @@ References: User ID/Message ID, Mode $q = "UPDATE " . TB_PREFIX . "enforcement SET ".implode(', ', $pairs)." WHERE id = $id"; mysqli_query($this->dblink,$q); + + // clear enforce cache + self::$villageReinforcementsCache = []; + self::$reinforcementsCache = []; } function getEnforceArray($id, $mode, $use_cache = true) { @@ -6041,27 +6045,79 @@ References: User ID/Message ID, Mode } function getEnforceVillage($id, $mode, $use_cache = true) { - list($id, $mode) = $this->escape_input((int) $id, $mode); + $array_passed = is_array($id); + $mode = (int) $mode; + + if (!$array_passed) { + $id = [(int) $id]; + } else { + foreach ($id as $index => $idValue) { + $id[$index] = (int) $idValue; + } + } + + if (!count($id)) { + return []; + } // first of all, check if we should be using cache and whether the field // required is already cached - if ($use_cache && ($cachedValue = self::returnCachedContent(self::$villageReinforcementsCache, $id.$mode)) && !is_null($cachedValue)) { + if ($use_cache && !$array_passed && ($cachedValue = self::returnCachedContent(self::$villageReinforcementsCache, $id[0].$mode)) && !is_null($cachedValue)) { return $cachedValue; + } else if ($use_cache && $array_passed) { + // check what we can return from cache + $newIDs = []; + foreach ($id as $key) { + if (!isset(self::$villageReinforcementsCache[$key.$mode])) { + $newIDs [] = $key; + } + } + + // everything's cached, just return the cache + if (!count($newIDs)) { + return self::$villageReinforcementsCache; + } else { + // update remaining IDs to select and cache + $id = $newIDs; + } + } else if ($use_cache && !$array_passed && is_array(self::$villageReinforcementsCache[$id[0].$mode]) && !count(self::$villageReinforcementsCache[$id[0].$mode])) { + // special case when we have empty arrays cached for this cache only + return self::$villageReinforcementsCache[$id[0].$mode]; } if(!$mode) { - $q = "SELECT * from " . TB_PREFIX . "enforcement where vref = $id"; + $q = "SELECT * from " . TB_PREFIX . "enforcement where vref IN(".implode(', ', $id).")"; } else if ($mode == 1) { - $q = "SELECT * from " . TB_PREFIX . "enforcement where `from` = $id"; + $q = "SELECT * from " . TB_PREFIX . "enforcement where `from` IN(".implode(', ', $id).")"; } else if ($mode == 2) { - $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref=$id AND v.owner<>v1.owner"; + $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref IN(".implode(', ', $id).") AND v.owner<>v1.owner"; } else if ($mode == 3) { - $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref=$id AND v.owner=v1.owner"; + $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref IN(".implode(', ', $id).") AND v.owner=v1.owner"; } - $result = mysqli_query($this->dblink,$q); + $result = $this->mysqli_fetch_all(mysqli_query($this->dblink,$q)); - self::$villageReinforcementsCache[$id.$mode] = $this->mysqli_fetch_all($result); - return self::$villageReinforcementsCache[$id.$mode]; + // return a single value + if (!$array_passed) { + self::$villageReinforcementsCache[$id[0].$mode] = $result; + } else { + foreach ( $result as $record ) { + if ( ! isset( self::$villageReinforcementsCache[ $record['vref'] . $mode ] ) ) { + self::$villageReinforcementsCache[ $record['vref'] . $mode ] = []; + } + + self::$villageReinforcementsCache[ $record['vref'] . $mode ][] = $record; + } + + // check for any missing IDs and fill them in with blanks, + // since no reinforcements were found for these villages + foreach ($id as $key) { + if (!isset(self::$villageReinforcementsCache[$key.$mode])) { + self::$villageReinforcementsCache[$key.$mode] = []; + } + } + } + + return ($array_passed ? self::$villageReinforcementsCache : self::$villageReinforcementsCache[$id[0].$mode]); } public static function clearReinforcementsCache() {