For God so loved the world, that He gave His only begotten Son, that all who believe in Him should not perish but have everlasting life
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
6.3 KiB

  1. <?php
  2. /**
  3. * PHPExcel_CachedObjectStorage_PHPTemp
  4. *
  5. * Copyright (c) 2006 - 2015 PHPExcel
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * @category PHPExcel
  22. * @package PHPExcel_CachedObjectStorage
  23. * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
  24. * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
  25. * @version ##VERSION##, ##DATE##
  26. */
  27. class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache
  28. {
  29. /**
  30. * Name of the file for this cache
  31. *
  32. * @var string
  33. */
  34. private $fileHandle = null;
  35. /**
  36. * Memory limit to use before reverting to file cache
  37. *
  38. * @var integer
  39. */
  40. private $memoryCacheSize = null;
  41. /**
  42. * Store cell data in cache for the current cell object if it's "dirty",
  43. * and the 'nullify' the current cell object
  44. *
  45. * @return void
  46. * @throws PHPExcel_Exception
  47. */
  48. protected function storeData()
  49. {
  50. if ($this->currentCellIsDirty && !empty($this->currentObjectID)) {
  51. $this->currentObject->detach();
  52. fseek($this->fileHandle, 0, SEEK_END);
  53. $this->cellCache[$this->currentObjectID] = array(
  54. 'ptr' => ftell($this->fileHandle),
  55. 'sz' => fwrite($this->fileHandle, serialize($this->currentObject))
  56. );
  57. $this->currentCellIsDirty = false;
  58. }
  59. $this->currentObjectID = $this->currentObject = null;
  60. }
  61. /**
  62. * Add or Update a cell in cache identified by coordinate address
  63. *
  64. * @param string $pCoord Coordinate address of the cell to update
  65. * @param PHPExcel_Cell $cell Cell to update
  66. * @return PHPExcel_Cell
  67. * @throws PHPExcel_Exception
  68. */
  69. public function addCacheData($pCoord, PHPExcel_Cell $cell)
  70. {
  71. if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) {
  72. $this->storeData();
  73. }
  74. $this->currentObjectID = $pCoord;
  75. $this->currentObject = $cell;
  76. $this->currentCellIsDirty = true;
  77. return $cell;
  78. }
  79. /**
  80. * Get cell at a specific coordinate
  81. *
  82. * @param string $pCoord Coordinate of the cell
  83. * @throws PHPExcel_Exception
  84. * @return PHPExcel_Cell Cell that was found, or null if not found
  85. */
  86. public function getCacheData($pCoord)
  87. {
  88. if ($pCoord === $this->currentObjectID) {
  89. return $this->currentObject;
  90. }
  91. $this->storeData();
  92. // Check if the entry that has been requested actually exists
  93. if (!isset($this->cellCache[$pCoord])) {
  94. // Return null if requested entry doesn't exist in cache
  95. return null;
  96. }
  97. // Set current entry to the requested entry
  98. $this->currentObjectID = $pCoord;
  99. fseek($this->fileHandle, $this->cellCache[$pCoord]['ptr']);
  100. $this->currentObject = unserialize(fread($this->fileHandle, $this->cellCache[$pCoord]['sz']));
  101. // Re-attach this as the cell's parent
  102. $this->currentObject->attach($this);
  103. // Return requested entry
  104. return $this->currentObject;
  105. }
  106. /**
  107. * Get a list of all cell addresses currently held in cache
  108. *
  109. * @return string[]
  110. */
  111. public function getCellList()
  112. {
  113. if ($this->currentObjectID !== null) {
  114. $this->storeData();
  115. }
  116. return parent::getCellList();
  117. }
  118. /**
  119. * Clone the cell collection
  120. *
  121. * @param PHPExcel_Worksheet $parent The new worksheet
  122. * @return void
  123. */
  124. public function copyCellCollection(PHPExcel_Worksheet $parent)
  125. {
  126. parent::copyCellCollection($parent);
  127. // Open a new stream for the cell cache data
  128. $newFileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+');
  129. // Copy the existing cell cache data to the new stream
  130. fseek($this->fileHandle, 0);
  131. while (!feof($this->fileHandle)) {
  132. fwrite($newFileHandle, fread($this->fileHandle, 1024));
  133. }
  134. $this->fileHandle = $newFileHandle;
  135. }
  136. /**
  137. * Clear the cell collection and disconnect from our parent
  138. *
  139. * @return void
  140. */
  141. public function unsetWorksheetCells()
  142. {
  143. if (!is_null($this->currentObject)) {
  144. $this->currentObject->detach();
  145. $this->currentObject = $this->currentObjectID = null;
  146. }
  147. $this->cellCache = array();
  148. // detach ourself from the worksheet, so that it can then delete this object successfully
  149. $this->parent = null;
  150. // Close down the php://temp file
  151. $this->__destruct();
  152. }
  153. /**
  154. * Initialise this new cell collection
  155. *
  156. * @param PHPExcel_Worksheet $parent The worksheet for this cell collection
  157. * @param array of mixed $arguments Additional initialisation arguments
  158. */
  159. public function __construct(PHPExcel_Worksheet $parent, $arguments)
  160. {
  161. $this->memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : '1MB';
  162. parent::__construct($parent);
  163. if (is_null($this->fileHandle)) {
  164. $this->fileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+');
  165. }
  166. }
  167. /**
  168. * Destroy this cell collection
  169. */
  170. public function __destruct()
  171. {
  172. if (!is_null($this->fileHandle)) {
  173. fclose($this->fileHandle);
  174. }
  175. $this->fileHandle = null;
  176. }
  177. }