ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
SQLite3.php
Go to the documentation of this file.
1<?php
37
43 private $_TableName = null;
44
50 private $_DBHandle = null;
51
58
65
72
79
87 protected function _storeData() {
88 if ($this->_currentCellIsDirty && !empty($this->_currentObjectID)) {
89 $this->_currentObject->detach();
90
91 $this->_insertQuery->bindValue('id',$this->_currentObjectID,SQLITE3_TEXT);
92 $this->_insertQuery->bindValue('data',serialize($this->_currentObject),SQLITE3_BLOB);
93 $result = $this->_insertQuery->execute();
94 if ($result === false)
95 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
96 $this->_currentCellIsDirty = false;
97 }
98 $this->_currentObjectID = $this->_currentObject = null;
99 } // function _storeData()
100
101
110 public function addCacheData($pCoord, PHPExcel_Cell $cell) {
111 if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) {
112 $this->_storeData();
113 }
114
115 $this->_currentObjectID = $pCoord;
116 $this->_currentObject = $cell;
117 $this->_currentCellIsDirty = true;
118
119 return $cell;
120 } // function addCacheData()
121
122
130 public function getCacheData($pCoord) {
131 if ($pCoord === $this->_currentObjectID) {
133 }
134 $this->_storeData();
135
136 $this->_selectQuery->bindValue('id',$pCoord,SQLITE3_TEXT);
137 $cellResult = $this->_selectQuery->execute();
138 if ($cellResult === FALSE) {
139 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
140 }
141 $cellData = $cellResult->fetchArray(SQLITE3_ASSOC);
142 if ($cellData === FALSE) {
143 // Return null if requested entry doesn't exist in cache
144 return NULL;
145 }
146
147 // Set current entry to the requested entry
148 $this->_currentObjectID = $pCoord;
149
150 $this->_currentObject = unserialize($cellData['value']);
151 // Re-attach this as the cell's parent
152 $this->_currentObject->attach($this);
153
154 // Return requested entry
156 } // function getCacheData()
157
158
165 public function isDataSet($pCoord) {
166 if ($pCoord === $this->_currentObjectID) {
167 return TRUE;
168 }
169
170 // Check if the requested entry exists in the cache
171 $this->_selectQuery->bindValue('id',$pCoord,SQLITE3_TEXT);
172 $cellResult = $this->_selectQuery->execute();
173 if ($cellResult === FALSE) {
174 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
175 }
176 $cellData = $cellResult->fetchArray(SQLITE3_ASSOC);
177
178 return ($cellData === FALSE) ? FALSE : TRUE;
179 } // function isDataSet()
180
181
188 public function deleteCacheData($pCoord) {
189 if ($pCoord === $this->_currentObjectID) {
190 $this->_currentObject->detach();
191 $this->_currentObjectID = $this->_currentObject = NULL;
192 }
193
194 // Check if the requested entry exists in the cache
195 $this->_deleteQuery->bindValue('id',$pCoord,SQLITE3_TEXT);
196 $result = $this->_deleteQuery->execute();
197 if ($result === FALSE)
198 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
199
200 $this->_currentCellIsDirty = FALSE;
201 } // function deleteCacheData()
202
203
211 public function moveCell($fromAddress, $toAddress) {
212 if ($fromAddress === $this->_currentObjectID) {
213 $this->_currentObjectID = $toAddress;
214 }
215
216 $this->_deleteQuery->bindValue('id',$toAddress,SQLITE3_TEXT);
217 $result = $this->_deleteQuery->execute();
218 if ($result === false)
219 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
220
221 $this->_updateQuery->bindValue('toid',$toAddress,SQLITE3_TEXT);
222 $this->_updateQuery->bindValue('fromid',$fromAddress,SQLITE3_TEXT);
223 $result = $this->_updateQuery->execute();
224 if ($result === false)
225 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
226
227 return TRUE;
228 } // function moveCell()
229
230
236 public function getCellList() {
237 if ($this->_currentObjectID !== null) {
238 $this->_storeData();
239 }
240
241 $query = "SELECT id FROM kvp_".$this->_TableName;
242 $cellIdsResult = $this->_DBHandle->query($query);
243 if ($cellIdsResult === false)
244 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
245
246 $cellKeys = array();
247 while ($row = $cellIdsResult->fetchArray(SQLITE3_ASSOC)) {
248 $cellKeys[] = $row['id'];
249 }
250
251 return $cellKeys;
252 } // function getCellList()
253
254
261 public function copyCellCollection(PHPExcel_Worksheet $parent) {
263 $this->_storeData();
264
265 // Get a new id for the new table name
266 $tableName = str_replace('.','_',$this->_getUniqueID());
267 if (!$this->_DBHandle->exec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)
268 AS SELECT * FROM kvp_'.$this->_TableName))
269 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
270
271 // Copy the existing cell cache file
272 $this->_TableName = $tableName;
273 } // function copyCellCollection()
274
275
281 public function unsetWorksheetCells() {
282 if(!is_null($this->_currentObject)) {
283 $this->_currentObject->detach();
284 $this->_currentObject = $this->_currentObjectID = null;
285 }
286 // detach ourself from the worksheet, so that it can then delete this object successfully
287 $this->_parent = null;
288
289 // Close down the temporary cache file
290 $this->__destruct();
291 } // function unsetWorksheetCells()
292
293
299 public function __construct(PHPExcel_Worksheet $parent) {
300 parent::__construct($parent);
301 if (is_null($this->_DBHandle)) {
302 $this->_TableName = str_replace('.','_',$this->_getUniqueID());
303 $_DBName = ':memory:';
304
305 $this->_DBHandle = new SQLite3($_DBName);
306 if ($this->_DBHandle === false)
307 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
308 if (!$this->_DBHandle->exec('CREATE TABLE kvp_'.$this->_TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)'))
309 throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
310 }
311
312 $this->_selectQuery = $this->_DBHandle->prepare("SELECT value FROM kvp_".$this->_TableName." WHERE id = :id");
313 $this->_insertQuery = $this->_DBHandle->prepare("INSERT OR REPLACE INTO kvp_".$this->_TableName." VALUES(:id,:data)");
314 $this->_updateQuery = $this->_DBHandle->prepare("UPDATE kvp_".$this->_TableName." SET id=:toId WHERE id=:fromId");
315 $this->_deleteQuery = $this->_DBHandle->prepare("DELETE FROM kvp_".$this->_TableName." WHERE id = :id");
316 } // function __construct()
317
318
322 public function __destruct() {
323 if (!is_null($this->_DBHandle)) {
324 $this->_DBHandle->exec('DROP TABLE kvp_'.$this->_TableName);
325 $this->_DBHandle->close();
326 }
327 $this->_DBHandle = null;
328 } // function __destruct()
329
330
337 public static function cacheMethodIsAvailable() {
338 if (!class_exists('SQLite3',FALSE)) {
339 return false;
340 }
341
342 return true;
343 }
344
345}
$result
An exception for terminatinating execution or to throw for unit testing.
_getUniqueID()
Generate a unique ID for cache referencing.
Definition: CacheBase.php:311
static cacheMethodIsAvailable()
Identify whether the caching method is currently available Some methods are dependent on the availabi...
Definition: SQLite3.php:337
__construct(PHPExcel_Worksheet $parent)
Initialise this new cell collection.
Definition: SQLite3.php:299
_storeData()
Store cell data in cache for the current cell object if it's "dirty", and the 'nullify' the current c...
Definition: SQLite3.php:87
moveCell($fromAddress, $toAddress)
Move a cell object from one address to another.
Definition: SQLite3.php:211
deleteCacheData($pCoord)
Delete a cell in cache identified by coordinate address.
Definition: SQLite3.php:188
addCacheData($pCoord, PHPExcel_Cell $cell)
Add or Update a cell in cache identified by coordinate address.
Definition: SQLite3.php:110
__destruct()
Destroy this cell collection.
Definition: SQLite3.php:322
getCellList()
Get a list of all cell addresses currently held in cache.
Definition: SQLite3.php:236
getCacheData($pCoord)
Get cell at a specific coordinate.
Definition: SQLite3.php:130
unsetWorksheetCells()
Clear the cell collection and disconnect from our parent.
Definition: SQLite3.php:281
copyCellCollection(PHPExcel_Worksheet $parent)
Clone the cell collection.
Definition: SQLite3.php:261