<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 5 |
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2019 |
- +--------------------------------------------------------------------+
- | This file is a part of CiviCRM. |
- | |
- | CiviCRM is free software; you can copy, modify, and distribute it |
- | under the terms of the GNU Affero General Public License |
- | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
+ | Copyright CiviCRM LLC. All rights reserved. |
| |
- | CiviCRM is distributed in the hope that it will be useful, but |
- | WITHOUT ANY WARRANTY; without even the implied warranty of |
- | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
- | See the GNU Affero General Public License for more details. |
- | |
- | You should have received a copy of the GNU Affero General Public |
- | License and the CiviCRM Licensing Exception along |
- | with this program; if not, contact CiviCRM LLC |
- | at info[AT]civicrm[DOT]org. If you have questions about the |
- | GNU Affero General Public License or the licensing of CiviCRM, |
- | see the CiviCRM license FAQ at http://civicrm.org/licensing |
+ | This work is published under the GNU AGPLv3 license with some |
+ | permitted exceptions and without any warranty. For full license |
+ | and copyright information, see https://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
* With key 'data' that matches the inputted data.
*/
public function claimItem($lease_time = 3600) {
+
+ $result = NULL;
+ $dao = CRM_Core_DAO::executeQuery('LOCK TABLES civicrm_queue_item WRITE;');
$sql = "
- SELECT id, queue_name, submit_time, release_time, data
- FROM civicrm_queue_item
- WHERE queue_name = %1
- ORDER BY weight ASC, id ASC
- LIMIT 1
- ";
+ SELECT first_in_queue.* FROM (
+ SELECT id, queue_name, submit_time, release_time, data
+ FROM civicrm_queue_item
+ WHERE queue_name = %1
+ ORDER BY weight ASC, id ASC
+ LIMIT 1
+ ) first_in_queue
+ WHERE release_time IS NULL OR release_time < %2
+ ";
$params = [
1 => [$this->getName(), 'String'],
+ 2 => [CRM_Utils_Time::getTime(), 'Timestamp'],
];
$dao = CRM_Core_DAO::executeQuery($sql, $params, TRUE, 'CRM_Queue_DAO_QueueItem');
if (is_a($dao, 'DB_Error')) {
if ($dao->fetch()) {
$nowEpoch = CRM_Utils_Time::getTimeRaw();
- if ($dao->release_time === NULL || strtotime($dao->release_time) < $nowEpoch) {
- CRM_Core_DAO::executeQuery("UPDATE civicrm_queue_item SET release_time = %1 WHERE id = %2", [
- '1' => [date('YmdHis', $nowEpoch + $lease_time), 'String'],
- '2' => [$dao->id, 'Integer'],
- ]);
- // work-around: inconsistent date-formatting causes unintentional breakage
- # $dao->submit_time = date('YmdHis', strtotime($dao->submit_time));
- # $dao->release_time = date('YmdHis', $nowEpoch + $lease_time);
- # $dao->save();
- $dao->data = unserialize($dao->data);
- return $dao;
- }
+ CRM_Core_DAO::executeQuery("UPDATE civicrm_queue_item SET release_time = %1 WHERE id = %2", [
+ '1' => [date('YmdHis', $nowEpoch + $lease_time), 'String'],
+ '2' => [$dao->id, 'Integer'],
+ ]);
+ // (Comment by artfulrobot Sep 2019: Not sure what the below comment means, should be removed/clarified?)
+ // work-around: inconsistent date-formatting causes unintentional breakage
+ # $dao->submit_time = date('YmdHis', strtotime($dao->submit_time));
+ # $dao->release_time = date('YmdHis', $nowEpoch + $lease_time);
+ # $dao->save();
+ $dao->data = unserialize($dao->data);
+ $result = $dao;
}
+
+ $dao = CRM_Core_DAO::executeQuery('UNLOCK TABLES;');
+
+ return $result;
}
/**