]> git.mxchange.org Git - friendica.git/commitdiff
Create Queue class
authorAdam Magness <adam.magness@gmail.com>
Tue, 16 Jan 2018 00:28:39 +0000 (19:28 -0500)
committerAdam Magness <adam.magness@gmail.com>
Tue, 16 Jan 2018 00:28:39 +0000 (19:28 -0500)
Create queue class and functions from queue_fn.php

src/Model/Queue.php [new file with mode: 0644]

diff --git a/src/Model/Queue.php b/src/Model/Queue.php
new file mode 100644 (file)
index 0000000..a551bee
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/**
+ * @file src/Model/Queue.php
+ */
+namespace Friendica\Model;
+
+use Friendica\Core\Config;
+use Friendica\Database\DBM;
+use dba;
+
+require_once 'include/dba.php';
+require_once 'include/datetime.php';
+
+class Queue
+{
+       function update_queue_time($id)
+       {
+               logger('queue: requeue item ' . $id);
+               dba::update('queue', ['last' => datetime_convert()], ['id' => $id]);
+       }
+       
+       function remove_queue_item($id)
+       {
+               logger('queue: remove queue item ' . $id);
+               dba::delete('queue', ['id' => $id]);
+       }
+       
+       /**
+        * @brief Checks if the communication with a given contact had problems recently
+        *
+        * @param int $cid Contact id
+        *
+        * @return bool The communication with this contact has currently problems
+        */
+       function was_recently_delayed($cid)
+       {
+               // Are there queue entries that were recently added?
+               $r = q("SELECT `id` FROM `queue` WHERE `cid` = %d
+                       AND `last` > UTC_TIMESTAMP() - INTERVAL 15 MINUTE LIMIT 1",
+                       intval($cid)
+               );
+       
+               $was_delayed = DBM::is_result($r);
+       
+               // We set "term-date" to a current date if the communication has problems.
+               // If the communication works again we reset this value.
+               if ($was_delayed) {
+                       $r = q("SELECT `term-date` FROM `contact` WHERE `id` = %d AND `term-date` <= '1000-01-01' LIMIT 1",
+                               intval($cid)
+                       );
+                       $was_delayed = !DBM::is_result($r);
+               }
+       
+               return $was_delayed;
+       }
+       
+       
+       function add_to_queue($cid, $network, $msg, $batch = false)
+       {
+       
+               $max_queue = Config::get('system', 'max_contact_queue');
+               if ($max_queue < 1) {
+                       $max_queue = 500;
+               }
+       
+               $batch_queue = Config::get('system', 'max_batch_queue');
+               if ($batch_queue < 1) {
+                       $batch_queue = 1000;
+               }
+       
+               $r = q("SELECT COUNT(*) AS `total` FROM `queue` INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
+                       WHERE `queue`.`cid` = %d AND `contact`.`self` = 0 ",
+                       intval($cid)
+               );
+               if (DBM::is_result($r)) {
+                       if ($batch &&  ($r[0]['total'] > $batch_queue)) {
+                               logger('add_to_queue: too many queued items for batch server ' . $cid . ' - discarding message');
+                               return;
+                       } elseif ((! $batch) && ($r[0]['total'] > $max_queue)) {
+                               logger('add_to_queue: too many queued items for contact ' . $cid . ' - discarding message');
+                               return;
+                       }
+               }
+       
+               dba::insert('queue', ['cid' => $cid, 'network' => $network, 'created' => datetime_convert(), 'last' => datetime_convert(), 'content' => $msg, 'batch' =>($batch) ? 1 : 0]);
+       }
+}