Seditio Source
Root |
./othercms/phpBB3/phpbb/cache/driver/base.php
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

namespace phpbb\cache\driver;

abstract class
base implements \phpbb\cache\driver\driver_interface
{
    var
$vars = array();
    var
$is_modified = false;

    var
$sql_rowset = array();
    var
$sql_row_pointer = array();
    var
$cache_dir = '';

   
/**
    * {@inheritDoc}
    */
   
function purge()
    {
       
// Purge all phpbb cache files
       
try
        {
           
$iterator = new \DirectoryIterator($this->cache_dir);
        }
        catch (\
Exception $e)
        {
            return;
        }

        foreach (
$iterator as $fileInfo)
        {
            if (
$fileInfo->isDot())
            {
                continue;
            }
           
$filename = $fileInfo->getFilename();
            if (
$fileInfo->isDir())
            {
               
$this->remove_dir($fileInfo->getPathname());
            }
            else if (
strpos($filename, 'container_') === 0 ||
               
strpos($filename, 'autoload_') === 0 ||
               
strpos($filename, 'url_matcher') === 0 ||
               
strpos($filename, 'url_generator') === 0 ||
               
strpos($filename, 'sql_') === 0 ||
               
strpos($filename, 'data_') === 0)
            {
               
$this->remove_file($fileInfo->getPathname());
            }
        }

        unset(
$this->vars);
        unset(
$this->sql_rowset);
        unset(
$this->sql_row_pointer);

        if (
function_exists('opcache_reset'))
        {
            @
opcache_reset();
        }

       
$this->vars = array();
       
$this->sql_rowset = array();
       
$this->sql_row_pointer = array();

       
$this->is_modified = false;
    }

   
/**
    * {@inheritDoc}
    */
   
function unload()
    {
       
$this->save();
        unset(
$this->vars);
        unset(
$this->sql_rowset);
        unset(
$this->sql_row_pointer);

       
$this->vars = array();
       
$this->sql_rowset = array();
       
$this->sql_row_pointer = array();
    }

   
/**
    * {@inheritDoc}
    */
   
function sql_load($query)
    {
       
// Remove extra spaces and tabs
       
$query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
       
$query_id = md5($query);

        if ((
$result = $this->_read('sql_' . $query_id)) === false)
        {
            return
false;
        }

       
$this->sql_rowset[$query_id] = $result;
       
$this->sql_row_pointer[$query_id] = 0;

        return
$query_id;
    }

   
/**
    * {@inheritDoc}
    */
   
function sql_exists($query_id)
    {
        return isset(
$this->sql_rowset[$query_id]);
    }

   
/**
    * {@inheritDoc}
    */
   
function sql_fetchrow($query_id)
    {
        if (
$this->sql_row_pointer[$query_id] < count($this->sql_rowset[$query_id]))
        {
            return
$this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]++];
        }

        return
false;
    }

   
/**
    * {@inheritDoc}
    */
   
function sql_fetchfield($query_id, $field)
    {
        if (
$this->sql_row_pointer[$query_id] < count($this->sql_rowset[$query_id]))
        {
            return (isset(
$this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]][$field])) ? $this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]++][$field] : false;
        }

        return
false;
    }

   
/**
    * {@inheritDoc}
    */
   
function sql_rowseek($rownum, $query_id)
    {
        if (
$rownum >= count($this->sql_rowset[$query_id]))
        {
            return
false;
        }

       
$this->sql_row_pointer[$query_id] = $rownum;
        return
true;
    }

   
/**
    * {@inheritDoc}
    */
   
function sql_freeresult($query_id)
    {
        if (!isset(
$this->sql_rowset[$query_id]))
        {
            return
false;
        }

        unset(
$this->sql_rowset[$query_id]);
        unset(
$this->sql_row_pointer[$query_id]);

        return
true;
    }

   
/**
    * Removes/unlinks file
    *
    * @param string $filename Filename to remove
    * @param bool $check Check file permissions
    * @return bool True if the file was successfully removed, otherwise false
    */
   
function remove_file($filename, $check = false)
    {
        global
$phpbb_filesystem;

        if (
$check && !$phpbb_filesystem->is_writable($this->cache_dir))
        {
           
// E_USER_ERROR - not using language entry - intended.
           
trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR);
        }

        return @
unlink($filename);
    }

   
/**
    * Remove directory
    *
    * @param string $dir Directory to remove
    *
    * @return null
    */
   
protected function remove_dir($dir)
    {
        try
        {
           
$iterator = new \DirectoryIterator($dir);
        }
        catch (\
Exception $e)
        {
            return;
        }

        foreach (
$iterator as $fileInfo)
        {
            if (
$fileInfo->isDot())
            {
                continue;
            }

            if (
$fileInfo->isDir())
            {
               
$this->remove_dir($fileInfo->getPathname());
            }
            else
            {
               
$this->remove_file($fileInfo->getPathname());
            }
        }

        @
rmdir($dir);
    }
}