danielebarchiesi@0: name = $name; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function createItem($data) { danielebarchiesi@0: // During a Drupal 6.x to 7.x update, drupal_get_schema() does not contain danielebarchiesi@0: // the queue table yet, so we cannot rely on drupal_write_record(). danielebarchiesi@0: $query = db_insert('queue') danielebarchiesi@0: ->fields(array( danielebarchiesi@0: 'name' => $this->name, danielebarchiesi@0: 'data' => serialize($data), danielebarchiesi@0: // We cannot rely on REQUEST_TIME because many items might be created danielebarchiesi@0: // by a single request which takes longer than 1 second. danielebarchiesi@0: 'created' => time(), danielebarchiesi@0: )); danielebarchiesi@0: return (bool) $query->execute(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function numberOfItems() { danielebarchiesi@0: return db_query('SELECT COUNT(item_id) FROM {queue} WHERE name = :name', array(':name' => $this->name))->fetchField(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function claimItem($lease_time = 30) { danielebarchiesi@0: // Claim an item by updating its expire fields. If claim is not successful danielebarchiesi@0: // another thread may have claimed the item in the meantime. Therefore loop danielebarchiesi@0: // until an item is successfully claimed or we are reasonably sure there danielebarchiesi@0: // are no unclaimed items left. danielebarchiesi@0: while (TRUE) { danielebarchiesi@0: $item = db_query_range('SELECT data, item_id FROM {queue} q WHERE expire = 0 AND name = :name ORDER BY created ASC', 0, 1, array(':name' => $this->name))->fetchObject(); danielebarchiesi@0: if ($item) { danielebarchiesi@0: // Try to update the item. Only one thread can succeed in UPDATEing the danielebarchiesi@0: // same row. We cannot rely on REQUEST_TIME because items might be danielebarchiesi@0: // claimed by a single consumer which runs longer than 1 second. If we danielebarchiesi@0: // continue to use REQUEST_TIME instead of the current time(), we steal danielebarchiesi@0: // time from the lease, and will tend to reset items before the lease danielebarchiesi@0: // should really expire. danielebarchiesi@0: $update = db_update('queue') danielebarchiesi@0: ->fields(array( danielebarchiesi@0: 'expire' => time() + $lease_time, danielebarchiesi@0: )) danielebarchiesi@0: ->condition('item_id', $item->item_id) danielebarchiesi@0: ->condition('expire', 0); danielebarchiesi@0: // If there are affected rows, this update succeeded. danielebarchiesi@0: if ($update->execute()) { danielebarchiesi@0: $item->data = unserialize($item->data); danielebarchiesi@0: return $item; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // No items currently available to claim. danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function releaseItem($item) { danielebarchiesi@0: $update = db_update('queue') danielebarchiesi@0: ->fields(array( danielebarchiesi@0: 'expire' => 0, danielebarchiesi@0: )) danielebarchiesi@0: ->condition('item_id', $item->item_id); danielebarchiesi@0: return $update->execute(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function deleteItem($item) { danielebarchiesi@0: db_delete('queue') danielebarchiesi@0: ->condition('item_id', $item->item_id) danielebarchiesi@0: ->execute(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function createQueue() { danielebarchiesi@0: // All tasks are stored in a single database table (which is created when danielebarchiesi@0: // Drupal is first installed) so there is nothing we need to do to create danielebarchiesi@0: // a new queue. danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function deleteQueue() { danielebarchiesi@0: db_delete('queue') danielebarchiesi@0: ->condition('name', $this->name) danielebarchiesi@0: ->execute(); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Static queue implementation. danielebarchiesi@0: * danielebarchiesi@0: * This allows "undelayed" variants of processes relying on the Queue danielebarchiesi@0: * interface. The queue data resides in memory. It should only be used for danielebarchiesi@0: * items that will be queued and dequeued within a given page request. danielebarchiesi@0: */ danielebarchiesi@0: class MemoryQueue implements DrupalQueueInterface { danielebarchiesi@0: /** danielebarchiesi@0: * The queue data. danielebarchiesi@0: * danielebarchiesi@0: * @var array danielebarchiesi@0: */ danielebarchiesi@0: protected $queue; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Counter for item ids. danielebarchiesi@0: * danielebarchiesi@0: * @var int danielebarchiesi@0: */ danielebarchiesi@0: protected $id_sequence; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Start working with a queue. danielebarchiesi@0: * danielebarchiesi@0: * @param $name danielebarchiesi@0: * Arbitrary string. The name of the queue to work with. danielebarchiesi@0: */ danielebarchiesi@0: public function __construct($name) { danielebarchiesi@0: $this->queue = array(); danielebarchiesi@0: $this->id_sequence = 0; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function createItem($data) { danielebarchiesi@0: $item = new stdClass(); danielebarchiesi@0: $item->item_id = $this->id_sequence++; danielebarchiesi@0: $item->data = $data; danielebarchiesi@0: $item->created = time(); danielebarchiesi@0: $item->expire = 0; danielebarchiesi@0: $this->queue[$item->item_id] = $item; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function numberOfItems() { danielebarchiesi@0: return count($this->queue); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function claimItem($lease_time = 30) { danielebarchiesi@0: foreach ($this->queue as $key => $item) { danielebarchiesi@0: if ($item->expire == 0) { danielebarchiesi@0: $item->expire = time() + $lease_time; danielebarchiesi@0: $this->queue[$key] = $item; danielebarchiesi@0: return $item; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function deleteItem($item) { danielebarchiesi@0: unset($this->queue[$item->item_id]); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function releaseItem($item) { danielebarchiesi@0: if (isset($this->queue[$item->item_id]) && $this->queue[$item->item_id]->expire != 0) { danielebarchiesi@0: $this->queue[$item->item_id]->expire = 0; danielebarchiesi@0: return TRUE; danielebarchiesi@0: } danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function createQueue() { danielebarchiesi@0: // Nothing needed here. danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: public function deleteQueue() { danielebarchiesi@0: $this->queue = array(); danielebarchiesi@0: $this->id_sequence = 0; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * @} End of "defgroup queue". danielebarchiesi@0: */