MediaWiki  REL1_20
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                 unset( $this->handle );
00139         }
00140 
00141         function get( $key ) {
00142                 return dba_fetch( $key, $this->handle );
00143         }
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                 if ( wfIsWindows() ) {
00170                         unlink( $this->realFileName );
00171                 }
00172                 if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
00173                         throw new MWException( 'Unable to move the new CDB file into place.' );
00174                 }
00175                 unset( $this->handle );
00176         }
00177 
00178         function __destruct() {
00179                 if ( isset( $this->handle ) ) {
00180                         $this->close();
00181                 }
00182         }
00183 }
00184