<?php
-
/**
* This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
* appears in PHP 5.3. Changes are:
* * Error returns replaced with exceptions
* * Exception thrown if sizes or offsets are between 2GB and 4GB
* * Some variables renamed
+ *
+ * @file
*/
/**
* $b must be less than 0x40000000 and greater than 0
*/
public static function unsignedMod( $a, $b ) {
- if ( $a < 0 ) {
+ if ( $a & 0x80000000 ) {
$m = ( $a & 0x7fffffff ) % $b + 2 * ( 0x40000000 % $b );
return $m % $b;
} else {
if ( $b == 0 ) {
return $a;
}
- if ( $a < 0 ) {
+ if ( $a & 0x80000000 ) {
return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
} else {
return $a >> $b;
public static function hash( $s ) {
$h = 5381;
for ( $i = 0; $i < strlen( $s ); $i++ ) {
- $h5 = $h << 5;
+ $h5 = ($h << 5) & 0xffffffff;
// Do a 32-bit sum
// Inlined here for speed
$sum = ($h & 0x3fffffff) + ($h5 & 0x3fffffff);
$h =
(
( $sum & 0x40000000 ? 1 : 0 )
- + ( $h < 0 ? 2 : 0 )
+ + ( $h & 0x80000000 ? 2 : 0 )
+ ( $h & 0x40000000 ? 1 : 0 )
- + ( $h5 < 0 ? 2 : 0 )
+ + ( $h5 & 0x80000000 ? 2 : 0 )
+ ( $h5 & 0x40000000 ? 1 : 0 )
) << 30
| ( $sum & 0x3fffffff );
$h ^= ord( $s[$i] );
+ $h &= 0xffffffff;
}
return $h;
}
function __construct( $fileName ) {
$this->handle = fopen( $fileName, 'rb' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open DB file "' . $fileName . '"' );
+ throw new MWException( 'Unable to open CDB file "' . $fileName . '"' );
}
$this->findStart();
}
function close() {
- fclose( $this->handle );
+ if( isset($this->handle) )
+ fclose( $this->handle );
unset( $this->handle );
}
$buf = fread( $this->handle, $length );
if ( $buf === false || strlen( $buf ) !== $length ) {
- throw new MWException( __METHOD__.': read from cdb file failed, file may be corrupted' );
+ throw new MWException( __METHOD__.': read from CDB file failed, file may be corrupted' );
}
return $buf;
}
$this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
$this->handle = fopen( $this->tmpFileName, 'wb' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open DB file for write "' . $fileName . '"' );
+ throw new MWException( 'Unable to open CDB file for write "' . $fileName . '"' );
}
$this->hplist = array();
$this->numentries = 0;
public function close() {
$this->finish();
- fclose( $this->handle );
+ if( isset($this->handle) )
+ fclose( $this->handle );
if ( wfIsWindows() && file_exists($this->realFileName) ) {
unlink( $this->realFileName );
}