Legoktm has uploaded a new change for review. https://gerrit.wikimedia.org/r/287011
Change subject: Bump wikimedia/cdb to 1.4.0 ...................................................................... Bump wikimedia/cdb to 1.4.0 Change-Id: I61cf76132406e9ea61fc50edaa5dfa26765f0ec4 --- M composer.json M composer.lock M composer/autoload_classmap.php M composer/installed.json A wikimedia/cdb/src/Reader/Hash.php M wikimedia/cdb/src/Reader/PHP.php 6 files changed, 208 insertions(+), 69 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/vendor refs/changes/11/287011/1 diff --git a/composer.json b/composer.json index d058eb0..ea137bf 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "wikimedia/assert": "0.2.2", "wikimedia/avro": "1.7.7", "wikimedia/base-convert": "1.0.1", - "wikimedia/cdb": "1.3.0", + "wikimedia/cdb": "1.4.0", "wikimedia/cldr-plural-rule-parser": "1.0.0", "wikimedia/composer-merge-plugin": "1.3.1", "wikimedia/html-formatter": "1.0.1", diff --git a/composer.lock b/composer.lock index bdd8ac6..1b2b07d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "d4b69794468f794a8350339881319948", - "content-hash": "fbadb58818d15bd051e858b533bf2252", + "hash": "b409fa5095e26ed34530b951698cc515", + "content-hash": "5e0b25793682fc5b32f000bdaac041f8", "packages": [ { "name": "composer/semver", @@ -1284,24 +1284,25 @@ }, { "name": "wikimedia/cdb", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/wikimedia/cdb.git", - "reference": "68f8fd495ca94ca0e965dd511e234893c515bb95" + "reference": "de73728295f8452465dbb5ec2b680427d557e61b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wikimedia/cdb/zipball/68f8fd495ca94ca0e965dd511e234893c515bb95", - "reference": "68f8fd495ca94ca0e965dd511e234893c515bb95", + "url": "https://api.github.com/repos/wikimedia/cdb/zipball/de73728295f8452465dbb5ec2b680427d557e61b", + "reference": "de73728295f8452465dbb5ec2b680427d557e61b", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": ">=5.3.2", + "wikimedia/assert": "~0.2.2" }, "require-dev": { "jakub-onderka/php-parallel-lint": "0.9", - "mediawiki/mediawiki-codesniffer": "0.3.0", + "mediawiki/mediawiki-codesniffer": "0.5.0", "phpunit/phpunit": "4.6.*" }, "type": "library", @@ -1315,6 +1316,9 @@ "GPL-2.0+" ], "authors": [ + { + "name": "Daniel Kinzler" + }, { "name": "Tim Starling", "email": "tstarl...@wikimedia.org" @@ -1330,7 +1334,7 @@ ], "description": "Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.", "homepage": "https://www.mediawiki.org/wiki/CDB", - "time": "2015-09-08 19:53:04" + "time": "2016-05-04 21:47:24" }, { "name": "wikimedia/cldr-plural-rule-parser", diff --git a/composer/autoload_classmap.php b/composer/autoload_classmap.php index b219484..3af156c 100644 --- a/composer/autoload_classmap.php +++ b/composer/autoload_classmap.php @@ -53,6 +53,7 @@ 'Cdb\\Exception' => $vendorDir . '/wikimedia/cdb/src/Exception.php', 'Cdb\\Reader' => $vendorDir . '/wikimedia/cdb/src/Reader.php', 'Cdb\\Reader\\DBA' => $vendorDir . '/wikimedia/cdb/src/Reader/DBA.php', + 'Cdb\\Reader\\Hash' => $vendorDir . '/wikimedia/cdb/src/Reader/Hash.php', 'Cdb\\Reader\\PHP' => $vendorDir . '/wikimedia/cdb/src/Reader/PHP.php', 'Cdb\\Util' => $vendorDir . '/wikimedia/cdb/src/Util.php', 'Cdb\\Writer' => $vendorDir . '/wikimedia/cdb/src/Writer.php', diff --git a/composer/installed.json b/composer/installed.json index e593582..496237a 100644 --- a/composer/installed.json +++ b/composer/installed.json @@ -820,58 +820,6 @@ "homepage": "https://www.mediawiki.org/wiki/base_convert" }, { - "name": "wikimedia/cdb", - "version": "1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/wikimedia/cdb.git", - "reference": "68f8fd495ca94ca0e965dd511e234893c515bb95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/wikimedia/cdb/zipball/68f8fd495ca94ca0e965dd511e234893c515bb95", - "reference": "68f8fd495ca94ca0e965dd511e234893c515bb95", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "jakub-onderka/php-parallel-lint": "0.9", - "mediawiki/mediawiki-codesniffer": "0.3.0", - "phpunit/phpunit": "4.6.*" - }, - "time": "2015-09-08 19:53:04", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0+" - ], - "authors": [ - { - "name": "Tim Starling", - "email": "tstarl...@wikimedia.org" - }, - { - "name": "Chad Horohoe", - "email": "c...@wikimedia.org" - }, - { - "name": "Ori Livneh", - "email": "o...@wikimedia.org" - } - ], - "description": "Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.", - "homepage": "https://www.mediawiki.org/wiki/CDB" - }, - { "name": "wikimedia/cldr-plural-rule-parser", "version": "v1.0.0", "version_normalized": "1.0.0.0", @@ -1876,5 +1824,61 @@ ], "description": "Efficiently match IP addresses against a set of CIDR specifications.", "homepage": "https://github.com/wikimedia/IPSet" + }, + { + "name": "wikimedia/cdb", + "version": "1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/cdb.git", + "reference": "de73728295f8452465dbb5ec2b680427d557e61b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/cdb/zipball/de73728295f8452465dbb5ec2b680427d557e61b", + "reference": "de73728295f8452465dbb5ec2b680427d557e61b", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "wikimedia/assert": "~0.2.2" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "0.9", + "mediawiki/mediawiki-codesniffer": "0.5.0", + "phpunit/phpunit": "4.6.*" + }, + "time": "2016-05-04 21:47:24", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Daniel Kinzler" + }, + { + "name": "Tim Starling", + "email": "tstarl...@wikimedia.org" + }, + { + "name": "Chad Horohoe", + "email": "c...@wikimedia.org" + }, + { + "name": "Ori Livneh", + "email": "o...@wikimedia.org" + } + ], + "description": "Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.", + "homepage": "https://www.mediawiki.org/wiki/CDB" } ] diff --git a/wikimedia/cdb/src/Reader/Hash.php b/wikimedia/cdb/src/Reader/Hash.php new file mode 100644 index 0000000..3010305 --- /dev/null +++ b/wikimedia/cdb/src/Reader/Hash.php @@ -0,0 +1,114 @@ +<?php + +namespace Cdb\Reader; + +use Cdb\Reader; +use Wikimedia\Assert\Assert; + +/** + * Hash implements the CdbReader interface based on an associative + * PHP array (a.k.a "hash"). + * + * 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 + */ + +/** + * Hash implements the CdbReader interface based on an associative + * PHP array (a.k.a "hash"). + */ +class Hash extends Reader { + + /** + * @var string + */ + private $data; + + /** + * A queue of keys to return from nextkey(), + * initialized by firstkey(); + * + * @var string[]|null + */ + private $keys = null; + + /** + * Create the object and open the file + * + * @param string[] $data An associative PHP array. + */ + public function __construct( $data ) { + Assert::parameterType( 'array', $data, '$data' ); + Assert::parameterElementType( 'string', $data, '$data' ); + + $this->data = $data; + } + + /** + * Close the file. Optional, you can just let the variable go out of scope. + */ + public function close() { + $this->data = array(); + $this->keys = null; + } + + /** + * Get a value with a given key. Only string values are supported. + * + * @param string $key + * + * @return bool|string The value associated with $key, or false if $key is not known. + */ + public function get( $key ) { + return isset( $this->data[ $key ] ) ? $this->data[ $key ] : false; + } + + /** + * Check whether key exists + * + * @param string $key + * + * @return bool + */ + public function exists( $key ) { + return isset( $this->data[ $key ] ); + } + + /** + * Fetch first key + * + * @return string + */ + public function firstkey() { + $this->keys = array_keys( $this->data ); + return $this->nextkey(); + } + + /** + * Fetch next key + * + * @return string + */ + public function nextkey() { + if ( $this->keys === null ) { + return $this->firstkey(); + } + + return empty( $this->keys ) ? false : array_shift( $this->keys ); + } + +} diff --git a/wikimedia/cdb/src/Reader/PHP.php b/wikimedia/cdb/src/Reader/PHP.php index 0f0d36e..c388141 100644 --- a/wikimedia/cdb/src/Reader/PHP.php +++ b/wikimedia/cdb/src/Reader/PHP.php @@ -36,8 +36,8 @@ /** @var string The file name of the CDB file. **/ protected $fileName; - /** @var string First 2048b of CDB file, containing the hash table. **/ - protected $hashTable; + /** @var string First 2048b of CDB file, containing pointers to hash table. **/ + protected $index; /** @var int Offset in file where value of found key starts. **/ protected $dataPos; @@ -47,6 +47,9 @@ /** @var int File position indicator when iterating over keys. **/ protected $keyIterPos = 2048; + + /** @var int Offset in file where hash tables start. **/ + protected $keyIterStop; /** @var string Read buffer for CDB file. **/ protected $buf; @@ -70,8 +73,8 @@ if ( !$this->handle ) { throw new Exception( 'Unable to open CDB file "' . $this->fileName . '".' ); } - $this->hashTable = fread( $this->handle, 2048 ); - if ( strlen( $this->hashTable ) !== 2048 ) { + $this->index = fread( $this->handle, 2048 ); + if ( strlen( $this->index ) !== 2048 ) { throw new Exception( 'CDB file contains fewer than 2048 bytes of data.' ); } } @@ -115,7 +118,7 @@ // The first 2048 bytes are the lookup table, which is read into // memory on initialization. if ( $end <= 2048 ) { - return substr( $this->hashTable, $start, $len ); + return substr( $this->index, $start, $len ); } // Read data from the internal buffer first. @@ -281,9 +284,19 @@ /** * Get the first key from the CDB file and reset the key iterator. * - * @return string Key. + * @return string|bool Key, or false if no keys in file. */ public function firstkey() { + $this->keyIterPos = 4; + + if ( !$this->keyIterStop ) { + $pos = INF; + for ( $i = 0; $i < 2048; $i+= 8 ) { + $pos = min( $this->readInt31( $i ), $pos ); + } + $this->keyIterStop = $pos; + } + $this->keyIterPos = 2048; return $this->nextkey(); } @@ -291,9 +304,12 @@ /** * Get the next key from the CDB file. * - * @return string Key. + * @return string|bool Key, or false if no more keys. */ public function nextkey() { + if ( $this->keyIterPos >= $this->keyIterStop ) { + return false; + } $keyLen = $this->readInt31( $this->keyIterPos ); $dataLen = $this->readInt31( $this->keyIterPos + 4 ); $key = $this->read( $this->keyIterPos + 8, $keyLen ); -- To view, visit https://gerrit.wikimedia.org/r/287011 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I61cf76132406e9ea61fc50edaa5dfa26765f0ec4 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/vendor Gerrit-Branch: master Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits