For readability. Allowed since PHP 7.4. I searched for integer literals of 6 or more digits, and also changed some nearby smaller numbers for consistency. Bug: T353205 Change-Id: I8518e04889ba8fd52e0f9476a74f8e3e1454b678
158 lines
4 KiB
PHP
158 lines
4 KiB
PHP
<?php
|
|
/**
|
|
* Efficient concatenated text storage.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
*/
|
|
|
|
/**
|
|
* Concatenated gzip (CGZ) storage
|
|
* Improves compression ratio by concatenating like objects before gzipping
|
|
*
|
|
* WARNING: Objects of this class are serialized and permanently stored in the DB.
|
|
* Do not change the name or visibility of any property!
|
|
*/
|
|
class ConcatenatedGzipHistoryBlob implements HistoryBlob {
|
|
/** @var int */
|
|
public $mVersion = 0;
|
|
/** @var bool */
|
|
public $mCompressed = false;
|
|
/** @var string[]|string Array if uncompressed, string if compressed */
|
|
public $mItems = [];
|
|
/** @var string */
|
|
public $mDefaultHash = '';
|
|
/** @var int */
|
|
public $mSize = 0;
|
|
/** @var int */
|
|
public $mMaxSize = 10_000_000;
|
|
/** @var int */
|
|
public $mMaxCount = 100;
|
|
|
|
public function __construct() {
|
|
if ( !function_exists( 'gzdeflate' ) ) {
|
|
throw new RuntimeException( "Need zlib support to read or write this "
|
|
. "kind of history object (ConcatenatedGzipHistoryBlob)\n" );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string $text
|
|
* @return string
|
|
*/
|
|
public function addItem( $text ) {
|
|
$this->uncompress();
|
|
$hash = md5( $text );
|
|
if ( !isset( $this->mItems[$hash] ) ) {
|
|
$this->mItems[$hash] = $text;
|
|
$this->mSize += strlen( $text );
|
|
}
|
|
return $hash;
|
|
}
|
|
|
|
/**
|
|
* @param string $hash
|
|
* @return string|false
|
|
*/
|
|
public function getItem( $hash ) {
|
|
$this->uncompress();
|
|
if ( array_key_exists( $hash, $this->mItems ) ) {
|
|
return $this->mItems[$hash];
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string $text
|
|
* @return void
|
|
*/
|
|
public function setText( $text ) {
|
|
$this->uncompress();
|
|
$this->mDefaultHash = $this->addItem( $text );
|
|
}
|
|
|
|
/**
|
|
* @return string|false
|
|
*/
|
|
public function getText() {
|
|
$this->uncompress();
|
|
return $this->getItem( $this->mDefaultHash );
|
|
}
|
|
|
|
/**
|
|
* Remove an item
|
|
*
|
|
* @param string $hash
|
|
*/
|
|
public function removeItem( $hash ) {
|
|
$this->mSize -= strlen( $this->mItems[$hash] );
|
|
unset( $this->mItems[$hash] );
|
|
}
|
|
|
|
/**
|
|
* Compress the bulk data in the object
|
|
*/
|
|
public function compress() {
|
|
if ( !$this->mCompressed ) {
|
|
$this->mItems = gzdeflate( serialize( $this->mItems ) );
|
|
$this->mCompressed = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Uncompress bulk data
|
|
*/
|
|
public function uncompress() {
|
|
if ( $this->mCompressed ) {
|
|
$this->mItems = HistoryBlobUtils::unserializeArray( gzinflate( $this->mItems ) );
|
|
$this->mCompressed = false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function __sleep() {
|
|
$this->compress();
|
|
return [ 'mVersion', 'mCompressed', 'mItems', 'mDefaultHash' ];
|
|
}
|
|
|
|
public function __wakeup() {
|
|
$this->uncompress();
|
|
}
|
|
|
|
/**
|
|
* Helper function for compression jobs
|
|
* Returns true until the object is "full" and ready to be committed
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isHappy() {
|
|
return $this->mSize < $this->mMaxSize
|
|
&& count( $this->mItems ) < $this->mMaxCount;
|
|
}
|
|
}
|
|
|
|
// Blobs generated by MediaWiki < 1.5 on PHP 4 were serialized with the
|
|
// class name coerced to lowercase. We can improve efficiency by adding
|
|
// autoload entries for the lowercase variants of these classes (T166759).
|
|
// The code below is never executed, but it is picked up by the AutoloadGenerator
|
|
// parser, which scans for class_alias() calls.
|
|
/*
|
|
class_alias( ConcatenatedGzipHistoryBlob::class, 'concatenatedgziphistoryblob' );
|
|
*/
|