diff options
Diffstat (limited to 'modules/system/system.queue.inc')
-rw-r--r-- | modules/system/system.queue.inc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/modules/system/system.queue.inc b/modules/system/system.queue.inc index 5174a0a65..bac1ff26e 100644 --- a/modules/system/system.queue.inc +++ b/modules/system/system.queue.inc @@ -254,5 +254,78 @@ class SystemQueue implements DrupalQueueInterface { } /** + * Static queue implementation. + * + * This allows "undelayed" variants of processes relying on the Queue + * interface. The queue data resides in memory. It should only be used for + * items that will be queued and dequeued within a given page request. + */ +class MemoryQueue implements DrupalQueueInterface { + /** + * The queue data. + * + * @var array + */ + protected $queue; + + /** + * Counter for item ids. + * + * @var int + */ + protected $id_sequence; + + public function __construct($name) { + $this->queue = array(); + $this->id_sequence = 0; + } + + public function createItem($data) { + $item = new stdClass(); + $item->item_id = $this->id_sequence++; + $item->data = $data; + $item->created = time(); + $item->expire = 0; + $this->queue[$item->item_id] = $item; + } + + public function numberOfItems() { + return count($this->queue); + } + + public function claimItem($lease_time = 30) { + foreach ($this->queue as $key => $item) { + if ($item->expire == 0) { + $item->expire = time() + $lease_time; + $this->queue[$key] = $item; + return $item; + } + } + return FALSE; + } + + public function deleteItem($item) { + unset($this->queue[$item->item_id]); + } + + public function releaseItem($item) { + if (isset($this->queue[$item->item_id]) && $this->queue[$item->item_id]->expire != 0) { + $this->queue[$item->item_id]->expire = 0; + return TRUE; + } + return FALSE; + } + + public function createQueue() { + // Nothing needed here. + } + + public function deleteQueue() { + $this->queue = array(); + $this->id_sequence = 0; + } +} + +/** * @} End of "defgroup queue". */ |