‪TYPO3CMS  ‪main
SchedulerTaskRepository.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Doctrine\DBAL\Exception as DBALException;
31 
36 {
37  protected const ‪TABLE_NAME = 'tx_scheduler_task';
38 
39  public function ‪__construct(
40  protected readonly ‪TaskSerializer $taskSerializer,
41  ) {
42  }
43 
50  public function ‪add(‪AbstractTask $task): bool
51  {
52  $taskUid = $task->‪getTaskUid();
53  if (!empty($taskUid)) {
54  return false;
55  }
56  ‪$fields = [
57  'crdate' => ‪$GLOBALS['EXEC_TIME'],
58  'disable' => (int)$task->‪isDisabled(),
59  'description' => $task->‪getDescription(),
60  'task_group' => $task->‪getTaskGroup(),
61  'serialized_task_object' => 'RESERVED',
62  ];
63  $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable(self::TABLE_NAME);
64  $result = $connection->insert(
65  self::TABLE_NAME,
66  ‪$fields,
67  ['serialized_task_object' => ‪Connection::PARAM_LOB]
68  );
69  if ($result) {
70  $task->‪setTaskUid((int)$connection->lastInsertId(self::TABLE_NAME));
71  $this->‪update($task);
72  $result = true;
73  } else {
74  $result = false;
75  }
76  return $result;
77  }
78 
85  public function remove(int|‪AbstractTask $task): bool
86  {
87  $taskUid = is_int($task) ? $task : $task->getTaskUid();
88  if (empty($taskUid)) {
89  return false;
90  }
91  $affectedRows = GeneralUtility::makeInstance(ConnectionPool::class)
92  ->getConnectionForTable(self::TABLE_NAME)
93  ->update(self::TABLE_NAME, ['deleted' => 1], ['uid' => $taskUid]);
94  return $affectedRows === 1;
95  }
96 
100  public function ‪update(‪AbstractTask $task): bool
101  {
102  $result = true;
103  $taskUid = $task->‪getTaskUid();
104  if (empty($taskUid)) {
105  return false;
106  }
107  try {
108  if ($task->‪getRunOnNextCronJob()) {
109  $executionTime = time();
110  } else {
111  $executionTime = $task->‪getNextDueExecution();
112  }
113  $task->‪setExecutionTime($executionTime);
114  } catch (\‪Exception $e) {
115  $task->‪setDisabled(true);
116  $executionTime = 0;
117  }
118  $task->‪unsetScheduler();
119  ‪$fields = [
120  'nextexecution' => $executionTime,
121  'disable' => (int)$task->‪isDisabled(),
122  'description' => $task->‪getDescription(),
123  'task_group' => $task->‪getTaskGroup(),
124  'serialized_task_object' => serialize($task),
125  ];
126  try {
127  GeneralUtility::makeInstance(ConnectionPool::class)
128  ->getConnectionForTable(self::TABLE_NAME)
129  ->update(
130  self::TABLE_NAME,
131  ‪$fields,
132  ['uid' => $taskUid],
133  ['serialized_task_object' => ‪Connection::PARAM_LOB]
134  );
135  } catch (DBALException $e) {
136  $result = false;
137  }
138  return $result;
139  }
140 
149  public function ‪findRecordByUid(int ‪$uid): ?array
150  {
151  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
152  ->getQueryBuilderForTable(self::TABLE_NAME);
153  $row = $queryBuilder->select('*')
154  ->from(self::TABLE_NAME)
155  ->where(
156  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(‪$uid, ‪Connection::PARAM_INT)),
157  $queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT))
158  )
159  ->executeQuery()
160  ->fetchAssociative();
161 
162  if (empty($row)) {
163  return null;
164  }
165  return $row;
166  }
167 
177  public function ‪findByUid(int ‪$uid): ‪AbstractTask
178  {
179  $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
180  $queryBuilder = $connectionPool->getQueryBuilderForTable(self::TABLE_NAME);
181 
182  $queryBuilder->select('uid', 'serialized_task_object')
183  ->from(self::TABLE_NAME)
184  ->setMaxResults(1)
185  ->where(
186  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(‪$uid, ‪Connection::PARAM_INT)),
187  $queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT))
188  );
189 
190  $row = $queryBuilder->executeQuery()->fetchAssociative();
191  if (empty($row)) {
192  // Although an uid was passed, no task with given was found
193  throw new \OutOfBoundsException('No task with id ' . ‪$uid . ' found', 1422044826);
194  }
195 
196  return $this->‪createValidTaskObjectOrDisableTask($row);
197  }
198 
208  {
209  // If no uid is given, take any non-disabled task which has a next execution time in the past
210  $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
211  $queryBuilder = $connectionPool->getQueryBuilderForTable(self::TABLE_NAME);
212 
213  $queryBuilder->select('t.uid', 't.serialized_task_object')
214  ->from(self::TABLE_NAME, 't')
215  ->setMaxResults(1);
216  // Define where clause
217  $queryBuilder->getRestrictions()->removeAll();
218  $queryBuilder->leftJoin(
219  't',
220  'tx_scheduler_task_group',
221  'g',
222  $queryBuilder->expr()->eq('t.task_group', $queryBuilder->quoteIdentifier('g.uid'))
223  );
224  $queryBuilder->where(
225  $queryBuilder->expr()->eq('t.disable', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
226  $queryBuilder->expr()->neq(
227  't.nextexecution',
228  $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)
229  ),
230  $queryBuilder->expr()->lte(
231  't.nextexecution',
232  $queryBuilder->createNamedParameter(‪$GLOBALS['EXEC_TIME'], ‪Connection::PARAM_INT)
233  ),
234  $queryBuilder->expr()->or(
235  $queryBuilder->expr()->eq('g.hidden', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
236  $queryBuilder->expr()->isNull('g.hidden')
237  ),
238  $queryBuilder->expr()->eq('t.deleted', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT))
239  );
240  $queryBuilder->orderBy('t.nextexecution', 'ASC');
241 
242  $row = $queryBuilder->executeQuery()->fetchAssociative();
243  if (empty($row)) {
244  // No uid was passed and no overdue task was found
245  throw new \OutOfBoundsException('No (more) tasks available for execution', 1247827244);
246  }
247 
248  return $this->‪createValidTaskObjectOrDisableTask($row);
249  }
250 
254  public function ‪getGroupedTasks(): array
255  {
256  $registeredClasses = GeneralUtility::makeInstance(TaskService::class)->getAvailableTaskTypes();
257 
258  // Get all registered tasks
259  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(self::TABLE_NAME);
260  $queryBuilder->getRestrictions()->removeAll();
261  $result = $queryBuilder->select('t.*')
262  ->addSelect(
263  'g.groupName AS taskGroupName',
264  'g.description AS taskGroupDescription',
265  'g.uid AS taskGroupId',
266  'g.deleted AS isTaskGroupDeleted',
267  'g.hidden AS isTaskGroupHidden',
268  )
269  ->from(self::TABLE_NAME, 't')
270  ->leftJoin(
271  't',
272  'tx_scheduler_task_group',
273  'g',
274  $queryBuilder->expr()->eq('t.task_group', $queryBuilder->quoteIdentifier('g.uid'))
275  )
276  ->where(
277  $queryBuilder->expr()->eq('t.deleted', 0)
278  )
279  ->orderBy('g.sorting')
280  ->executeQuery();
281 
282  $taskGroupsWithTasks = [];
283  $errorClasses = [];
284  while ($row = $result->fetchAssociative()) {
285  $taskData = [
286  'uid' => (int)$row['uid'],
287  'lastExecutionTime' => (int)$row['lastexecution_time'],
288  'lastExecutionContext' => $row['lastexecution_context'],
289  'errorMessage' => '',
290  'description' => $row['description'],
291  ];
292 
293  try {
294  $taskObject = $this->taskSerializer->deserialize($row['serialized_task_object']);
295  } catch (‪InvalidTaskException $e) {
296  $taskData['errorMessage'] = $e->getMessage();
297  $taskData['class'] = $this->taskSerializer->extractClassName($row['serialized_task_object']);
298  $errorClasses[] = $taskData;
299  continue;
300  }
301 
302  $taskClass = $this->taskSerializer->resolveClassName($taskObject);
303  $taskData['class'] = $taskClass;
304 
305  if (!$this->‪isValidTaskObject($taskObject)) {
306  $taskData['errorMessage'] = 'The class ' . $taskClass . ' is not a valid task';
307  $errorClasses[] = $taskData;
308  continue;
309  }
310 
311  if (!isset($registeredClasses[$taskClass])) {
312  $taskData['errorMessage'] = 'The class ' . $taskClass . ' is not a registered task';
313  $errorClasses[] = $taskData;
314  continue;
315  }
316 
317  if ($taskObject instanceof ‪ProgressProviderInterface) {
318  $taskData['progress'] = round((float)$taskObject->getProgress(), 2);
319  }
320  $taskData['classTitle'] = $registeredClasses[$taskClass]['title'];
321  $taskData['classExtension'] = $registeredClasses[$taskClass]['extension'];
322  $taskData['additionalInformation'] = $taskObject->getAdditionalInformation();
323  $taskData['disabled'] = (bool)$row['disable'];
324  $taskData['isRunning'] = !empty($row['serialized_executions']);
325  $taskData['nextExecution'] = (int)$row['nextexecution'];
326  $taskData['type'] = 'single';
327  $taskData['frequency'] = '';
328  if ($taskObject->getType() === ‪AbstractTask::TYPE_RECURRING) {
329  $taskData['type'] = 'recurring';
330  $taskData['frequency'] = $taskObject->getExecution()->getCronCmd() ?: $taskObject->getExecution()->getInterval();
331  }
332  $taskData['multiple'] = (bool)$taskObject->getExecution()->getMultiple();
333  $taskData['lastExecutionFailure'] = false;
334  if (!empty($row['lastexecution_failure'])) {
335  $taskData['lastExecutionFailure'] = true;
336  $exceptionArray = @unserialize($row['lastexecution_failure']);
337  $taskData['lastExecutionFailureCode'] = '';
338  $taskData['lastExecutionFailureMessage'] = '';
339  if (is_array($exceptionArray)) {
340  $taskData['lastExecutionFailureCode'] = $exceptionArray['code'];
341  $taskData['lastExecutionFailureMessage'] = $exceptionArray['message'];
342  }
343  }
344 
345  // If a group is deleted or no group is set it needs to go into "not assigned groups"
346  $groupIndex = $row['isTaskGroupDeleted'] === 1 || $row['isTaskGroupDeleted'] === null ? 0 : (int)$row['task_group'];
347  if (!isset($taskGroupsWithTasks[$groupIndex])) {
348  $taskGroupsWithTasks[$groupIndex] = [
349  'tasks' => [],
350  'groupName' => $row['taskGroupName'],
351  'groupUid' => $row['taskGroupId'],
352  'groupDescription' => $row['taskGroupDescription'],
353  'groupHidden' => $row['isTaskGroupHidden'],
354  ];
355  }
356  $taskGroupsWithTasks[$groupIndex]['tasks'][] = $taskData;
357  }
358 
359  return [
360  'taskGroupsWithTasks' => $taskGroupsWithTasks,
361  'errorClasses' => $errorClasses,
362  ];
363  }
364 
366  {
367  $isInvalidTask = false;
368  $task = null;
369  try {
370  $task = $this->taskSerializer->deserialize($row['serialized_task_object']);
371  } catch (‪InvalidTaskException) {
372  $isInvalidTask = true;
373  }
374  if ($isInvalidTask || !$this->‪isValidTaskObject($task)) {
375  // Forcibly set the disabled flag to 1 in the database,
376  // so that the task does not come up again and again for execution
377  $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
378  $connectionPool->getConnectionForTable(self::TABLE_NAME)->update(
379  self::TABLE_NAME,
380  ['disable' => 1],
381  ['uid' => (int)$row['uid']]
382  );
383  // Throw an exception to raise the problem
384  // @todo: This should most likely be changed to a specific exception.
385  throw new \UnexpectedValueException('Could not unserialize task', 1255083671);
386  }
387 
388  // The task is valid, return it
389  $task->setScheduler();
390  if ($task->getTaskGroup() === null) {
391  // Fix invalid task_group=NULL settings in order to avoid exceptions when saving on PostgreSQL
392  $task->setTaskGroup(0);
393  }
394  return $task;
395  }
396 
401  {
402  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
403  ->getQueryBuilderForTable(self::TABLE_NAME);
404 
405  $queryBuilder
406  ->select('serialized_task_object')
407  ->from(self::TABLE_NAME)
408  ->where(
409  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(‪$uid, ‪Connection::PARAM_INT)),
410  $queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
411  $queryBuilder->expr()->eq('disable', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
412  $queryBuilder->expr()->neq('nextexecution', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
413  $queryBuilder->expr()->lte('nextexecution', $queryBuilder->createNamedParameter(‪$GLOBALS['EXEC_TIME'], ‪Connection::PARAM_INT)),
414  );
415 
416  $result = $queryBuilder->executeQuery();
417  while ($row = $result->fetchAssociative()) {
418  try {
419  $task = $this->taskSerializer->deserialize($row['serialized_task_object']);
420  } catch (‪InvalidTaskException) {
421  continue;
422  }
423 
424  // Add the task to the list only if it is valid
425  if ($this->‪isValidTaskObject($task)) {
426  $task->‪setScheduler();
427  return $task;
428  }
429  }
430  return null;
431  }
432 
433  public function ‪isTaskMarkedAsRunning(‪AbstractTask $task): bool
434  {
435  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
436  ->getQueryBuilderForTable(self::TABLE_NAME);
437  $row = $queryBuilder
438  ->select('serialized_executions')
439  ->from(self::TABLE_NAME)
440  ->where(
441  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($task->‪getTaskUid(), ‪Connection::PARAM_INT))
442  )
443  ->executeQuery()
444  ->fetchAssociative();
445 
446  if ($row && !empty($row['serialized_executions'])) {
447  return true;
448  }
449  return false;
450  }
451 
458  public function ‪addExecutionToTask(‪AbstractTask $task): int
459  {
460  $row = $this->‪findRecordByUid($task->‪getTaskUid());
461 
462  $runningExecutions = [];
463  if ($row && !empty($row['serialized_executions'])) {
464  $runningExecutions = unserialize($row['serialized_executions']);
465  }
466  // Count the number of existing executions and use that number as a key
467  // (we need to know that number, because it is returned at the end of the method)
468  $numExecutions = count($runningExecutions);
469  $runningExecutions[$numExecutions] = time();
470  GeneralUtility::makeInstance(ConnectionPool::class)
471  ->getConnectionForTable(self::TABLE_NAME)
472  ->update(
473  self::TABLE_NAME,
474  [
475  'serialized_executions' => serialize($runningExecutions),
476  'lastexecution_time' => time(),
477  // Define the context in which the script is running
478  'lastexecution_context' => ‪Environment::isCli() ? 'CLI' : 'BE',
479  ],
480  [
481  'uid' => $task->‪getTaskUid(),
482  ],
483  [
484  'serialized_executions' => ‪Connection::PARAM_LOB,
485  ]
486  );
487  return $numExecutions;
488  }
489 
496  public function ‪removeExecutionOfTask(‪AbstractTask $task, int $executionID, array|string $failureReason = null): void
497  {
498  $row = $this->‪findRecordByUid($task->‪getTaskUid());
499  if ($row && $row['serialized_executions'] !== '') {
500  $runningExecutions = unserialize($row['serialized_executions']);
501  // Remove the selected execution
502  unset($runningExecutions[$executionID]);
503  if (!empty($runningExecutions)) {
504  // Re-serialize the updated executions list (if necessary)
505  $runningExecutionsSerialized = serialize($runningExecutions);
506  } else {
507  $runningExecutionsSerialized = '';
508  }
509  if (is_array($failureReason)) {
510  $failureReason = json_encode($failureReason);
511  }
512  // Save the updated executions list
513  GeneralUtility::makeInstance(ConnectionPool::class)
514  ->getConnectionForTable(self::TABLE_NAME)
515  ->update(
516  self::TABLE_NAME,
517  [
518  'serialized_executions' => $runningExecutionsSerialized,
519  'lastexecution_failure' => (string)$failureReason,
520  ],
521  [
522  'uid' => $task->‪getTaskUid(),
523  ],
524  [
525  'serialized_executions' => ‪Connection::PARAM_LOB,
526  ]
527  );
528  }
529  }
530 
537  {
538  // Set the serialized executions field to empty
539  $result = GeneralUtility::makeInstance(ConnectionPool::class)
540  ->getConnectionForTable(self::TABLE_NAME)
541  ->update(
542  self::TABLE_NAME,
543  ['serialized_executions' => ''],
544  ['uid' => $task->‪getTaskUid()],
545  ['serialized_executions' => ‪Connection::PARAM_LOB]
546  );
547  return (bool)$result;
548  }
549 
553  public function ‪hasTasks(): bool
554  {
555  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(self::TABLE_NAME);
556  $queryBuilder->getRestrictions()->removeAll();
557  $queryBuilder
558  ->count('*')
559  ->from(self::TABLE_NAME)
560  ->where(
561  $queryBuilder->expr()->eq('deleted', 0)
562  );
563  return $queryBuilder->executeQuery()->fetchOne() > 0;
564  }
565 
566  protected function ‪isValidTaskObject($task): bool
567  {
568  return (new ‪TaskValidator())->isValid($task);
569  }
570 }
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\removeAllRegisteredExecutionsForTask
‪bool removeAllRegisteredExecutionsForTask(AbstractTask $task)
Definition: SchedulerTaskRepository.php:536
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\findNextExecutableTaskForUid
‪findNextExecutableTaskForUid(int $uid)
Definition: SchedulerTaskRepository.php:400
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:47
‪TYPO3\CMS\Scheduler\Task\AbstractTask\getTaskUid
‪int getTaskUid()
Definition: AbstractTask.php:134
‪TYPO3\CMS\Scheduler\Task\AbstractTask\getRunOnNextCronJob
‪bool getRunOnNextCronJob()
Definition: AbstractTask.php:208
‪TYPO3\CMS\Scheduler\Task\AbstractTask\setTaskUid
‪setTaskUid($id)
Definition: AbstractTask.php:124
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\createValidTaskObjectOrDisableTask
‪createValidTaskObjectOrDisableTask(array $row)
Definition: SchedulerTaskRepository.php:365
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\findByUid
‪findByUid(int $uid)
Definition: SchedulerTaskRepository.php:177
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository
Definition: SchedulerTaskRepository.php:36
‪TYPO3\CMS\Scheduler\Task\TaskSerializer
Definition: TaskSerializer.php:28
‪TYPO3\CMS\Scheduler\Domain\Repository
Definition: SchedulerTaskRepository.php:18
‪TYPO3\CMS\Scheduler\Task\AbstractTask\setDisabled
‪setDisabled($flag)
Definition: AbstractTask.php:184
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\TABLE_NAME
‪const TABLE_NAME
Definition: SchedulerTaskRepository.php:37
‪$fields
‪$fields
Definition: pages.php:5
‪TYPO3\CMS\Scheduler\Task\AbstractTask\getNextDueExecution
‪int getNextDueExecution()
Definition: AbstractTask.php:374
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\hasTasks
‪hasTasks()
Definition: SchedulerTaskRepository.php:553
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\isValidTaskObject
‪isValidTaskObject($task)
Definition: SchedulerTaskRepository.php:566
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\add
‪bool add(AbstractTask $task)
Definition: SchedulerTaskRepository.php:50
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\update
‪update(AbstractTask $task)
Definition: SchedulerTaskRepository.php:100
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\__construct
‪__construct(protected readonly TaskSerializer $taskSerializer,)
Definition: SchedulerTaskRepository.php:39
‪TYPO3\CMS\Scheduler\Task\AbstractTask\setScheduler
‪setScheduler()
Definition: AbstractTask.php:278
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\addExecutionToTask
‪int addExecutionToTask(AbstractTask $task)
Definition: SchedulerTaskRepository.php:458
‪TYPO3\CMS\Scheduler\Task\AbstractTask
Definition: AbstractTask.php:33
‪TYPO3\CMS\Scheduler\ProgressProviderInterface
Definition: ProgressProviderInterface.php:22
‪TYPO3\CMS\Scheduler\Task\AbstractTask\isDisabled
‪bool isDisabled()
Definition: AbstractTask.php:174
‪TYPO3\CMS\Core\Core\Environment\isCli
‪static isCli()
Definition: Environment.php:145
‪TYPO3\CMS\Scheduler\Exception
Definition: Exception.php:26
‪TYPO3\CMS\Scheduler\Task\AbstractTask\TYPE_RECURRING
‪const TYPE_RECURRING
Definition: AbstractTask.php:37
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\findNextExecutableTask
‪AbstractTask findNextExecutableTask()
Definition: SchedulerTaskRepository.php:207
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:36
‪TYPO3\CMS\Scheduler\Validation\Validator\TaskValidator
Definition: TaskValidator.php:23
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Scheduler\Task\AbstractTask\getTaskGroup
‪int null getTaskGroup()
Definition: AbstractTask.php:228
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\getGroupedTasks
‪getGroupedTasks()
Definition: SchedulerTaskRepository.php:254
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\removeExecutionOfTask
‪removeExecutionOfTask(AbstractTask $task, int $executionID, array|string $failureReason=null)
Definition: SchedulerTaskRepository.php:496
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:51
‪TYPO3\CMS\Scheduler\Task\AbstractTask\getDescription
‪string getDescription()
Definition: AbstractTask.php:268
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\isTaskMarkedAsRunning
‪isTaskMarkedAsRunning(AbstractTask $task)
Definition: SchedulerTaskRepository.php:433
‪TYPO3\CMS\Scheduler\Task\AbstractTask\unsetScheduler
‪unsetScheduler()
Definition: AbstractTask.php:291
‪TYPO3\CMS\Scheduler\Service\TaskService
Definition: TaskService.php:27
‪TYPO3\CMS\Scheduler\Task\AbstractTask\setExecutionTime
‪setExecutionTime($timestamp)
Definition: AbstractTask.php:218
‪TYPO3\CMS\Scheduler\Exception\InvalidTaskException
Definition: InvalidTaskException.php:27
‪TYPO3\CMS\Core\Database\Connection\PARAM_LOB
‪const PARAM_LOB
Definition: Connection.php:57
‪TYPO3\CMS\Scheduler\Domain\Repository\SchedulerTaskRepository\findRecordByUid
‪array null findRecordByUid(int $uid)
Definition: SchedulerTaskRepository.php:149