]> git.mxchange.org Git - hub.git/blobdiff - application/hub/main/database/wrapper/class_PeerStateLookupDatabaseWrapper.php
New Exception added, registering of session ids added:
[hub.git] / application / hub / main / database / wrapper / class_PeerStateLookupDatabaseWrapper.php
index 10c2813b5dc0a829d49e80be64ae6f3cfe47bae0..d1f44cea0b5c0948109f3f78e3a8a00be1127a03 100644 (file)
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper {
+       // Exception constants
+       const EXCEPTION_PEER_ALREADY_REGISTERED = 0x300;
+
        // Constants for database table names
        const DB_TABLE_PEER_LOOKUP = 'peer_states';
 
        // Constants for database column names
        const DB_COLUMN_PEER_IP         = 'peer_ip';
+       const DB_COLUMN_PEER_PORT       = 'peer_port';
+       const DB_COLUMN_PEER_SESSION_ID = 'peer_session_id';
 
        /**
         * Protected constructor
@@ -95,6 +100,66 @@ class PeerStateLookupDatabaseWrapper extends BaseDatabaseWrapper {
                // Return the result
                return $isNewPeer;
        }
+
+       /**
+        * Registers a new peer with given package data. We use the session id from it.
+        *
+        * @param       $packageData            Raw package data
+        * @param       $socketResource         A valid socket resource
+        * @return      void
+        * @throws      PeerAlreadyRegisteredException  If a peer is already registered
+        * @throws      InvalidSocketException  If the socket resource was invalid
+        */
+       public function registerPeerByPackageData (array $packageData, $socketResource) {
+               // Make sure only new peers can be registered with package data
+               if (!$this->isSenderNewPeer($packageData)) {
+                       // Throw an exception because this should normally not happen
+                       throw new PeerAlreadyRegisteredException(array($this, $packageData), self::EXCEPTION_PEER_ALREADY_REGISTERED);
+               } // END - if
+
+               // Generate a dataset instance
+               $dataSetInstance = ObjectFactory::createObjectByConfiguredName('dataset_criteria_class', array(self::DB_TABLE_PEER_LOOKUP));
+
+               // Session ids must be unique
+               $dataSetInstance->setUniqueKey(self::DB_COLUMN_PEER_SESSION_ID);
+
+               // Add session id
+               $dataSetInstance->addCriteria(self::DB_COLUMN_PEER_SESSION_ID, $packageData[NetworkPackage::INDEX_PACKAGE_SENDER]);
+
+               // Get peer name
+               if (!socket_getpeername($socketResource, $peerName, $peerPort)) {
+                       // Get last error
+                       $lastError = socket_last_error($socketResource);
+
+                       // Doesn't work!
+                       throw new InvalidSocketException(array($this, gettype($socketResource), $lastError, socket_strerror($lastError)), BaseListener::EXCEPTION_INVALID_SOCKET);
+               } // END - if
+
+               // Add ip address and port
+               $dataSetInstance->addCriteria(self::DB_COLUMN_PEER_IP  , $peerName);
+               $dataSetInstance->addCriteria(self::DB_COLUMN_PEER_PORT, $peerPort);
+
+               // "Insert" the data set
+               $this->getDatabaseInstance()->queryInsertDataSet($dataSetInstance);
+       }
+
+       /**
+        * Purges old entries of given socket resource. We use the IP address from that resource.
+        *
+        * @param       $socketResource         A valid socket resource
+        * @return      void
+        * @throws      InvalidSocketException  If the socket resource was invalid
+        */
+       public function purgeOldEntriesBySocketResource ($socketResource) {
+               // Get peer name
+               if (!socket_getpeername($socketResource, $peerName, $peerPort)) {
+                       // Get last error
+                       $lastError = socket_last_error($socketResource);
+
+                       // Doesn't work!
+                       throw new InvalidSocketException(array($this, gettype($socketResource), $lastError, socket_strerror($lastError)), BaseListener::EXCEPTION_INVALID_SOCKET);
+               } // END - if
+       }
 }
 
 // [EOF]