Throw an exception if Parser::disableCache is called before mOutput initialized ...
[lhc/web/wiklou.git] / includes / Cdb_PHP.php
index 49294f7..aaaf33a 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 
+ * 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
  */
 
 /**
@@ -15,6 +16,11 @@ class CdbFunctions {
        /**
         * Take a modulo of a signed integer as if it were an unsigned integer.
         * $b must be less than 0x40000000 and greater than 0
+        *
+        * @param $a
+        * @param $b
+        *
+        * @return int
         */
        public static function unsignedMod( $a, $b ) {
                if ( $a & 0x80000000 ) {
@@ -24,9 +30,12 @@ class CdbFunctions {
                        return $a % $b;
                }
        }
-       
+
        /**
         * Shift a signed integer right as if it were unsigned
+        * @param $a
+        * @param $b
+        * @return int
         */
        public static function unsignedShiftRight( $a, $b ) {
                if ( $b == 0 ) {
@@ -41,6 +50,10 @@ class CdbFunctions {
 
        /**
         * The CDB hash function.
+        *
+        * @param $s
+        *
+        * @return
         */
        public static function hash( $s ) {
                $h = 5381;
@@ -49,7 +62,7 @@ class CdbFunctions {
                        // Do a 32-bit sum
                        // Inlined here for speed
                        $sum = ($h & 0x3fffffff) + ($h5 & 0x3fffffff);
-                       $h = 
+                       $h =
                                (
                                        ( $sum & 0x40000000 ? 1 : 0 )
                                        + ( $h & 0x80000000 ? 2 : 0 )
@@ -91,22 +104,30 @@ class CdbReader_PHP extends CdbReader {
        var $dpos;
 
        /* initialized if cdb_findnext() returns 1 */
-       var $dlen; 
+       var $dlen;
 
+       /**
+        * @param $fileName string
+        */
        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() {
-               if( isset($this->handle) )
+               if( isset( $this->handle ) ) {
                        fclose( $this->handle );
+               }
                unset( $this->handle );
        }
 
+       /**
+        * @param $key
+        * @return bool|string
+        */
        public function get( $key ) {
                // strval is required
                if ( $this->find( strval( $key ) ) ) {
@@ -116,6 +137,11 @@ class CdbReader_PHP extends CdbReader {
                }
        }
 
+       /**
+        * @param $key
+        * @param $pos
+        * @return bool
+        */
        protected function match( $key, $pos ) {
                $buf = $this->read( strlen( $key ), $pos );
                return $buf === $key;
@@ -125,6 +151,12 @@ class CdbReader_PHP extends CdbReader {
                $this->loop = 0;
        }
 
+       /**
+        * @throws MWException
+        * @param $length
+        * @param $pos
+        * @return string
+        */
        protected function read( $length, $pos ) {
                if ( fseek( $this->handle, $pos ) == -1 ) {
                        // This can easily happen if the internal pointers are incorrect
@@ -137,13 +169,15 @@ 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;
        }
 
        /**
         * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
+        * @param $s
+        * @return
         */
        protected function unpack31( $s ) {
                $data = unpack( 'V', $s );
@@ -155,12 +189,18 @@ class CdbReader_PHP extends CdbReader {
 
        /**
         * Unpack a 32-bit signed integer
+        * @param $s
+        * @return int
         */
        protected function unpackSigned( $s ) {
                $data = unpack( 'va/vb', $s );
                return $data['a'] | ( $data['b'] << 16 );
        }
 
+       /**
+        * @param $key
+        * @return bool
+        */
        protected function findNext( $key ) {
                if ( !$this->loop ) {
                        $u = CdbFunctions::hash( $key );
@@ -203,6 +243,10 @@ class CdbReader_PHP extends CdbReader {
                return false;
        }
 
+       /**
+        * @param $key
+        * @return bool
+        */
        protected function find( $key ) {
                $this->findStart();
                return $this->findNext( $key );
@@ -216,14 +260,17 @@ class CdbWriter_PHP extends CdbWriter {
        var $handle, $realFileName, $tmpFileName;
 
        var $hplist;
-       var $numEntries, $pos;
+       var $numentries, $pos;
 
+       /**
+        * @param $fileName string
+        */
        function __construct( $fileName ) {
                $this->realFileName = $fileName;
                $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;
@@ -239,6 +286,11 @@ class CdbWriter_PHP extends CdbWriter {
                }
        }
 
+       /**
+        * @param $key
+        * @param $value
+        * @return
+        */
        public function set( $key, $value ) {
                if ( strval( $key ) === '' ) {
                        // DBA cross-check hack
@@ -250,10 +302,14 @@ class CdbWriter_PHP extends CdbWriter {
                $this->addend( strlen( $key ), strlen( $value ), CdbFunctions::hash( $key ) );
        }
 
+       /**
+        * @throws MWException
+        */
        public function close() {
                $this->finish();
-               if( isset($this->handle) )
+               if( isset($this->handle) ) {
                        fclose( $this->handle );
+               }
                if ( wfIsWindows() && file_exists($this->realFileName) ) {
                        unlink( $this->realFileName );
                }
@@ -263,6 +319,10 @@ class CdbWriter_PHP extends CdbWriter {
                unset( $this->handle );
        }
 
+       /**
+        * @throws MWException
+        * @param $buf
+        */
        protected function write( $buf ) {
                $len = fwrite( $this->handle, $buf );
                if ( $len !== strlen( $buf ) ) {
@@ -270,6 +330,10 @@ class CdbWriter_PHP extends CdbWriter {
                }
        }
 
+       /**
+        * @throws MWException
+        * @param $len
+        */
        protected function posplus( $len ) {
                $newpos = $this->pos + $len;
                if ( $newpos > 0x7fffffff ) {
@@ -278,6 +342,11 @@ class CdbWriter_PHP extends CdbWriter {
                $this->pos = $newpos;
        }
 
+       /**
+        * @param $keylen
+        * @param $datalen
+        * @param $h
+        */
        protected function addend( $keylen, $datalen, $h ) {
                $this->hplist[] = array(
                        'h' => $h,
@@ -290,6 +359,11 @@ class CdbWriter_PHP extends CdbWriter {
                $this->posplus( $datalen );
        }
 
+       /**
+        * @throws MWException
+        * @param $keylen
+        * @param $datalen
+        */
        protected function addbegin( $keylen, $datalen ) {
                if ( $keylen > 0x7fffffff ) {
                        throw new MWException( __METHOD__.': key length too long' );
@@ -301,6 +375,9 @@ class CdbWriter_PHP extends CdbWriter {
                $this->write( $buf );
        }
 
+       /**
+        * @throws MWException
+        */
        protected function finish() {
                // Hack for DBA cross-check
                $this->hplist = array_reverse( $this->hplist );
@@ -320,7 +397,7 @@ class CdbWriter_PHP extends CdbWriter {
                }
 
                // Excessively clever and indulgent code to simultaneously fill $packedTables
-               // with the packed hashtables, and adjust the elements of $starts 
+               // with the packed hashtables, and adjust the elements of $starts
                // to actually point to the starts instead of the ends.
                $packedTables = array_fill( 0, $this->numentries, false );
                foreach ( $this->hplist as $item ) {
@@ -345,7 +422,7 @@ class CdbWriter_PHP extends CdbWriter {
                        // is taken.
                        for ( $u = 0; $u < $count; ++$u ) {
                                $hp = $packedTables[$starts[$i] + $u];
-                               $where = CdbFunctions::unsignedMod( 
+                               $where = CdbFunctions::unsignedMod(
                                        CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
                                while ( $hashtable[$where]['p'] )
                                        if ( ++$where == $len )
@@ -355,7 +432,7 @@ class CdbWriter_PHP extends CdbWriter {
 
                        // Write the hashtable
                        for ( $u = 0; $u < $len; ++$u ) {
-                               $buf = pack( 'vvV', 
+                               $buf = pack( 'vvV',
                                        $hashtable[$u]['h'] & 0xffff,
                                        CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
                                        $hashtable[$u]['p'] );