re bug #25523: add mime.info and mime.types for *.dwg files so that when people add...
[lhc/web/wiklou.git] / includes / Cdb_PHP.php
index f2a044c..1485cc6 100644 (file)
@@ -1,11 +1,12 @@
 <?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
  */
 
 /**
@@ -17,7 +18,7 @@ class CdbFunctions {
         * $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 {
@@ -32,7 +33,7 @@ class CdbFunctions {
                if ( $b == 0 ) {
                        return $a;
                }
-               if ( $a 0 ) {
+               if ( $a & 0x80000000 ) {
                        return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
                } else {
                        return $a >> $b;
@@ -45,20 +46,21 @@ class CdbFunctions {
        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;
        }
@@ -95,13 +97,14 @@ class CdbReader_PHP extends CdbReader {
        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 );
        }
 
@@ -135,7 +138,7 @@ class CdbReader_PHP extends CdbReader {
 
                $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;
        }
@@ -221,7 +224,7 @@ class CdbWriter_PHP extends CdbWriter {
                $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;
@@ -250,8 +253,9 @@ class CdbWriter_PHP extends CdbWriter {
 
        public function close() {
                $this->finish();
-               fclose( $this->handle );
-               if ( wfIsWindows() ) {
+               if( isset($this->handle) )
+                       fclose( $this->handle );
+               if ( wfIsWindows() && file_exists($this->realFileName) ) {
                        unlink( $this->realFileName );
                }
                if ( !rename( $this->tmpFileName, $this->realFileName ) ) {