X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=application%2Fhub%2Fmain%2Fdatabase%2Fwrapper%2Fstates%2Fclass_PeerStateLookupDatabaseWrapper.php;h=a3b08c65466e080a65d8257d9077bbe5386c9cb5;hb=c238ada1ea0d4f8bc8f5be9c5fb01bf7b3412b9f;hp=330a3b3cb769199c741ec9545861d935ec92a837;hpb=078f65e6590b6e152e466d655152b5c1ca3ee194;p=hub.git diff --git a/application/hub/main/database/wrapper/states/class_PeerStateLookupDatabaseWrapper.php b/application/hub/main/database/wrapper/states/class_PeerStateLookupDatabaseWrapper.php index 330a3b3cb..a3b08c654 100644 --- a/application/hub/main/database/wrapper/states/class_PeerStateLookupDatabaseWrapper.php +++ b/application/hub/main/database/wrapper/states/class_PeerStateLookupDatabaseWrapper.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Hub Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Hub Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -63,39 +63,43 @@ class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper implements Look } /** - * Getter for index key + * "Getter" for a LocalSearchCriteria from given package data's sender * - * @return $indexKey Index key + * @param $packageData Valid raw package data array + * @return $searchInstance An instance of a LocalSearchCriteria class */ - public final function getIndexKey () { - return $this->getDatabaseInstance()->getIndexKey(); + private function getSenderSearchInstanceFromPackageData (array $packageData) { + // Get the instance + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: Searching for sender ' . $packageData[NetworkPackage::PACKAGE_DATA_SENDER]); + $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); + + // Add 'sender' as the peer's IP address + $searchInstance->addCriteria(self::DB_COLUMN_PEER_SESSION_ID, $packageData[NetworkPackage::PACKAGE_DATA_SENDER]); + $searchInstance->setLimit(1); + + // Return the instance + return $searchInstance; } /** - * Checks wether given 'sender' is a new peer + * Checks whether given 'sender' is a new peer * * @param $packageData Raw package data * @param $dataSetInstance An optional instance of a StoreableCriteria class - * @return $isNewPeer Wether 'sender' is a new peer to this peer + * @return $isNewPeer Whether 'sender' is a new peer to this peer */ public function isSenderNewPeer (array $packageData, StoreableCriteria $dataSetInstance = NULL) { - //* DEBUG: */ $this->debugOutput('DATABASE-WRAPPER: ' . __FUNCTION__ . ' called with packageData()=' . count($packageData) . ' - ENTERED!'); - // Is always new peer by default - $isNewPeer = true; + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: ' . __FUNCTION__ . ' called with packageData()=' . count($packageData) . ' - ENTERED!'); // Is the package valid? if (!isset($packageData[NetworkPackage::PACKAGE_DATA_SENDER])) { // Invalid package found, please report this - die(__METHOD__ . ': packageData=' . print_r($packageData, true)); + $this->debugBackTrace('[' . __METHOD__ . ':' . __LINE__ . ']: packageData=' . print_r($packageData, TRUE)); } // END - if - // Get a search criteria instance - //* DEBUG: */ $this->debugOutput('DATABASE-WRAPPER: Searching for sender ' . $packageData[NetworkPackage::PACKAGE_DATA_SENDER]); - $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); - - // Add 'sender' as the peer's IP address - $searchInstance->addCriteria(self::DB_COLUMN_PEER_SESSION_ID, $packageData[NetworkPackage::PACKAGE_DATA_SENDER]); - $searchInstance->setLimit(1); + // Get a search criteria instance from package data + $searchInstance = $this->getSenderSearchInstanceFromPackageData($packageData); // Is the dataset instance set? if ($dataSetInstance instanceof StoreableCriteria) { @@ -104,14 +108,14 @@ class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper implements Look } // END - if // Count the query - $entries = $this->doSelectCountByCriteria($searchInstance, array(self::DB_COLUMN_PEER_SESSION_ID => true)); + $entries = $this->doSelectCountByCriteria($searchInstance, array(self::DB_COLUMN_PEER_SESSION_ID => TRUE)); // Is it there? - //* DEBUG: */ $this->debugOutput('DATABASE-WRAPPER: entries=' . $entries); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: entries=' . $entries); $isNewPeer = ($entries != 1); // Return the result - //* DEBUG: */ $this->debugOutput('DATABASE-WRAPPER: isNewPeer=' . intval($isNewPeer) . ' - EXIT!'); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: isNewPeer=' . intval($isNewPeer) . ' - EXIT!'); return $isNewPeer; } @@ -154,10 +158,10 @@ class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper implements Look $dataSetInstance->addCriteria(self::DB_COLUMN_PEER_PORT, $peerPort); // "Insert" the data set - $this->queryInsertDataSet($dataSetInstance, array(self::DB_COLUMN_PEER_SESSION_ID => true)); + $this->queryInsertDataSet($dataSetInstance, array(self::DB_COLUMN_PEER_SESSION_ID => TRUE)); // Debug message - /* DEBUG: */ $this->debugOutput('DATABASE-WRAPPER: Peer ' . $packageData[NetworkPackage::PACKAGE_DATA_SENDER] . ' has been registered.'); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: Peer ' . $packageData[NetworkPackage::PACKAGE_DATA_SENDER] . ' has been registered.'); } /** @@ -178,7 +182,7 @@ class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper implements Look // Add session id $dataSetInstance->addCriteria(self::DB_COLUMN_PEER_SESSION_ID, $packageData[NetworkPackage::PACKAGE_DATA_SENDER]); - $dataSetInstance->addCriteria(self::DB_COLUMN_PEER_STATE, $stateInstance->getStateName()); + $dataSetInstance->addCriteria(self::DB_COLUMN_PEER_STATE , $stateInstance->getStateName()); // Try to resolve sender's session id $senderData = explode(':', HubTools::resolveSessionId($packageData[NetworkPackage::PACKAGE_DATA_SENDER])); @@ -193,14 +197,14 @@ class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper implements Look // Is this a new peer? if ($this->isSenderNewPeer($packageData, $dataSetInstance)) { // "Insert" the data set - $this->queryInsertDataSet($dataSetInstance, array(self::DB_COLUMN_PEER_SESSION_ID => true)); + $this->queryInsertDataSet($dataSetInstance, array(self::DB_COLUMN_PEER_SESSION_ID => TRUE)); } else { // Update the data set - $this->queryUpdateDataSet($dataSetInstance, array(self::DB_COLUMN_PEER_SESSION_ID => true)); + $this->queryUpdateDataSet($dataSetInstance, array(self::DB_COLUMN_PEER_SESSION_ID => TRUE)); } // Debug message - /* DEBUG: */ $this->debugOutput('DATABASE-WRAPPER: Peer ' . $packageData[NetworkPackage::PACKAGE_DATA_SENDER] . ' has been registered with state ' . $stateInstance->getStateName()); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: Peer ' . $packageData[NetworkPackage::PACKAGE_DATA_SENDER] . ' has been registered/updated with state ' . $stateInstance->getStateName()); } /** @@ -218,10 +222,45 @@ class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper implements Look $lastError = socket_last_error($socketResource); // Doesn't work! - throw new InvalidSocketException(array($this, gettype($socketResource), $lastError, socket_strerror($lastError)), BaseListener::EXCEPTION_INVALID_SOCKET); + throw new InvalidSocketException(array($this, $socketResource, $lastError, socket_strerror($lastError)), BaseListener::EXCEPTION_INVALID_SOCKET); } // END - if - $this->debugBackTrace('peerName=' . $peerName . ',peerPort=' . $peerPort . ' - UNFINISHED!'); + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: peerName=' . $peerName . ',peerPort=' . $peerPort . ' - UNFINISHED!'); + } + + /** + * Checks whether a given peer state (in helper instance) is same as stored + * in database compared with the one from $helperInstance. + * + * @param $helperInstance An instance of a ConnectionHelper class + * @param $packageData Valid package data array + * @return $isSamePeerState Whether the peer's state is the same + */ + public function isSamePeerState (ConnectionHelper $helperInstance, array $packageData) { + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: State ' . $helperInstance->getPrintableState() . ' needs to be checked it has changed ...'); + + // Now get the search instance from given package data + $searchInstance = $this->getSenderSearchInstanceFromPackageData($packageData); + + // With this search instance query the database for the peer and get a result instance + $resultInstance = $this->doSelectByCriteria($searchInstance); + + // Do we have an entry? This should always the case + assert($resultInstance->next()); + + // Yes, so get the current (=first) entry from it + $rowData = $resultInstance->current(); + + // Now just compare it with given state from helper instance + $isSamePeerState = ($rowData[self::DB_COLUMN_PEER_STATE] == $helperInstance->getPrintableState()); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE-WRAPPER: state in database: ' . $rowData[self::DB_COLUMN_PEER_STATE] . ', new state: ' . $helperInstance->getPrintableState() . ',isSamePeerState=' . intval($isSamePeerState)); + + // Return it + return $isSamePeerState; } }