protected function read( $start, $len ) {
		$end = $start + $len;

		// The first 2048 bytes are the lookup table, which is read into
		// memory on initialization.
		if ( $end <= 2048 ) {
			return substr( $this->index, $start, $len );
		}

		// Read data from the internal buffer first.
		$bytes = '';
		if ( $this->buf && $start >= $this->bufStart ) {
			$bytes .= substr( $this->buf, $start - $this->bufStart, $len );
			$bytesRead = strlen( $bytes );
			$len -= $bytesRead;
			$start += $bytesRead;
		} else {
			$bytesRead = 0;
		}

		if ( !$len ) {
			return $bytes;
		}

		// Many reads are sequential, so the file position indicator may
		// already be in the right place, in which case we can avoid the
		// call to fseek().
		if ( $start !== $this->filePos ) {
			if ( fseek( $this->handle, $start ) === -1 ) {
				// This can easily happen if the internal pointers are incorrect
				throw new Exception(
					'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
			}
		}

		$buf = fread( $this->handle, max( $len, 1024 ) );
		if ( $buf === false ) {
			$buf = '';
		}

		$bytes .= substr( $buf, 0, $len );
		if ( strlen( $bytes ) !== $len + $bytesRead ) {
			throw new Exception(
				'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
		}

		$this->filePos = $end;
		$this->bufStart = $start;
		$this->buf = $buf;

		return $bytes;
	}
protected function read( $start, $len ) {
		$end = $start + $len;

		// The first 2048 bytes are the lookup table, which is read into
		// memory on initialization.
		if ( $end <= 2048 ) {
			return substr( $this->index, $start, $len );
		}

		// Read data from the internal buffer first.
		$bytes = '';
		if ( $this->buf && $start >= $this->bufStart ) {
			$bytes .= substr( $this->buf, $start - $this->bufStart, $len );
			$bytesRead = strlen( $bytes );
			$len -= $bytesRead;
			$start += $bytesRead;
		} else {
			$bytesRead = 0;
		}

		if ( !$len ) {
			return $bytes;
		}

		// Many reads are sequential, so the file position indicator may
		// already be in the right place, in which case we can avoid the
		// call to fseek().
		if ( $start !== $this->filePos ) {
			if ( fseek( $this->handle, $start ) === -1 ) {
				// This can easily happen if the internal pointers are incorrect
				throw new Exception(
					'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
			}
		}

		$buf = fread( $this->handle, max( $len, 1024 ) );
		if ( $buf === false ) {
			$buf = '';
		}

		$bytes .= substr( $buf, 0, $len );
		if ( strlen( $bytes ) !== $len + $bytesRead ) {
			throw new Exception(
				'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
		}

		$this->filePos = $end;
		$this->bufStart = $start;
		$this->buf = $buf;

		return $bytes;
	}
protected function read ( $ start , $ len ) { $ end = $ start + $ len ; // The first 2048 bytes are the lookup table, which is read into // memory on initialization. if ( $ end <= 2048 ) { return substr ( $ this -> index , $ start , $ len ) ; } // Read data from the internal buffer first. $ bytes = '' ; if ( $ this -> buf && $ start >= $ this -> bufStart ) { $ bytes .= substr ( $ this -> buf , $ start - $ this -> bufStart , $ len ) ; $ bytesRead = strlen ( $ bytes ) ; $ len -= $ bytesRead ; $ start += $ bytesRead ; } else { $ bytesRead = 0 ; } if ( ! $ len ) { return $ bytes ; } // Many reads are sequential, so the file position indicator may // already be in the right place, in which case we can avoid the // call to fseek(). if ( $ start !== $ this -> filePos ) { if ( fseek ( $ this -> handle , $ start ) === - 1 ) { // This can easily happen if the internal pointers are incorrect throw new Exception ( 'Seek failed, file "' . $ this -> fileName . '" may be corrupted.' ) ; } } $ buf = fread ( $ this -> handle , max ( $ len , 1024 ) ) ; if ( $ buf === false ) { $ buf = '' ; } $ bytes .= substr ( $ buf , 0 , $ len ) ; if ( strlen ( $ bytes ) !== $ len + $ bytesRead ) { throw new Exception ( 'Read from CDB file failed, file "' . $ this -> fileName . '" may be corrupted.' ) ; } $ this -> filePos = $ end ; $ this -> bufStart = $ start ; $ this -> buf = $ buf ; return $ bytes ; }
Read data from the CDB file.

@throws Exception When attempting to read past the end of the file.
@param int $start Start reading from this position.
@param int $len Number of bytes to read.
@return string Read data.
Read data from the CDB file .