ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilWikiUserHTMLExport.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (c) 1998-2014 ILIAS open source, Extended GPL, see docs/LICENSE */
4
13{
14 const PROCESS_OTHER_USER = 0; // another user has started a running export
15 const PROCESS_STARTED = 1; // export has been started by current user
16 const PROCESS_UPTODATE = 2; // no export necessary, current export is up-to-date
17
18
19 const NOT_RUNNING = 0;
20 const RUNNING = 1;
21
22 protected $data;
23
27 protected $db;
28
32 protected $wiki;
33
37 protected $user;
38
42 protected $log;
43
50 public function __construct(ilObjWiki $a_wiki, ilDBInterface $a_db, ilObjUser $a_user)
51 {
52 $this->db = $a_db;
53 $this->wiki = $a_wiki;
54 $this->user = $a_user;
55 $this->read();
56 $this->log = ilLoggerFactory::getLogger('wiki');
57 }
58
65 protected function read()
66 {
67 $set = $this->db->query(
68 "SELECT * FROM wiki_user_html_export " .
69 " WHERE wiki_id = " . $this->db->quote($this->wiki->getId(), "integer")
70 );
71 if (!$this->data = $this->db->fetchAssoc($set)) {
72 $this->data = array();
73 }
74 }
75
82 protected function getProcess()
83 {
84 $this->log->debug("getProcess");
85 $last_change = ilPageObject::getLastChangeByParent("wpg", $this->wiki->getId());
86
87 $ilAtomQuery = $this->db->buildAtomQuery();
88 $ilAtomQuery->addTableLock('wiki_user_html_export');
89
90 $ilAtomQuery->addQueryCallable(function (ilDBInterface $ilDB) use ($last_change, &$ret) {
91 $this->log->debug("atom query start");
92
93 $this->read();
94 $ts = ilUtil::now();
95
96 if ($this->data["start_ts"] != "" &&
97 $this->data["start_ts"] > $last_change) {
99 $this->log->debug("return: " . self::PROCESS_UPTODATE);
100 return;
101 }
102
103 if (!isset($this->data["wiki_id"])) {
104 $this->log->debug("insert, wiki id: " . $this->wiki->getId() . ", user id: " . $this->user->getId() . ", ts: " . $ts);
105 $ilDB->manipulate("INSERT INTO wiki_user_html_export " .
106 "(wiki_id, usr_id, progress, start_ts, status) VALUES (" .
107 $ilDB->quote($this->wiki->getId(), "integer") . "," .
108 $ilDB->quote($this->user->getId(), "integer") . "," .
109 $ilDB->quote(0, "integer") . "," .
110 $ilDB->quote($ts, "timestamp") . "," .
111 $ilDB->quote(self::RUNNING, "integer") .
112 ")");
113 } else {
114 $this->log->debug("update, wiki id: " . $this->wiki->getId() . ", user id: " . $this->user->getId() . ", ts: " . $ts);
115 $ilDB->manipulate(
116 "UPDATE wiki_user_html_export SET " .
117 " start_ts = " . $ilDB->quote($ts, "timestamp") . "," .
118 " usr_id = " . $ilDB->quote($this->user->getId(), "integer") . "," .
119 " progress = " . $ilDB->quote(0, "integer") . "," .
120 " status = " . $ilDB->quote(self::RUNNING, "integer") .
121 " WHERE status = " . $ilDB->quote(self::NOT_RUNNING, "integer") .
122 " AND wiki_id = " . $ilDB->quote($this->wiki->getId(), "integer")
123 );
124 $this->read();
125 }
126
127 if ($this->data["start_ts"] == $ts && $this->data["usr_id"] == $this->user->getId()) {
128 // we started the process
130 $this->log->debug("return: " . self::PROCESS_STARTED);
131 return;
132 }
133
134 // process was already running
136 $this->log->debug("return: " . self::PROCESS_OTHER_USER);
137 });
138
139 $ilAtomQuery->run();
140
141 $this->log->debug("outer return: " . $ret);
142
143 return $ret;
144 }
145
152 public function updateStatus($a_progress, $a_status)
153 {
154 $this->db->manipulate(
155 "UPDATE wiki_user_html_export SET " .
156 " progress = " . $this->db->quote((int) $a_progress, "integer") . "," .
157 " status = " . $this->db->quote((int) $a_status, "integer") .
158 " WHERE wiki_id = " . $this->db->quote($this->wiki->getId(), "integer") .
159 " AND usr_id = " . $this->db->quote($this->user->getId(), "integer")
160 );
161
162 $this->read();
163 }
164
171 public function getProgress()
172 {
173 $set = $this->db->query(
174 "SELECT progress, status FROM wiki_user_html_export " .
175 " WHERE wiki_id = " . $this->db->quote($this->wiki->getId(), "integer")
176 );
177 $rec = $this->db->fetchAssoc($set);
178
179 return array("progress" => (int) $rec["progress"], "status" => (int) $rec["status"]);
180 }
181
182
189 public function initUserHTMLExport()
190 {
191 // get process, if not already running or export is up-to-date, return corresponding status
192 echo $this->getProcess();
193 exit;
194 }
195
199 public function startUserHTMLExport()
200 {
201 ignore_user_abort(true);
202 // do the export
203 include_once("./Modules/Wiki/classes/class.ilWikiHTMLExport.php");
204 $exp = new ilWikiHTMLExport($this->wiki);
205 $exp->setMode(ilWikiHTMLExport::MODE_USER);
206 $exp->buildExportFile();
207 // reset user export status
208 $this->updateStatus(100, self::NOT_RUNNING);
209 exit;
210 }
211
215 public function deliverFile()
216 {
217 $this->log->debug("deliver");
218 include_once("./Modules/Wiki/classes/class.ilWikiHTMLExport.php");
219 $exp = new ilWikiHTMLExport($this->wiki);
220 $exp->setMode(ilWikiHTMLExport::MODE_USER);
221 $file = $exp->getUserExportFile();
222 $this->log->debug("file: " . $file);
223 ilUtil::deliverFile($file, pathinfo($file, PATHINFO_BASENAME));
224 }
225}
user()
Definition: user.php:4
exit
Definition: backend.php:16
An exception for terminatinating execution or to throw for unit testing.
static getLogger($a_component_id)
Get component logger.
Class ilObjWiki.
static getLastChangeByParent($a_parent_type, $a_parent_id, $a_lang="")
Get all pages for parent object.
static now()
Return current timestamp in Y-m-d H:i:s format.
static deliverFile( $a_file, $a_filename, $a_mime='', $isInline=false, $removeAfterDelivery=false, $a_exit_after=true)
deliver file for download via browser.
Wiki HTML exporter class.
Class manages user html export.
updateStatus($a_progress, $a_status)
Update status.
startUserHTMLExport()
Start user html export.
__construct(ilObjWiki $a_wiki, ilDBInterface $a_db, ilObjUser $a_user)
Construct.
initUserHTMLExport()
Init user html export.
Interface ilDBInterface.
$ret
Definition: parser.php:6
global $ilDB
$this data['403_header']