X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=application%2Fhub%2Fmain%2Fdatabase%2Fwrapper%2Fnode%2Fclass_NodeDistributedHashTableDatabaseWrapper.php;h=45208a22e952bd3a9b7563b8d75b898be64a614e;hb=e8a52ce5ce49f0a5de5d73e855c9a9f9473bc826;hp=67fd53b26c7a7e949f067552167f538417056502;hpb=1d42535173b54627e5b1cdc8726c1b26b5f87b4b;p=hub.git diff --git a/application/hub/main/database/wrapper/node/class_NodeDistributedHashTableDatabaseWrapper.php b/application/hub/main/database/wrapper/node/class_NodeDistributedHashTableDatabaseWrapper.php index 67fd53b26..45208a22e 100644 --- a/application/hub/main/database/wrapper/node/class_NodeDistributedHashTableDatabaseWrapper.php +++ b/application/hub/main/database/wrapper/node/class_NodeDistributedHashTableDatabaseWrapper.php @@ -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]