joomla-platform / libraries / joomla / cache / storage / cachelite.php

<?php
/**
 * @package     Joomla.Platform
 * @subpackage  Cache
 *
 * @copyright   Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_PLATFORM') or die;

/**
 * Cache litestorage handler
 *
 * @package     Joomla.Platform
 * @subpackage  Cache
 * @since       11.1
 */
class JCacheStorageCachelite extends JCacheStorage
{
    /**
     * @since   11.1
     */
    private static $CacheLiteInstance = null;

    /**
     * @since   11.1
     */
    private $_root;

    /**
     * Constructor
     *
     * @param array $options optional parameters
     * @since   11.1
     */
    public function __construct($options = array())
    {
        parent::__construct($options);

        $this->_root    = $options['cachebase'];

        $cloptions = array(
            'cacheDir'                  => $this->_root.DS,
            'lifeTime'                  => $this->_lifetime,
            'fileLocking'               => $this->_locking,
            'automaticCleaningFactor'   => isset($options['autoclean']) ? $options['autoclean'] : 200,
            'fileNameProtection'        => false,
            'hashedDirectoryLevel'      => 0,
            'caching'                   => $options['caching']
        );

        if (self::$CacheLiteInstance === null) {
            $this->initCache($cloptions);
        }
    }

    /**
     * Instantiates the appropriate CacheLite object.
     * Only initializes the engine if it does not already exist.
     * Note this is a private method
     * @param array $options optional parameters
     * @since       11.1
     */
    private function initCache($cloptions)
    {
        require_once 'Cache/Lite.php';
        self::$CacheLiteInstance = new Cache_Lite($cloptions);
        return self::$CacheLiteInstance;
    }

    /**
     * Get cached data from a file by id and group
     *
     * @param   string  $id         The cache data id
     * @param   string  $group      The cache data group
     * @param   boolean $checkTime  True to verify cache time expiration threshold
     * @return  mixed   Boolean false on failure or a cached data string
     * @since   11.1
     */
    public function get($id, $group, $checkTime = true)
    {
        $data = false;
        self::$CacheLiteInstance->setOption('cacheDir', $this->_root.DS.$group.DS);
        $this->_getCacheId($id, $group);
        $data = self::$CacheLiteInstance->get($this->rawname, $group);
        return $data;
    }


    /**
     * Get all cached data
     *
     * @return  array data
     * @since   11.1
     */

    public function getAll()
    {
        parent::getAll();

        $path = $this->_root;
        jimport('joomla.filesystem.folder');
        $folders = JFolder::folders($path);
        $data = array();

        foreach ($folders as $folder) {
            $files = JFolder::files($path.DS.$folder);
            $item = new JCacheStorageHelper($folder);

            foreach ($files as $file) {
                $item->updateSize(filesize($path.DS.$folder.DS.$file)/1024);
            }
            $data[$folder] = $item;
        }

        return $data;
    }

    /**
     * Store the data to a file by id and group
     *
     * @param   string  $id     The cache data id
     * @param   string  $group  The cache data group
     * @param   string  $data   The data to store in cache
     * @return  boolean True on success, false otherwise
     * @since   11.1
     */
    public function store($id, $group, $data)
    {
        $dir = $this->_root.DS.$group;

        // If the folder doesn't exist try to create it
        if (!is_dir($dir)) {

            // Make sure the index file is there
            $indexFile = $dir.'/index.html';
            @mkdir($dir) && file_put_contents($indexFile, '<html><body bgcolor="#FFFFFF"></body></html>');
        }

        // Make sure the folder exists
        if (!is_dir($dir)) {
            return false;
        }

        self::$CacheLiteInstance->setOption('cacheDir', $this->_root.DS.$group.DS);
        $this->_getCacheId($id, $group);
        $sucess = self::$CacheLiteInstance->save($data, $this->rawname, $group);
        if ($sucess == true) {
            return $sucess;
        } else {
            return false;
        }
    }

    /**
     * Remove a cached data file by id and group
     *
     * @param   string  $id     The cache data id
     * @param   string  $group  The cache data group
     * @return  boolean True on success, false otherwise
     * @since   11.1
     */
    public function remove($id, $group)
    {
        self::$CacheLiteInstance->setOption('cacheDir', $this->_root.DS.$group.DS);
        $this->_getCacheId($id, $group);
        $sucess = self::$CacheLiteInstance->remove($this->rawname, $group);
        if ($sucess == true) {
            return $sucess;
        } else {
            return false;
        }
    }

    /**
     * Clean cache for a group given a mode.
     *
     * group mode       : cleans all cache in the group
     * notgroup mode    : cleans all cache not in the group
     *
     * @param   string  $group  The cache data group
     * @param   string  $mode   The mode for cleaning cache [group|notgroup]
     * @return  boolean True on success, false otherwise
     * @since   11.1
     */
    public function clean($group, $mode = null)
    {
        jimport('joomla.filesystem.folder');

        if (trim($group) == '') {
            $clmode = 'notgroup';
        }

        if ($mode == null) {
            $clmode = 'group';
        }

        switch ($mode) {
            case 'notgroup':
                $clmode = 'notingroup';
                $sucess = self::$CacheLiteInstance->clean($group, $clmode);
                break;
            case 'group':
                $clmode = $group;
                self::$CacheLiteInstance->setOption('cacheDir', $this->_root.DS.$group.DS);
                $sucess = self::$CacheLiteInstance->clean($group, $clmode);
                if (is_dir($this->_root.DS.$group)) {
                    $return = JFolder::delete($this->_root.DS.$group);
                }
                break;
            default:
                $clmode = $group;
                self::$CacheLiteInstance->setOption('cacheDir', $this->_root.DS.$group.DS);
                $sucess = self::$CacheLiteInstance->clean($group, $clmode);
                break;
        }

        if ($sucess == true)  {
            return $sucess;
        } else {
            return false;
        }
    }

    /**
     * Garbage collect expired cache data
     *
     * @return boolean  True on success, false otherwise.
     * @since   11.1
     */
    public function gc()
    {
        $result = true;
        self::$CacheLiteInstance->setOption('automaticCleaningFactor', 1);
        self::$CacheLiteInstance->setOption('hashedDirectoryLevel', 1);
        $test       = self::$CacheLiteInstance;
        $sucess1    = self::$CacheLiteInstance->_cleanDir($this->_root.DS, false, 'old');

        if (!($dh = opendir($this->_root.DS))) {
            return false;
        }

        while ($file = readdir($dh)) {
            if (($file != '.') && ($file != '..') && ($file != '.svn')) {
                $file2 = $this->_root.DS.$file;
                if (is_dir($file2)) {
                    $result = ($result and (self::$CacheLiteInstance->_cleanDir($file2.DS, false, 'old')));
                }
            }
        }
        $sucess = ($sucess1 && $result);

        return $sucess;
    }

    /**
     * Test to see if the cache storage is available.
     *
     * @return  boolean True on success, false otherwise.
     * @since   11.1
     */
    public static function test()
    {
            @include_once 'Cache/Lite.php';
            if (class_exists('Cache_Lite')) {
                return true;
            } else {
                return false;
            }
    }
}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.