]> git.mxchange.org Git - hub.git/blobdiff - application/hub/main/database/wrapper/node/class_NodeDistributedHashTableDatabaseWrapper.php
Renamed method:
[hub.git] / application / hub / main / database / wrapper / node / class_NodeDistributedHashTableDatabaseWrapper.php
index 67fd53b26c7a7e949f067552167f538417056502..45208a22e952bd3a9b7563b8d75b898be64a614e 100644 (file)
@@ -28,7 +28,8 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
        // Constants for database column names
        const DB_COLUMN_NODE_ID          = 'node_id';
        const DB_COLUMN_SESSION_ID       = 'session_id';
-       const DB_COLUMN_IP_PORT          = 'ip_port';
+       const DB_COLUMN_EXTERNAL_IP      = 'external_ip';
+       const DB_COLUMN_LISTEN_PORT      = 'listen_port';
        const DB_COLUMN_PRIVATE_KEY      = 'private_key';
        const DB_COLUMN_PRIVATE_KEY_HASH = 'private_key_hash';
        const DB_COLUMN_NODE_TYPE        = 'node_type';
@@ -60,12 +61,13 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
        }
 
        /**
-        * Prepares an instance of a StoreableCriteria class with all node data for
-        * insert/update queries.
+        * Prepares a "local" instance of a StoreableCriteria class with all node
+        * data for insert/update queries. This data set contains data from *this*
+        * (local) node.
         *
         * @return      $dataSetInstance        An instance of a StoreableCriteria class
         */
-       private function prepareDataSetInstance () {
+       private function prepareLocalDataSetInstance () {
                // Get node/request instances
                $nodeInstance = Registry::getRegistry()->getInstance('node');
                $requestInstance = ApplicationHelper::getSelfInstance()->getRequestInstance();
@@ -76,9 +78,16 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
                // Set the primary key
                $dataSetInstance->setUniqueKey(self::DB_COLUMN_NODE_ID);
 
+               // Get ip:port combination and "explode" it
+               $ipPort = $nodeInstance->getAddressPortArray();
+
+               // Make sure both is valid
+               assert(($ipPort[0] !== 'invalid') && ($ipPort[1] !== 'invalid'));
+
                // Add public node data
                $dataSetInstance->addCriteria(self::DB_COLUMN_NODE_TYPE       , $requestInstance->getRequestElement('mode'));
-               $dataSetInstance->addCriteria(self::DB_COLUMN_IP_PORT         , $nodeInstance->getAddressPort());
+               $dataSetInstance->addCriteria(self::DB_COLUMN_EXTERNAL_IP     , $ipPort[0]);
+               $dataSetInstance->addCriteria(self::DB_COLUMN_LISTEN_PORT     , $ipPort[1]);
                $dataSetInstance->addCriteria(self::DB_COLUMN_NODE_ID         , $nodeInstance->getNodeId());
                $dataSetInstance->addCriteria(self::DB_COLUMN_SESSION_ID      , $nodeInstance->getSessionId());
                $dataSetInstance->addCriteria(self::DB_COLUMN_PRIVATE_KEY_HASH, $nodeInstance->getPrivateKeyHash());
@@ -102,8 +111,15 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
                        // Get node instance
                        $nodeInstance = Registry::getRegistry()->getInstance('node');
 
+                       // Get ip:port combination and "explode" it
+                       $ipPort = $nodeInstance->getAddressPortArray();
+
+                       // Make sure both is valid
+                       assert(($ipPort[0] !== 'invalid') && ($ipPort[1] !== 'invalid'));
+
                        // Add ip:port as criteria
-                       $searchInstance->addCriteria(self::DB_COLUMN_IP_PORT, $nodeInstance->getAddressPort());
+                       $searchInstance->addCriteria(self::DB_COLUMN_EXTERNAL_IP, $ipPort[0]);
+                       $searchInstance->addCriteria(self::DB_COLUMN_LISTEN_PORT, $ipPort[1]);
                        $searchInstance->setLimit(1);
 
                        // Query database and get a result instance back
@@ -127,7 +143,7 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
                assert(!$this->isLocalNodeRegistered());
 
                // Get prepared data set instance
-               $dataSetInstance = $this->prepareDataSetInstance();
+               $dataSetInstance = $this->prepareLocalDataSetInstance();
 
                // "Insert" this dataset instance completely into the database
                $this->queryInsertDataSet($dataSetInstance);
@@ -154,7 +170,7 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
                $searchInstance->setLimit(1);
 
                // Get a prepared dataset instance
-               $dataSetInstance = $this->prepareDataSetInstance();
+               $dataSetInstance = $this->prepareLocalDataSetInstance();
 
                // Set search instance
                $dataSetInstance->setSearchInstance($searchInstance);
@@ -162,6 +178,73 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
                // Update DHT database record
                $this->queryUpdateDataSet($dataSetInstance);
        }
+
+       /**
+        * Finds a node locally by given session id
+        *
+        * @param       $sessionId      Session id to lookup
+        * @return      $nodeData       Node data array
+        */
+       public function findNodeLocalBySessionId ($sessionId) {
+               // Get search criteria
+               $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
+
+               // Search for session id and limit it to one entry
+               $searchInstance->addCriteria(self::DB_COLUMN_SESSION_ID, $sessionId);
+               $searchInstance->setLimit(1);
+
+               // Query database and get a result instance back
+               $resultInstance = $this->doSelectByCriteria($searchInstance);
+
+               // Return result instance
+               return $resultInstance;
+       }
+
+       /**
+        * Registeres a node by given message data.
+        *
+        * @param       $messageData            An array of all message data
+        * @param       $handlerInstance        An instance of a HandleableMessage class
+        * @return      void
+        */
+       public function registerNodeByMessageData (array $messageData, Handleable $handlerInstance) {
+               // Get a data set instance
+               $dataSetInstance = ObjectFactory::createObjectByConfiguredName('dataset_criteria_class', array(self::DB_TABLE_NODE_DHT));
+
+               // Set primary key (session id)
+               $dataSetInstance->setUniqueKey(self::DB_COLUMN_SESSION_ID);
+
+               // Add all array elements
+               $handlerInstance->addArrayToDataSet($dataSetInstance, $messageData);
+
+               // Run the "INSERT" query
+               $this->queryInsertDataSet($dataSetInstance);
+       }
+
+       /**
+        * Updates an existing entry in node list
+        *
+        * @param       $messageData            An array of all message data
+        * @param       $handlerInstance        An instance of a HandleableMessage class
+        * @param       $searchInstance         An instance of LocalSearchCriteria class
+        * @return      void
+        */
+       public function updateNodeByMessageData (array $messageData, Handleable $handlerInstance, LocalSearchCriteria $searchInstance) {
+               // Get a data set instance
+               $dataSetInstance = ObjectFactory::createObjectByConfiguredName('dataset_criteria_class', array(self::DB_TABLE_NODE_DHT));
+
+               // Add search instance
+               $dataSetInstance->setSearchInstance($searchInstance);
+
+               // Set primary key (session id)
+               $dataSetInstance->setUniqueKey(self::DB_COLUMN_SESSION_ID);
+
+               // Add all array elements
+               $handlerInstance->addArrayToDataSet($dataSetInstance, $messageData);
+
+               // Run the "UPDATE" query
+               $this->queryUpdateDataSet($dataSetInstance);
+       }
 }
 
 // [EOF]