Blame view

sources/lib/private/backgroundjob/joblist.php 4.5 KB
31b7f2792   Kload   Upgrade to ownclo...
1
2
  <?php
  /**
6d9380f96   Cédric Dupont   Update sources OC...
3
   * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
31b7f2792   Kload   Upgrade to ownclo...
4
5
6
7
8
9
   * This file is licensed under the Affero General Public License version 3 or
   * later.
   * See the COPYING-README file.
   */
  
  namespace OC\BackgroundJob;
6d9380f96   Cédric Dupont   Update sources OC...
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  use OCP\BackgroundJob\IJobList;
  
  class JobList implements IJobList {
  	/**
  	 * @var \OCP\IDBConnection
  	 */
  	private $conn;
  
  	/**
  	 * @var \OCP\IConfig $config
  	 */
  	private $config;
  
  	/**
  	 * @param \OCP\IDBConnection $conn
  	 * @param \OCP\IConfig $config
  	 */
  	public function __construct($conn, $config) {
  		$this->conn = $conn;
  		$this->config = $config;
  	}
31b7f2792   Kload   Upgrade to ownclo...
31
32
33
34
35
36
37
38
39
40
41
42
  	/**
  	 * @param Job|string $job
  	 * @param mixed $argument
  	 */
  	public function add($job, $argument = null) {
  		if (!$this->has($job, $argument)) {
  			if ($job instanceof Job) {
  				$class = get_class($job);
  			} else {
  				$class = $job;
  			}
  			$argument = json_encode($argument);
6d9380f96   Cédric Dupont   Update sources OC...
43
  			$query = $this->conn->prepare('INSERT INTO `*PREFIX*jobs`(`class`, `argument`, `last_run`) VALUES(?, ?, 0)');
31b7f2792   Kload   Upgrade to ownclo...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  			$query->execute(array($class, $argument));
  		}
  	}
  
  	/**
  	 * @param Job|string $job
  	 * @param mixed $argument
  	 */
  	public function remove($job, $argument = null) {
  		if ($job instanceof Job) {
  			$class = get_class($job);
  		} else {
  			$class = $job;
  		}
  		if (!is_null($argument)) {
  			$argument = json_encode($argument);
6d9380f96   Cédric Dupont   Update sources OC...
60
  			$query = $this->conn->prepare('DELETE FROM `*PREFIX*jobs` WHERE `class` = ? AND `argument` = ?');
31b7f2792   Kload   Upgrade to ownclo...
61
62
  			$query->execute(array($class, $argument));
  		} else {
6d9380f96   Cédric Dupont   Update sources OC...
63
  			$query = $this->conn->prepare('DELETE FROM `*PREFIX*jobs` WHERE `class` = ?');
31b7f2792   Kload   Upgrade to ownclo...
64
65
66
67
68
69
70
  			$query->execute(array($class));
  		}
  	}
  
  	/**
  	 * check if a job is in the list
  	 *
6d9380f96   Cédric Dupont   Update sources OC...
71
  	 * @param Job|string $job
31b7f2792   Kload   Upgrade to ownclo...
72
73
74
75
76
77
78
79
80
81
  	 * @param mixed $argument
  	 * @return bool
  	 */
  	public function has($job, $argument) {
  		if ($job instanceof Job) {
  			$class = get_class($job);
  		} else {
  			$class = $job;
  		}
  		$argument = json_encode($argument);
6d9380f96   Cédric Dupont   Update sources OC...
82
83
84
  		$query = $this->conn->prepare('SELECT `id` FROM `*PREFIX*jobs` WHERE `class` = ? AND `argument` = ?');
  		$query->execute(array($class, $argument));
  		return (bool)$query->fetch();
31b7f2792   Kload   Upgrade to ownclo...
85
86
87
88
89
90
91
92
  	}
  
  	/**
  	 * get all jobs in the list
  	 *
  	 * @return Job[]
  	 */
  	public function getAll() {
6d9380f96   Cédric Dupont   Update sources OC...
93
94
  		$query = $this->conn->prepare('SELECT `id`, `class`, `last_run`, `argument` FROM `*PREFIX*jobs`');
  		$query->execute();
31b7f2792   Kload   Upgrade to ownclo...
95
  		$jobs = array();
6d9380f96   Cédric Dupont   Update sources OC...
96
97
98
99
100
  		while ($row = $query->fetch()) {
  			$job = $this->buildJob($row);
  			if ($job) {
  				$jobs[] = $job;
  			}
31b7f2792   Kload   Upgrade to ownclo...
101
102
103
104
105
106
107
108
109
110
111
  		}
  		return $jobs;
  	}
  
  	/**
  	 * get the next job in the list
  	 *
  	 * @return Job
  	 */
  	public function getNext() {
  		$lastId = $this->getLastJob();
6d9380f96   Cédric Dupont   Update sources OC...
112
113
114
  		$query = $this->conn->prepare('SELECT `id`, `class`, `last_run`, `argument` FROM `*PREFIX*jobs` WHERE `id` > ? ORDER BY `id` ASC', 1);
  		$query->execute(array($lastId));
  		if ($row = $query->fetch()) {
31b7f2792   Kload   Upgrade to ownclo...
115
116
117
  			return $this->buildJob($row);
  		} else {
  			//begin at the start of the queue
6d9380f96   Cédric Dupont   Update sources OC...
118
119
120
  			$query = $this->conn->prepare('SELECT `id`, `class`, `last_run`, `argument` FROM `*PREFIX*jobs` ORDER BY `id` ASC', 1);
  			$query->execute();
  			if ($row = $query->fetch()) {
31b7f2792   Kload   Upgrade to ownclo...
121
122
123
124
125
126
127
128
129
  				return $this->buildJob($row);
  			} else {
  				return null; //empty job list
  			}
  		}
  	}
  
  	/**
  	 * @param int $id
6d9380f96   Cédric Dupont   Update sources OC...
130
  	 * @return Job|null
31b7f2792   Kload   Upgrade to ownclo...
131
132
  	 */
  	public function getById($id) {
6d9380f96   Cédric Dupont   Update sources OC...
133
134
135
  		$query = $this->conn->prepare('SELECT `id`, `class`, `last_run`, `argument` FROM `*PREFIX*jobs` WHERE `id` = ?');
  		$query->execute(array($id));
  		if ($row = $query->fetch()) {
31b7f2792   Kload   Upgrade to ownclo...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  			return $this->buildJob($row);
  		} else {
  			return null;
  		}
  	}
  
  	/**
  	 * get the job object from a row in the db
  	 *
  	 * @param array $row
  	 * @return Job
  	 */
  	private function buildJob($row) {
  		$class = $row['class'];
  		/**
  		 * @var Job $job
  		 */
6d9380f96   Cédric Dupont   Update sources OC...
153
154
155
156
157
158
159
  		if ($class === 'OC_Cache_FileGlobalGC') {
  			$class = '\OC\Cache\FileGlobalGC';
  		}
  		if (!class_exists($class)) {
  			// job from disabled app or old version of an app, no need to do anything
  			return null;
  		}
31b7f2792   Kload   Upgrade to ownclo...
160
161
162
163
164
165
166
167
168
169
170
171
172
  		$job = new $class();
  		$job->setId($row['id']);
  		$job->setLastRun($row['last_run']);
  		$job->setArgument(json_decode($row['argument'], true));
  		return $job;
  	}
  
  	/**
  	 * set the job that was last ran
  	 *
  	 * @param Job $job
  	 */
  	public function setLastJob($job) {
6d9380f96   Cédric Dupont   Update sources OC...
173
  		$this->config->setAppValue('backgroundjob', 'lastjob', $job->getId());
31b7f2792   Kload   Upgrade to ownclo...
174
175
176
177
178
  	}
  
  	/**
  	 * get the id of the last ran job
  	 *
6d9380f96   Cédric Dupont   Update sources OC...
179
  	 * @return string
31b7f2792   Kload   Upgrade to ownclo...
180
181
  	 */
  	public function getLastJob() {
6d9380f96   Cédric Dupont   Update sources OC...
182
  		return $this->config->getAppValue('backgroundjob', 'lastjob', 0);
31b7f2792   Kload   Upgrade to ownclo...
183
184
185
186
187
188
189
190
  	}
  
  	/**
  	 * set the lastRun of $job to now
  	 *
  	 * @param Job $job
  	 */
  	public function setLastRun($job) {
6d9380f96   Cédric Dupont   Update sources OC...
191
  		$query = $this->conn->prepare('UPDATE `*PREFIX*jobs` SET `last_run` = ? WHERE `id` = ?');
31b7f2792   Kload   Upgrade to ownclo...
192
193
194
  		$query->execute(array(time(), $job->getId()));
  	}
  }