Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 127 |
base_extractor | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
870 | |
0.00% |
0 / 127 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 7 |
|||
init_extractor | |
0.00% |
0 / 1 |
132 | |
0.00% |
0 / 66 |
|||
write_end | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 20 |
|||
flush | |
0.00% |
0 / 1 |
132 | |
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(); | |
} | |
} | |
} | |
} | |
} |