BxDolBackgroundJobsQuery.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaCore UNA Core
  7. * @{
  8. */
  9. /**
  10. * @see BxDolBackgroundJobs
  11. */
  12. class BxDolBackgroundJobsQuery extends BxDolDb
  13. {
  14. public function __construct()
  15. {
  16. parent::__construct();
  17. }
  18. public function getClaimedJobs($sClasimToken)
  19. {
  20. return $this->getAll("
  21. SELECT * FROM `sys_background_jobs`
  22. WHERE `claim_token` = :claim_token AND `status` = '" . BX_DOL_BG_JOBS_STATUS_PENDING . "'
  23. ORDER BY `priority` DESC, `added` ASC", [
  24. 'claim_token' => $sClasimToken
  25. ]
  26. );
  27. }
  28. public function claimJobs($sClasimToken, $iLimit)
  29. {
  30. return $this->query("UPDATE `sys_background_jobs`
  31. SET `reserved_at`=UNIX_TIMESTAMP(), `claim_token`=:claim_token
  32. WHERE claim_token = '' AND `reserved_at`='0' AND (`available_at`='0' OR `available_at`<=UNIX_TIMESTAMP()) AND `status`='" . BX_DOL_BG_JOBS_STATUS_PENDING . "'
  33. ORDER BY `priority` DESC, `added` ASC
  34. LIMIT :limit", [
  35. 'claim_token' => $sClasimToken,
  36. 'limit' => (int)$iLimit
  37. ]) !== false;
  38. }
  39. public function getJobs($aParams = [])
  40. {
  41. $aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
  42. $sSelectClause = "*";
  43. $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
  44. switch($aParams['sample']) {
  45. case 'name':
  46. $aMethod['name'] = 'getRow';
  47. $aMethod['params'][1] = [
  48. 'name' => $aParams['name']
  49. ];
  50. $sWhereClause = " AND `name`=:name";
  51. break;
  52. case 'running':
  53. $aMethod['name'] = 'getAllWithKey';
  54. $aMethod['params'][1] = 'id';
  55. $sWhereClause = " AND `status`='" . BX_DOL_BG_JOBS_STATUS_PROCESSING . "'";
  56. break;
  57. case 'process':
  58. $aMethod['name'] = 'getAllWithKey';
  59. $aMethod['params'][1] = 'id';
  60. $sWhereClause = " AND `reserved_at`='0' AND (`available_at`='0' OR `available_at`<=UNIX_TIMESTAMP()) AND `status`='pending'";
  61. $sOrderClause = "`added` ASC";
  62. if(isset($aParams['with_priority']) && $aParams['with_priority'] === true)
  63. $sOrderClause = "`priority` DESC, " . $sOrderClause;
  64. if(!empty($aParams['limit']))
  65. $sLimitClause = $aParams['limit'];
  66. break;
  67. }
  68. $sOrderClause = !empty($sOrderClause) ? "ORDER BY " . $sOrderClause : $sOrderClause;
  69. $sLimitClause = !empty($sLimitClause) ? "LIMIT " . $sLimitClause : $sLimitClause;
  70. $aMethod['params'][0] = "SELECT
  71. " . $sSelectClause . "
  72. FROM `sys_background_jobs` " . $sJoinClause . "
  73. WHERE 1" . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
  74. return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
  75. }
  76. public function addJob($sName, $sServiceCall, $iPriority = 0)
  77. {
  78. return $this->query("INSERT INTO `sys_background_jobs` SET `name` = :name, `added`=UNIX_TIMESTAMP(), `priority` = :priority, `service_call`=:service_call ON DUPLICATE KEY UPDATE `added`=UNIX_TIMESTAMP(), `priority` = :priority, `service_call`=:service_call", [
  79. 'name' => $sName,
  80. 'priority' => $iPriority,
  81. 'service_call' => $sServiceCall
  82. ]) !== false;
  83. }
  84. public function updateJob($sName, $aParamsSet)
  85. {
  86. if(empty($sName))
  87. return false;
  88. return $this->updateJobExt($aParamsSet, [
  89. 'name' => $sName
  90. ]);
  91. }
  92. public function updateJobByIds($mixedIds, $aParamsSet)
  93. {
  94. if(empty($mixedIds))
  95. return false;
  96. if(!is_array($mixedIds))
  97. $mixedIds = [(int)$mixedIds];
  98. return $this->query("UPDATE `sys_background_jobs` SET " . $this->arrayToSQL($aParamsSet) . " WHERE `id` IN (" . $this->implode_escape($mixedIds) . ")");
  99. }
  100. public function updateJobExt($aParamsSet, $aParamsWhere)
  101. {
  102. if(empty($aParamsSet) || empty($aParamsWhere))
  103. return false;
  104. return $this->query("UPDATE `sys_background_jobs` SET " . $this->arrayToSQL($aParamsSet) . " WHERE " . $this->arrayToSQL($aParamsWhere, " AND "));
  105. }
  106. public function deleteJobs($aParams = [])
  107. {
  108. $aMethod = ['name' => 'query', 'params' => [0 => 'query']];
  109. $sWhereClause = $sLimitClause = "";
  110. switch($aParams['sample']) {
  111. case 'name':
  112. $aMethod['params'][1] = [
  113. 'name' => $aParams['name']
  114. ];
  115. $sWhereClause = " AND `name` = :name";
  116. break;
  117. case 'outdated':
  118. $aMethod['params'][1] = [
  119. 'timeout' => $aParams['timeout'],
  120. 'status' => $aParams['status'],
  121. ];
  122. $sWhereClause = " AND `added` + :timeout < UNIX_TIMESTAMP() AND `status` = :status";
  123. break;
  124. }
  125. $sLimitClause = !empty($sLimitClause) ? "LIMIT " . $sLimitClause : $sLimitClause;
  126. $aMethod['params'][0] = "DELETE FROM `sys_background_jobs` WHERE 1" . $sWhereClause . " " . $sLimitClause;
  127. return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
  128. }
  129. public function deleteJob($sName)
  130. {
  131. return $this->deleteJobs(['sample' => 'name', 'name' => $sName]) !== false;
  132. }
  133. }
  134. /** @} */