[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/maintenance/ -> sqlite.php (source)

   1  <?php
   2  /**
   3   * Performs some operations specific to SQLite database backend.
   4   *
   5   * This program is free software; you can redistribute it and/or modify
   6   * it under the terms of the GNU General Public License as published by
   7   * the Free Software Foundation; either version 2 of the License, or
   8   * (at your option) any later version.
   9   *
  10   * This program is distributed in the hope that it will be useful,
  11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13   * GNU General Public License for more details.
  14   *
  15   * You should have received a copy of the GNU General Public License along
  16   * with this program; if not, write to the Free Software Foundation, Inc.,
  17   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18   * http://www.gnu.org/copyleft/gpl.html
  19   *
  20   * @file
  21   * @ingroup Maintenance
  22   */
  23  
  24  require_once  __DIR__ . '/Maintenance.php';
  25  
  26  /**
  27   * Maintenance script that performs some operations specific to SQLite database backend.
  28   *
  29   * @ingroup Maintenance
  30   */
  31  class SqliteMaintenance extends Maintenance {
  32  	public function __construct() {
  33          parent::__construct();
  34          $this->mDescription = "Performs some operations specific to SQLite database backend";
  35          $this->addOption(
  36              'vacuum',
  37              'Clean up database by removing deleted pages. Decreases database file size'
  38          );
  39          $this->addOption( 'integrity', 'Check database for integrity' );
  40          $this->addOption( 'backup-to', 'Backup database to the given file', false, true );
  41          $this->addOption( 'check-syntax', 'Check SQL file(s) for syntax errors', false, true );
  42      }
  43  
  44      /**
  45       * While we use database connection, this simple lie prevents useless --dbpass and
  46       * --dbuser options from appearing in help message for this script.
  47       *
  48       * @return int DB constant
  49       */
  50  	public function getDbType() {
  51          return Maintenance::DB_NONE;
  52      }
  53  
  54  	public function execute() {
  55          // Should work even if we use a non-SQLite database
  56          if ( $this->hasOption( 'check-syntax' ) ) {
  57              $this->checkSyntax();
  58  
  59              return;
  60          }
  61  
  62          $this->db = wfGetDB( DB_MASTER );
  63  
  64          if ( $this->db->getType() != 'sqlite' ) {
  65              $this->error( "This maintenance script requires a SQLite database.\n" );
  66  
  67              return;
  68          }
  69  
  70          if ( $this->hasOption( 'vacuum' ) ) {
  71              $this->vacuum();
  72          }
  73  
  74          if ( $this->hasOption( 'integrity' ) ) {
  75              $this->integrityCheck();
  76          }
  77  
  78          if ( $this->hasOption( 'backup-to' ) ) {
  79              $this->backup( $this->getOption( 'backup-to' ) );
  80          }
  81      }
  82  
  83  	private function vacuum() {
  84          $prevSize = filesize( $this->db->mDatabaseFile );
  85          if ( $prevSize == 0 ) {
  86              $this->error( "Can't vacuum an empty database.\n", true );
  87          }
  88  
  89          $this->output( 'VACUUM: ' );
  90          if ( $this->db->query( 'VACUUM' ) ) {
  91              clearstatcache();
  92              $newSize = filesize( $this->db->mDatabaseFile );
  93              $this->output( sprintf( "Database size was %d, now %d (%.1f%% reduction).\n",
  94                  $prevSize, $newSize, ( $prevSize - $newSize ) * 100.0 / $prevSize ) );
  95          } else {
  96              $this->output( 'Error\n' );
  97          }
  98      }
  99  
 100  	private function integrityCheck() {
 101          $this->output( "Performing database integrity checks:\n" );
 102          $res = $this->db->query( 'PRAGMA integrity_check' );
 103  
 104          if ( !$res || $res->numRows() == 0 ) {
 105              $this->error( "Error: integrity check query returned nothing.\n" );
 106  
 107              return;
 108          }
 109  
 110          foreach ( $res as $row ) {
 111              $this->output( $row->integrity_check );
 112          }
 113      }
 114  
 115  	private function backup( $fileName ) {
 116          $this->output( "Backing up database:\n   Locking..." );
 117          $this->db->query( 'BEGIN IMMEDIATE TRANSACTION', __METHOD__ );
 118          $ourFile = $this->db->mDatabaseFile;
 119          $this->output( "   Copying database file $ourFile to $fileName... " );
 120          wfSuppressWarnings( false );
 121          if ( !copy( $ourFile, $fileName ) ) {
 122              $err = error_get_last();
 123              $this->error( "      {$err['message']}" );
 124          }
 125          wfSuppressWarnings( true );
 126          $this->output( "   Releasing lock...\n" );
 127          $this->db->query( 'COMMIT TRANSACTION', __METHOD__ );
 128      }
 129  
 130  	private function checkSyntax() {
 131          if ( !Sqlite::IsPresent() ) {
 132              $this->error( "Error: SQLite support not found\n" );
 133          }
 134          $files = array( $this->getOption( 'check-syntax' ) );
 135          $files += $this->mArgs;
 136          $result = Sqlite::checkSqlSyntax( $files );
 137          if ( $result === true ) {
 138              $this->output( "SQL syntax check: no errors detected.\n" );
 139          } else {
 140              $this->error( "Error: $result\n" );
 141          }
 142      }
 143  }
 144  
 145  $maintClass = "SqliteMaintenance";
 146  require_once RUN_MAINTENANCE_IF_MAIN;


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1