From 02e4701b82d74d23220bc1768e32a5a19c41e8a8 Mon Sep 17 00:00:00 2001 From: Benjamin Lees Date: Fri, 7 Aug 2009 00:53:21 +0000 Subject: [PATCH] (bug 19289) importDump.php can now handle bzip2 and 7zip. I split out our 7zip stream wrapper into its own file, 7zip.inc. --- RELEASE-NOTES | 1 + maintenance/7zip.inc | 69 +++++++++++++++++++++++++++++++++++ maintenance/dumpTextPass.php | 70 +----------------------------------- maintenance/importDump.php | 12 ++++++- 4 files changed, 82 insertions(+), 70 deletions(-) create mode 100644 maintenance/7zip.inc diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 0f9d6356c6..f7a37001aa 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -393,6 +393,7 @@ this. Was used when mwEmbed was going to be an extension. * (bug 16084) Default memory limit has be increased to 50M, see $wgMemoryLimit * (bug 17864/19519) Added proper input normalization in Special:UserRights * (bug 20086) Add Hook to add extra statistics at the end of Special:Statistics +* (bug 19289) importDump.php can now handle bzip2 and 7zip == API changes in 1.16 == diff --git a/maintenance/7zip.inc b/maintenance/7zip.inc new file mode 100644 index 0000000000..617083bfe8 --- /dev/null +++ b/maintenance/7zip.inc @@ -0,0 +1,69 @@ +open() + * which is used for the text prefetch. + * + * @ingroup Maintenance + */ +class SevenZipStream { + var $stream; + + private function stripPath( $path ) { + $prefix = 'mediawiki.compress.7z://'; + return substr( $path, strlen( $prefix ) ); + } + + function stream_open( $path, $mode, $options, &$opened_path ) { + if( $mode[0] == 'r' ) { + $options = 'e -bd -so'; + } elseif( $mode[0] == 'w' ) { + $options = 'a -bd -si'; + } else { + return false; + } + $arg = wfEscapeShellArg( $this->stripPath( $path ) ); + $command = "7za $options $arg"; + if( !wfIsWindows() ) { + // Suppress the stupid messages on stderr + $command .= ' 2>/dev/null'; + } + $this->stream = popen( $command, $mode ); + return ($this->stream !== false); + } + + function url_stat( $path, $flags ) { + return stat( $this->stripPath( $path ) ); + } + + // This is all so lame; there should be a default class we can extend + + function stream_close() { + return fclose( $this->stream ); + } + + function stream_flush() { + return fflush( $this->stream ); + } + + function stream_read( $count ) { + return fread( $this->stream, $count ); + } + + function stream_write( $data ) { + return fwrite( $this->stream, $data ); + } + + function stream_tell() { + return ftell( $this->stream ); + } + + function stream_eof() { + return feof( $this->stream ); + } + + function stream_seek( $offset, $whence ) { + return fseek( $this->stream, $offset, $whence ); + } +} +stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' ); \ No newline at end of file diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php index 38420ee654..3db8c2a4d6 100644 --- a/maintenance/dumpTextPass.php +++ b/maintenance/dumpTextPass.php @@ -26,75 +26,7 @@ $originalDir = getcwd(); require_once( dirname(__FILE__) . '/commandLine.inc' ); require_once( 'backup.inc' ); - -/** - * Stream wrapper around 7za filter program. - * Required since we can't pass an open file resource to XMLReader->open() - * which is used for the text prefetch. - * - * @ingroup Maintenance - */ -class SevenZipStream { - var $stream; - - private function stripPath( $path ) { - $prefix = 'mediawiki.compress.7z://'; - return substr( $path, strlen( $prefix ) ); - } - - function stream_open( $path, $mode, $options, &$opened_path ) { - if( $mode{0} == 'r' ) { - $options = 'e -bd -so'; - } elseif( $mode{0} == 'w' ) { - $options = 'a -bd -si'; - } else { - return false; - } - $arg = wfEscapeShellArg( $this->stripPath( $path ) ); - $command = "7za $options $arg"; - if( !wfIsWindows() ) { - // Suppress the stupid messages on stderr - $command .= ' 2>/dev/null'; - } - $this->stream = popen( $command, $mode ); - return ($this->stream !== false); - } - - function url_stat( $path, $flags ) { - return stat( $this->stripPath( $path ) ); - } - - // This is all so lame; there should be a default class we can extend - - function stream_close() { - return fclose( $this->stream ); - } - - function stream_flush() { - return fflush( $this->stream ); - } - - function stream_read( $count ) { - return fread( $this->stream, $count ); - } - - function stream_write( $data ) { - return fwrite( $this->stream, $data ); - } - - function stream_tell() { - return ftell( $this->stream ); - } - - function stream_eof() { - return feof( $this->stream ); - } - - function stream_seek( $offset, $whence ) { - return fseek( $this->stream, $offset, $whence ); - } -} -stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' ); +require_once( '7zip.inc' ); /** * @ingroup Maintenance diff --git a/maintenance/importDump.php b/maintenance/importDump.php index 3458c855f9..01c96e9050 100644 --- a/maintenance/importDump.php +++ b/maintenance/importDump.php @@ -25,6 +25,7 @@ $optionsWithArgs = array( 'report' ); require_once( dirname(__FILE__) . '/commandLine.inc' ); +require_once( '7zip.inc' ); /** * @ingroup Maintenance @@ -115,10 +116,19 @@ class BackupReader { } function importFromFile( $filename ) { + $t = true; if( preg_match( '/\.gz$/', $filename ) ) { $filename = 'compress.zlib://' . $filename; } - $file = fopen( $filename, 'rt' ); + elseif( preg_match( '/\.bz2$/', $filename ) ) { + $filename = 'compress.bzip2://' . $filename; + } + elseif( preg_match( '/\.7z$/', $filename ) ) { + $filename = 'mediawiki.compress.7z://' . $filename; + $t = false; + } + + $file = fopen( $filename, $t ? 'rt' : 't' ); //our 7zip wrapper uses popen, which seems not to like two-letter modes return $this->importFromHandle( $file ); } -- 2.20.1