MediaWiki  REL1_22
Cdb.php
Go to the documentation of this file.
00001 <?php
00028 abstract class CdbReader {
00036     public static function open( $fileName ) {
00037         if ( self::haveExtension() ) {
00038             return new CdbReader_DBA( $fileName );
00039         } else {
00040             wfDebug( "Warning: no dba extension found, using emulation.\n" );
00041             return new CdbReader_PHP( $fileName );
00042         }
00043     }
00044 
00050     public static function haveExtension() {
00051         if ( !function_exists( 'dba_handlers' ) ) {
00052             return false;
00053         }
00054         $handlers = dba_handlers();
00055         if ( !in_array( 'cdb', $handlers ) || !in_array( 'cdb_make', $handlers ) ) {
00056             return false;
00057         }
00058         return true;
00059     }
00060 
00064     abstract function __construct( $fileName );
00065 
00069     abstract function close();
00070 
00076     abstract public function get( $key );
00077 }
00078 
00083 abstract class CdbWriter {
00092     public static function open( $fileName ) {
00093         if ( CdbReader::haveExtension() ) {
00094             return new CdbWriter_DBA( $fileName );
00095         } else {
00096             wfDebug( "Warning: no dba extension found, using emulation.\n" );
00097             return new CdbWriter_PHP( $fileName );
00098         }
00099     }
00100 
00106     abstract function __construct( $fileName );
00107 
00113     abstract public function set( $key, $value );
00114 
00119     abstract public function close();
00120 }
00121 
00125 class CdbReader_DBA {
00126     var $handle;
00127 
00128     function __construct( $fileName ) {
00129         $this->handle = dba_open( $fileName, 'r-', 'cdb' );
00130         if ( !$this->handle ) {
00131             throw new MWException( 'Unable to open CDB file "' . $fileName . '"' );
00132         }
00133     }
00134 
00135     function close() {
00136         if ( isset( $this->handle ) ) {
00137             dba_close( $this->handle );
00138         }
00139         unset( $this->handle );
00140     }
00141 
00142     function get( $key ) {
00143         return dba_fetch( $key, $this->handle );
00144     }
00145 }
00146 
00150 class CdbWriter_DBA {
00151     var $handle, $realFileName, $tmpFileName;
00152 
00153     function __construct( $fileName ) {
00154         $this->realFileName = $fileName;
00155         $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
00156         $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
00157         if ( !$this->handle ) {
00158             throw new MWException( 'Unable to open CDB file for write "' . $fileName . '"' );
00159         }
00160     }
00161 
00162     function set( $key, $value ) {
00163         return dba_insert( $key, $value, $this->handle );
00164     }
00165 
00166     function close() {
00167         if ( isset( $this->handle ) ) {
00168             dba_close( $this->handle );
00169         }
00170         if ( wfIsWindows() ) {
00171             unlink( $this->realFileName );
00172         }
00173         if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
00174             throw new MWException( 'Unable to move the new CDB file into place.' );
00175         }
00176         unset( $this->handle );
00177     }
00178 
00179     function __destruct() {
00180         if ( isset( $this->handle ) ) {
00181             $this->close();
00182         }
00183     }
00184 }