From 86d2a5291feba9cc814485d1ec1fe301bf715732 Mon Sep 17 00:00:00 2001 From: Mark Baker Date: Mon, 5 Dec 2011 23:41:49 +0000 Subject: [PATCH] Feature - initial version of Igbinary (serialized) cell caching git-svn-id: https://phpexcel.svn.codeplex.com/svn/trunk@83656 2327b42d-5241-43d6-9e2a-de5ac946f064 --- .../PHPExcel/CachedObjectStorage/Igbinary.php | 111 ++++++++++++++++++ .../PHPExcel/CachedObjectStorageFactory.php | 9 ++ 2 files changed, 120 insertions(+) create mode 100644 Classes/PHPExcel/CachedObjectStorage/Igbinary.php diff --git a/Classes/PHPExcel/CachedObjectStorage/Igbinary.php b/Classes/PHPExcel/CachedObjectStorage/Igbinary.php new file mode 100644 index 00000000..1c6ba312 --- /dev/null +++ b/Classes/PHPExcel/CachedObjectStorage/Igbinary.php @@ -0,0 +1,111 @@ +_currentCellIsDirty) { + $this->_currentObject->detach(); + + $this->_cellCache[$this->_currentObjectID] = igbinary_serialize($this->_currentObject); + $this->_currentCellIsDirty = false; + } + $this->_currentObjectID = $this->_currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return void + * @throws Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) { + if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) { + $this->_storeData(); + } + + $this->_currentObjectID = $pCoord; + $this->_currentObject = $cell; + $this->_currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) { + if ($pCoord === $this->_currentObjectID) { + return $this->_currentObject; + } + $this->_storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->_cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->_currentObjectID = $pCoord; + $this->_currentObject = igbinary_unserialize($this->_cellCache[$pCoord]); + // Re-attach the parent worksheet + $this->_currentObject->attach($this->_parent); + + // Return requested entry + return $this->_currentObject; + } // function getCacheData() + + + public function unsetWorksheetCells() { + if(!is_null($this->_currentObject)) { + $this->_currentObject->detach(); + $this->_currentObject = $this->_currentObjectID = null; + } + $this->_cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->_parent = null; + } // function unsetWorksheetCells() + +} diff --git a/Classes/PHPExcel/CachedObjectStorageFactory.php b/Classes/PHPExcel/CachedObjectStorageFactory.php index d6e39b02..b6f53995 100644 --- a/Classes/PHPExcel/CachedObjectStorageFactory.php +++ b/Classes/PHPExcel/CachedObjectStorageFactory.php @@ -4,6 +4,7 @@ class PHPExcel_CachedObjectStorageFactory { const cache_in_memory = 'Memory'; const cache_in_memory_gzip = 'MemoryGZip'; const cache_in_memory_serialized = 'MemorySerialized'; + const cache_igbinary = 'Igbinary'; const cache_to_discISAM = 'DiscISAM'; const cache_to_apc = 'APC'; const cache_to_memcache = 'Memcache'; @@ -22,6 +23,7 @@ class PHPExcel_CachedObjectStorageFactory { self::cache_in_memory, self::cache_in_memory_gzip, self::cache_in_memory_serialized, + self::cache_igbinary, self::cache_to_phpTemp, self::cache_to_discISAM, self::cache_to_apc, @@ -39,6 +41,8 @@ class PHPExcel_CachedObjectStorageFactory { ), self::cache_in_memory_serialized => array( ), + self::cache_igbinary => array( + ), self::cache_to_phpTemp => array( 'memoryCacheSize' => '1MB' ), self::cache_to_discISAM => array( 'dir' => NULL @@ -116,6 +120,11 @@ class PHPExcel_CachedObjectStorageFactory { return false; } break; + case self::cache_igbinary : + if (!function_exists('igbinary_serialize')) { + return false; + } + break; } self::$_storageMethodParameters[$method] = self::$_storageMethodDefaultParameters[$method];