1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-02-25 04:23:38 +01:00
php-phpbb/phpBB/phpbb/db/extractor/base_extractor.php
MateBartus 193c5b86b4 [ticket/12466] Move classes from acp_database.php to their own files
* Moving classes from acp_database.php to phpbb/db/extractor namespace,
   also into separate files
 * Adding DocBlocks and property visibility to classes
 * Removing globals from code
 * Passing former globals to base_extractor's constructor
 * Adding DB extractor as a service, also implementing the extractor interface
   as well as the extractor factory.

PHPBB3-12466
2015-02-27 16:18:50 +01:00

253 lines
4.4 KiB
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\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();
}
}
}
}
}