// 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';
}
/**
- * 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();
// 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());
// 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
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);
$searchInstance->setLimit(1);
// Get a prepared dataset instance
- $dataSetInstance = $this->prepareDataSetInstance();
+ $dataSetInstance = $this->prepareLocalDataSetInstance();
// Set search instance
$dataSetInstance->setSearchInstance($searchInstance);
// 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]