]> git.mxchange.org Git - hub.git/blobdiff - application/hub/main/database/wrapper/node/class_NodeDistributedHashTableDatabaseWrapper.php
Added unfinished support for publication of DHT entries (all entries in the DHT will...
[hub.git] / application / hub / main / database / wrapper / node / class_NodeDistributedHashTableDatabaseWrapper.php
index daea599f608bb99568d1d27a9814e21ed42177eb..3cc15d8e4ac4d8e5fbbe34cb2ec53d02cbf73a0b 100644 (file)
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implements NodeDhtWrapper, Registerable {
+       /**
+        * "Cached" results for dabase for looking for unpublished entries
+        */
+       private $unpublishedEntriesInstance = NULL;
+
        // Constants for database table names
        const DB_TABLE_NODE_DHT = 'node_dht';
 
        // Constants for database column names
-       const DB_COLUMN_NODE_ID          = 'node_id';
-       const DB_COLUMN_SESSION_ID       = 'session_id';
-       const DB_COLUMN_EXTERNAL_IP      = 'external_ip';
-       const DB_COLUMN_LISTEN_PORT      = 'listen_port';
-       const DB_COLUMN_PRIVATE_KEY_HASH = 'private_key_hash';
-       const DB_COLUMN_NODE_MODE        = 'node_mode';
-       const DB_COLUMN_ACCEPTED_OBJECTS = 'accepted_object_types';
-       const DB_COLUMN_NODE_LIST        = 'node_list';
+       const DB_COLUMN_NODE_ID            = 'node_id';
+       const DB_COLUMN_SESSION_ID         = 'session_id';
+       const DB_COLUMN_EXTERNAL_IP        = 'external_ip';
+       const DB_COLUMN_LISTEN_PORT        = 'listen_port';
+       const DB_COLUMN_PRIVATE_KEY_HASH   = 'private_key_hash';
+       const DB_COLUMN_NODE_MODE          = 'node_mode';
+       const DB_COLUMN_ACCEPTED_OBJECTS   = 'accepted_object_types';
+       const DB_COLUMN_NODE_LIST          = 'node_list';
+       const DB_COLUMN_PUBLICATION_STATUS = 'publication_status';
+
+       // Publication status'
+       const PUBLICATION_STATUS_PENDING = 'PENDING';
 
        // Exception codes
        const EXCEPTION_NODE_ALREADY_REGISTERED = 0x800;
@@ -108,6 +117,15 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
                return $searchInstance;
        }
 
+       /**
+        * Getter for result instance for unpublished entries
+        *
+        * @return      $unpublishedEntriesInstance             Result instance
+        */
+       public final function getUnpublishedEntriesInstance () {
+               return $this->unpublishedEntriesInstance;
+       }
+
        /**
         * Prepares a "local" instance of a StoreableCriteria class with all node
         * data for insert/update queries. This data set contains data from *this*
@@ -408,6 +426,71 @@ class NodeDistributedHashTableDatabaseWrapper extends BaseDatabaseWrapper implem
                // Run the "UPDATE" query
                $this->queryUpdateDataSet($dataSetInstance);
        }
+
+       /**
+        * Checks whether there are unpublished entries
+        *
+        * @return      $hasUnpublished         Whether there are unpublished entries
+        * @todo        Add minimum/maximum age limitations
+        */
+       public function hasUnpublishedEntries () {
+               // Get search instance
+               $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
+
+               // Add exclusion key which is the publish status
+               $searchInstance->addExcludeCriteria(NodeDistributedHashTableDatabaseWrapper::DB_COLUMN_PUBLICATION_STATUS, NodeDistributedHashTableDatabaseWrapper::PUBLICATION_STATUS_PENDING);
+
+               // Remember search instance
+               $this->setSearchInstance($searchInstance);
+
+               // Run the query
+               $this->unpublishedEntriesInstance = $this->doSelectByCriteria($searchInstance);
+
+               // Check pending entries
+               $hasUnpublished = $this->unpublishedEntriesInstance->valid();
+
+               // Return it
+               return $hasUnpublished;
+       }
+
+       /**
+        * Initializes publication of DHT entries. This does only prepare
+        * publication. The next step is to pickup such prepared entries and publish
+        * them by uploading to other (recently appeared) DHT members.
+        *
+        * @return      void
+        * @todo        Add timestamp to dataset instance
+        */
+       public function initEntryPublication () {
+               /*
+                * Make sure that hasUnpublishedEntries() has been called first by
+                * asserting on the "cached" object instance. This "caching" saves some
+                * needless queries as this method shall be called immediately after
+                * hasUnpublishedEntries() returns TRUE.
+                */
+               assert($this->unpublishedEntriesInstance instanceof SearchableResult);
+
+               // Result is still okay?
+               assert($this->unpublishedEntriesInstance->valid());
+
+               // Remove 'publication_status'
+               $this->getSearchInstance()->unsetCriteria(self::DB_COLUMN_PUBLICATION_STATUS);
+
+               // Make sure all entries are marked as pending, first get a dataset instance.
+               $dataSetInstance = ObjectFactory::createObjectByConfiguredName('dataset_criteria_class', array(self::DB_TABLE_NODE_DHT));
+
+               // Add search instance
+               $dataSetInstance->setSearchInstance($this->getSearchInstance());
+
+               // Set primary key (node id)
+               $dataSetInstance->setUniqueKey(self::DB_COLUMN_NODE_ID);
+
+               // Add criteria (that should be set)
+               $dataSetInstance->addCriteria(self::DB_COLUMN_PUBLICATION_STATUS, self::PUBLICATION_STATUS_PENDING);
+
+               // Run the "UPDATE" query
+               $this->queryUpdateDataSet($dataSetInstance);
+       }
 }
 
 // [EOF]