SimplesitemapQueue.php 2.05 KB
Newer Older
1 2 3 4 5 6 7
<?php

namespace Drupal\simple_sitemap\Queue;

use Drupal\Core\Queue\DatabaseQueue;

/**
gbyte.co's avatar
gbyte.co committed
8
 * Class SimplesitemapQueue
9 10
 * @package Drupal\simple_sitemap\Queue
 */
gbyte.co's avatar
gbyte.co committed
11
class SimplesitemapQueue extends DatabaseQueue {
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

  /**
   * Overrides \Drupal\Core\Queue\DatabaseQueue::claimItem().
   *
   * Unlike \Drupal\Core\Queue\DatabaseQueue::claimItem(), this method provides
   * a default lease time of 0 (no expiration) instead of 30. This allows the
   * item to be claimed repeatedly until it is deleted.
   */
  public function claimItem($lease_time = 0) {
    try {
      $item = $this->connection->queryRange('SELECT data, item_id FROM {queue} q WHERE name = :name ORDER BY item_id ASC', 0, 1, [':name' => $this->name])->fetchObject();
      if ($item) {
        $item->data = unserialize($item->data);
        return $item;
      }
    }
    catch (\Exception $e) {
      $this->catchException($e);
    }
31

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    return FALSE;
  }

  public function createItems($data_sets) {
    $try_again = FALSE;
    try {
      $id = $this->doCreateItems($data_sets);
    }
    catch (\Exception $e) {
      // If there was an exception, try to create the table.
      if (!$try_again = $this->ensureTableExists()) {
        // If the exception happened for other reason than the missing table,
        // propagate the exception.
        throw $e;
      }
    }
    // Now that the table has been created, try again if necessary.
    if ($try_again) {
      $id = $this->doCreateItems($data_sets);
    }
52

53 54 55 56 57 58 59 60 61 62 63
    return $id;
  }

  protected function doCreateItems($data_sets) {
    $query = $this->connection->insert(static::TABLE_NAME)
      ->fields(['name', 'data', 'created']);

    foreach ($data_sets as $i => $data) {
      $query->values([
        $this->name,
        serialize($data),
64
        time(),
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
      ]);
    }

    return $query->execute();
  }

  public function deleteItems($item_ids) {
    try {
      $this->connection->delete(static::TABLE_NAME)
        ->condition('item_id', $item_ids, 'IN')
        ->execute();
    }
    catch (\Exception $e) {
      $this->catchException($e);
    }
  }

}