Merge branch '2.0'
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / system / worker / StatDailyRebuildDataWorker.class.php
1 <?php
2 namespace wcf\system\worker;
3 use wcf\data\object\type\ObjectTypeCache;
4 use wcf\system\event\EventHandler;
5 use wcf\system\WCF;
6 use wcf\util\DateUtil;
7
8 /**
9 * Worker implementation for updating daily statistics.
10 *
11 * @author Marcel Werk
12 * @copyright 2001-2014 WoltLab GmbH
13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14 * @package com.woltlab.wcf
15 * @subpackage system.worker
16 * @category Community Framework
17 */
18 class StatDailyRebuildDataWorker extends AbstractRebuildDataWorker {
19 /**
20 * @see \wcf\system\worker\AbstractRebuildDataWorker::$objectListClassName
21 */
22 protected $objectListClassName = 'wcf\data\attachment\AttachmentList';
23
24 /**
25 * @see \wcf\system\worker\AbstractWorker::$limit
26 */
27 protected $limit = 30;
28
29 /**
30 * start timestamp
31 * @var integer
32 */
33 protected $startDate = 0;
34
35 /**
36 * @see \wcf\system\worker\AbstractRebuildDataWorker::initObjectList()
37 */
38 protected function initObjectList() {}
39
40 /**
41 * @see \wcf\system\worker\IWorker::countObjects()
42 */
43 public function countObjects() {
44 $this->getStartDate();
45
46 $this->count = ceil((TIME_NOW - $this->startDate) / 86400);
47 }
48
49 /**
50 * @see \wcf\system\worker\IWorker::execute()
51 */
52 public function execute() {
53 EventHandler::getInstance()->fireAction($this, 'execute');
54
55 if (!$this->loopCount) {
56 // delete existing stat
57 $sql = "DELETE FROM wcf".WCF_N."_stat_daily";
58 $statement = WCF::getDB()->prepareStatement($sql);
59 $statement->execute();
60 }
61
62 // prepare insert statement
63 $sql = "INSERT IGNORE INTO wcf".WCF_N."_stat_daily
64 (objectTypeID, date, counter, total)
65 VALUES (?, ?, ?, ?)";
66 $statement = WCF::getDB()->prepareStatement($sql);
67
68 $this->getStartDate();
69 $d = DateUtil::getDateTimeByTimestamp($this->startDate);
70 $d->setTimezone(new \DateTimeZone(TIMEZONE));
71 $d->setTime(0, 0);
72 if ($this->loopCount) {
73 $d->add(new \DateInterval('P'.($this->loopCount * $this->limit).'D'));
74 }
75 for ($i = 0; $i < $this->limit; $i++) {
76 // get object types
77 foreach (ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.statDailyHandler') as $objectType) {
78 $data = $objectType->getProcessor()->getData($d->getTimestamp());
79 $statement->execute(array($objectType->objectTypeID, $d->format('Y-m-d'), $data['counter'], $data['total']));
80 }
81
82 $d->add(new \DateInterval('P1D'));
83 }
84 }
85
86 /**
87 * Gets the start timestamp.
88 *
89 * @return integer
90 */
91 protected function getStartDate() {
92 if ($this->startDate) return;
93 $sql = "SELECT MIN(registrationDate)
94 FROM wcf".WCF_N."_user";
95 $statement = WCF::getDB()->prepareStatement($sql);
96 $statement->execute();
97 $this->startDate = $statement->fetchColumn();
98 }
99 }