Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 127
base_extractor
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
870.00
0.00% covered (danger)
0.00%
0 / 127
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 7
 init_extractor
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 66
 write_end
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 20
 flush
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 34
<?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\db\extractor;
use phpbb\db\extractor\exception\invalid_format_exception;
use phpbb\db\extractor\exception\extractor_not_initialized_exception;
/**
 * Abstract base class for database extraction
 */
abstract class base_extractor implements extractor_interface
{
    /**
     * @var    string    phpBB root path
     */
    protected $phpbb_root_path;
    /**
     * @var    \phpbb\request\request_interface
     */
    protected $request;
    /**
     * @var    \phpbb\db\driver\driver_interface
     */
    protected $db;
    /**
     * @var    bool
     */
    protected $download;
    /**
     * @var    bool
     */
    protected $store;
    /**
     * @var    int
     */
    protected $time;
    /**
     * @var    string
     */
    protected $format;
    /**
     * @var    resource
     */
    protected $fp;
    /**
     * @var string
     */
    protected $write;
    /**
     * @var string
     */
    protected $close;
    /**
     * @var bool
     */
    protected $run_comp;
    /**
     * @var bool
     */
    protected $is_initialized;
    /**
     * Constructor
     *
     * @param string $phpbb_root_path
     * @param \phpbb\request\request_interface $request
     * @param \phpbb\db\driver\driver_interface $db
     */
    public function __construct($phpbb_root_path, \phpbb\request\request_interface $request, \phpbb\db\driver\driver_interface $db)
    {
        $this->phpbb_root_path    = $phpbb_root_path;
        $this->request            = $request;
        $this->db                = $db;
        $this->fp                = null;
        $this->is_initialized   = false;
    }
    /**
    * {@inheritdoc}
    */
    public function init_extractor($format, $filename, $time, $download = false, $store = false)
    {
        $this->download            = $download;
        $this->store            = $store;
        $this->time                = $time;
        $this->format            = $format;
        switch ($format)
        {
            case 'text':
                $ext = '.sql';
                $open = 'fopen';
                $this->write = 'fwrite';
                $this->close = 'fclose';
                $mimetype = 'text/x-sql';
            break;
            case 'bzip2':
                $ext = '.sql.bz2';
                $open = 'bzopen';
                $this->write = 'bzwrite';
                $this->close = 'bzclose';
                $mimetype = 'application/x-bzip2';
            break;
            case 'gzip':
                $ext = '.sql.gz';
                $open = 'gzopen';
                $this->write = 'gzwrite';
                $this->close = 'gzclose';
                $mimetype = 'application/x-gzip';
            break;
            default:
                throw new invalid_format_exception();
            break;
        }
        if ($download === true)
        {
            $name = $filename . $ext;
            header('Cache-Control: private, no-cache');
            header("Content-Type: $mimetype; name=\"$name\"");
            header("Content-disposition: attachment; filename=$name");
            switch ($format)
            {
                case 'bzip2':
                    ob_start();
                break;
                case 'gzip':
                    if (strpos($this->request->header('Accept-Encoding'), 'gzip') !== false && strpos(strtolower($this->request->header('User-Agent')), 'msie') === false)
                    {
                        ob_start('ob_gzhandler');
                    }
                    else
                    {
                        $this->run_comp = true;
                    }
                break;
            }
        }
        if ($store === true)
        {
            $file = $this->phpbb_root_path . 'store/' . $filename . $ext;
            $this->fp = $open($file, 'w');
            if (!$this->fp)
            {
                trigger_error('FILE_WRITE_FAIL', E_USER_ERROR);
            }
        }
        $this->is_initialized = true;
    }
    /**
    * {@inheritdoc}
    */
    public function write_end()
    {
        static $close;
        if (!$this->is_initialized)
        {
            throw new extractor_not_initialized_exception();
        }
        if ($this->store)
        {
            if ($close === null)
            {
                $close = $this->close;
            }
            $close($this->fp);
        }
        // bzip2 must be written all the way at the end
        if ($this->download && $this->format === 'bzip2')
        {
            $c = ob_get_clean();
            echo bzcompress($c);
        }
    }
    /**
    * {@inheritdoc}
    */
    public function flush($data)
    {
        static $write;
        if (!$this->is_initialized)
        {
            throw new extractor_not_initialized_exception();
        }
        if ($this->store === true)
        {
            if ($write === null)
            {
                $write = $this->write;
            }
            $write($this->fp, $data);
        }
        if ($this->download === true)
        {
            if ($this->format === 'bzip2' || $this->format === 'text' || ($this->format === 'gzip' && !$this->run_comp))
            {
                echo $data;
            }
            // we can write the gzip data as soon as we get it
            if ($this->format === 'gzip')
            {
                if ($this->run_comp)
                {
                    echo gzencode($data);
                }
                else
                {
                    ob_flush();
                    flush();
                }
            }
        }
    }
}