[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/phpexcel/PHPExcel/CachedObjectStorage/ -> Wincache.php (source)

   1  <?php
   2  /**

   3   * PHPExcel

   4   *

   5   * Copyright (c) 2006 - 2014 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 - 2014 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  
  28  
  29  /**

  30   * PHPExcel_CachedObjectStorage_Wincache

  31   *

  32   * @category   PHPExcel

  33   * @package    PHPExcel_CachedObjectStorage

  34   * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)

  35   */
  36  class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache {
  37  
  38      /**

  39       * Prefix used to uniquely identify cache data for this worksheet

  40       *

  41       * @var string

  42       */
  43      private $_cachePrefix = null;
  44  
  45      /**

  46       * Cache timeout

  47       *

  48       * @var integer

  49       */
  50      private $_cacheTime = 600;
  51  
  52  
  53      /**

  54       * Store cell data in cache for the current cell object if it's "dirty",

  55       *     and the 'nullify' the current cell object

  56       *

  57       * @return    void

  58       * @throws    PHPExcel_Exception

  59       */
  60  	protected function _storeData() {
  61          if ($this->_currentCellIsDirty && !empty($this->_currentObjectID)) {
  62              $this->_currentObject->detach();
  63  
  64              $obj = serialize($this->_currentObject);
  65              if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) {
  66                  if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
  67                      $this->__destruct();
  68                      throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
  69                  }
  70              } else {
  71                  if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
  72                      $this->__destruct();
  73                      throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
  74                  }
  75              }
  76              $this->_currentCellIsDirty = false;
  77          }
  78  
  79          $this->_currentObjectID = $this->_currentObject = null;
  80      }    //    function _storeData()

  81  
  82  
  83      /**

  84       * Add or Update a cell in cache identified by coordinate address

  85       *

  86       * @param    string            $pCoord        Coordinate address of the cell to update

  87       * @param    PHPExcel_Cell    $cell        Cell to update

  88       * @return    void

  89       * @throws    PHPExcel_Exception

  90       */
  91  	public function addCacheData($pCoord, PHPExcel_Cell $cell) {
  92          if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) {
  93              $this->_storeData();
  94          }
  95          $this->_cellCache[$pCoord] = true;
  96  
  97          $this->_currentObjectID = $pCoord;
  98          $this->_currentObject = $cell;
  99          $this->_currentCellIsDirty = true;
 100  
 101          return $cell;
 102      }    //    function addCacheData()

 103  
 104  
 105      /**

 106       * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?

 107       *

 108       * @param    string        $pCoord        Coordinate address of the cell to check

 109       * @return    boolean

 110       */
 111  	public function isDataSet($pCoord) {
 112          //    Check if the requested entry is the current object, or exists in the cache

 113          if (parent::isDataSet($pCoord)) {
 114              if ($this->_currentObjectID == $pCoord) {
 115                  return true;
 116              }
 117              //    Check if the requested entry still exists in cache

 118              $success = wincache_ucache_exists($this->_cachePrefix.$pCoord.'.cache');
 119              if ($success === false) {
 120                  //    Entry no longer exists in Wincache, so clear it from the cache array

 121                  parent::deleteCacheData($pCoord);
 122                  throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
 123              }
 124              return true;
 125          }
 126          return false;
 127      }    //    function isDataSet()

 128  
 129  
 130      /**

 131       * Get cell at a specific coordinate

 132       *

 133       * @param    string            $pCoord        Coordinate of the cell

 134       * @throws    PHPExcel_Exception

 135       * @return    PHPExcel_Cell    Cell that was found, or null if not found

 136       */
 137  	public function getCacheData($pCoord) {
 138          if ($pCoord === $this->_currentObjectID) {
 139              return $this->_currentObject;
 140          }
 141          $this->_storeData();
 142  
 143          //    Check if the entry that has been requested actually exists

 144          $obj = null;
 145          if (parent::isDataSet($pCoord)) {
 146              $success = false;
 147              $obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success);
 148              if ($success === false) {
 149                  //    Entry no longer exists in WinCache, so clear it from the cache array

 150                  parent::deleteCacheData($pCoord);
 151                  throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
 152              }
 153          } else {
 154              //    Return null if requested entry doesn't exist in cache

 155              return null;
 156          }
 157  
 158          //    Set current entry to the requested entry

 159          $this->_currentObjectID = $pCoord;
 160          $this->_currentObject = unserialize($obj);
 161          //    Re-attach this as the cell's parent

 162          $this->_currentObject->attach($this);
 163  
 164          //    Return requested entry

 165          return $this->_currentObject;
 166      }    //    function getCacheData()

 167  
 168  
 169      /**

 170       * Get a list of all cell addresses currently held in cache

 171       *

 172       * @return  array of string

 173       */
 174  	public function getCellList() {
 175          if ($this->_currentObjectID !== null) {
 176              $this->_storeData();
 177          }
 178  
 179          return parent::getCellList();
 180      }
 181  
 182  
 183      /**

 184       * Delete a cell in cache identified by coordinate address

 185       *

 186       * @param    string            $pCoord        Coordinate address of the cell to delete

 187       * @throws    PHPExcel_Exception

 188       */
 189  	public function deleteCacheData($pCoord) {
 190          //    Delete the entry from Wincache

 191          wincache_ucache_delete($this->_cachePrefix.$pCoord.'.cache');
 192  
 193          //    Delete the entry from our cell address array

 194          parent::deleteCacheData($pCoord);
 195      }    //    function deleteCacheData()

 196  
 197  
 198      /**

 199       * Clone the cell collection

 200       *

 201       * @param    PHPExcel_Worksheet    $parent        The new worksheet

 202       * @return    void

 203       */
 204  	public function copyCellCollection(PHPExcel_Worksheet $parent) {
 205          parent::copyCellCollection($parent);
 206          //    Get a new id for the new file name

 207          $baseUnique = $this->_getUniqueID();
 208          $newCachePrefix = substr(md5($baseUnique),0,8).'.';
 209          $cacheList = $this->getCellList();
 210          foreach($cacheList as $cellID) {
 211              if ($cellID != $this->_currentObjectID) {
 212                  $success = false;
 213                  $obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success);
 214                  if ($success === false) {
 215                      //    Entry no longer exists in WinCache, so clear it from the cache array

 216                      parent::deleteCacheData($cellID);
 217                      throw new PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache');
 218                  }
 219                  if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) {
 220                      $this->__destruct();
 221                      throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache');
 222                  }
 223              }
 224          }
 225          $this->_cachePrefix = $newCachePrefix;
 226      }    //    function copyCellCollection()

 227  
 228  
 229      /**

 230       * Clear the cell collection and disconnect from our parent

 231       *

 232       * @return    void

 233       */
 234  	public function unsetWorksheetCells() {
 235          if(!is_null($this->_currentObject)) {
 236              $this->_currentObject->detach();
 237              $this->_currentObject = $this->_currentObjectID = null;
 238          }
 239  
 240          //    Flush the WinCache cache

 241          $this->__destruct();
 242  
 243          $this->_cellCache = array();
 244  
 245          //    detach ourself from the worksheet, so that it can then delete this object successfully

 246          $this->_parent = null;
 247      }    //    function unsetWorksheetCells()

 248  
 249  
 250      /**

 251       * Initialise this new cell collection

 252       *

 253       * @param    PHPExcel_Worksheet    $parent        The worksheet for this cell collection

 254       * @param    array of mixed        $arguments    Additional initialisation arguments

 255       */
 256  	public function __construct(PHPExcel_Worksheet $parent, $arguments) {
 257          $cacheTime    = (isset($arguments['cacheTime']))    ? $arguments['cacheTime']    : 600;
 258  
 259          if (is_null($this->_cachePrefix)) {
 260              $baseUnique = $this->_getUniqueID();
 261              $this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
 262              $this->_cacheTime = $cacheTime;
 263  
 264              parent::__construct($parent);
 265          }
 266      }    //    function __construct()

 267  
 268  
 269      /**

 270       * Destroy this cell collection

 271       */
 272  	public function __destruct() {
 273          $cacheList = $this->getCellList();
 274          foreach($cacheList as $cellID) {
 275              wincache_ucache_delete($this->_cachePrefix.$cellID.'.cache');
 276          }
 277      }    //    function __destruct()

 278  
 279  
 280      /**

 281       * Identify whether the caching method is currently available

 282       * Some methods are dependent on the availability of certain extensions being enabled in the PHP build

 283       *

 284       * @return    boolean

 285       */
 286  	public static function cacheMethodIsAvailable() {
 287          if (!function_exists('wincache_ucache_add')) {
 288              return false;
 289          }
 290  
 291          return true;
 292      }
 293  
 294  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1