Start of bug 24853, killing off 'functional' parts of failfunction code. Seems when...
[lhc/web/wiklou.git] / includes / db / DatabaseSqlite.php
index 82ce5c9..1313252 100644 (file)
@@ -25,7 +25,6 @@ class DatabaseSqlite extends DatabaseBase {
         */
        function __construct( $server = false, $user = false, $password = false, $dbName = false, $failFunction = false, $flags = 0 ) {
                global $wgSharedDB;
-               $this->mFailFunction = $failFunction;
                $this->mFlags = $flags;
                $this->mName = $dbName;
 
@@ -34,16 +33,6 @@ class DatabaseSqlite extends DatabaseBase {
                }
        }
 
-       /**
-        * Serialization handler, see http://php.net/manual/en/language.oop5.magic.php#language.oop5.magic.sleep
-        * for details. Instances of this class sometimes get serialized, e.g. with Title and its BacklinkCache
-        * Because attempts to serialize mConn end in "can't serialize PDO objects" exceptions, we simply disallow
-        * to serialize anything in this class.
-        */
-       function __sleep() {
-               return array();
-       }
-
        function getType() {
                return 'sqlite';
        }
@@ -88,14 +77,9 @@ class DatabaseSqlite extends DatabaseBase {
                } catch ( PDOException $e ) {
                        $err = $e->getMessage();
                }
-               if ( $this->mConn === false ) {
+               if ( !$this->mConn ) {
                        wfDebug( "DB connection error: $err\n" );
-                       if ( !$this->mFailFunction ) {
-                               throw new DBConnectionError( $this, $err );
-                       } else {
-                               return false;
-                       }
-
+                       throw new DBConnectionError( $this, $err );
                }
                $this->mOpened = !!$this->mConn;
                # set error codes only, don't raise exceptions
@@ -148,14 +132,19 @@ class DatabaseSqlite extends DatabaseBase {
         * @return String
         */
        function getFulltextSearchModule() {
+               static $cachedResult = null;
+               if ( $cachedResult !== null ) {
+                       return $cachedResult;
+               }
+               $cachedResult = false;
                $table = 'dummy_search_test';
                $this->query( "DROP TABLE IF EXISTS $table", __METHOD__ );
 
                if ( $this->query( "CREATE VIRTUAL TABLE $table USING FTS3(dummy_field)", __METHOD__, true ) ) {
                        $this->query( "DROP TABLE IF EXISTS $table", __METHOD__ );
-                       return 'FTS3';
+                       $cachedResult = 'FTS3';
                }
-               return false;
+               return $cachedResult;
        }
 
        /**
@@ -266,6 +255,8 @@ class DatabaseSqlite extends DatabaseBase {
         * Use MySQL's naming (accounts for prefix etc) but remove surrounding backticks
         */
        function tableName( $name ) {
+               // table names starting with sqlite_ are reserved
+               if ( strpos( $name, 'sqlite_' ) === 0 ) return $name;
                return str_replace( '`', '', parent::tableName( $name ) );
        }
 
@@ -392,7 +383,7 @@ class DatabaseSqlite extends DatabaseBase {
                # SQLite can't handle multi-row inserts, so divide up into multiple single-row inserts
                if ( isset( $a[0] ) && is_array( $a[0] ) ) {
                        $ret = true;
-                       foreach ( $a as $k => $v ) {
+                       foreach ( $a as $v ) {
                                if ( !parent::insert( $table, $v, "$fname/multi-row", $options ) ) {
                                        $ret = false;
                                }
@@ -410,7 +401,7 @@ class DatabaseSqlite extends DatabaseBase {
                # SQLite can't handle multi-row replaces, so divide up into multiple single-row queries
                if ( isset( $rows[0] ) && is_array( $rows[0] ) ) {
                        $ret = true;
-                       foreach ( $rows as $k => $v ) {
+                       foreach ( $rows as $v ) {
                                if ( !parent::replace( $table, $uniqueIndexes, $v, "$fname/multi-row" ) ) {
                                        $ret = false;
                                }
@@ -466,6 +457,13 @@ class DatabaseSqlite extends DatabaseBase {
                return $ver;
        }
 
+       /**
+        * @return string User-friendly database information
+        */
+       public function getServerInfo() {
+               return wfMsg( $this->getFulltextSearchModule() ? 'sqlite-has-fts' : 'sqlite-no-fts', $this->getServerVersion() );
+       }
+
        /**
         * Get information about a given field
         * Returns false if the field does not exist.
@@ -540,8 +538,8 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * Called by the installer script (when modified according to the MediaWikiLite installation instructions)
-        * - this is the same way PostgreSQL works, MySQL reads in tables.sql and interwiki.sql using dbsource (which calls db->sourceFile)
+        * Called by the installer script
+        * - this is the same way PostgreSQL works, MySQL reads in tables.sql and interwiki.sql using DatabaseBase::sourceFile()
         */
        public function setup_database() {
                global $IP;
@@ -560,12 +558,12 @@ class DatabaseSqlite extends DatabaseBase {
                        dieout( "Could not find the interwiki.sql file." );
                }
 
-               $sql = "INSERT INTO interwiki(iw_prefix,iw_url,iw_local) VALUES ";
+               $sql = "INSERT INTO interwiki(iw_prefix,iw_url,iw_local,iw_api,iw_wikiid) VALUES ";
                while ( !feof( $f ) ) {
                        $line = fgets( $f, 1024 );
                        $matches = array();
                        if ( !preg_match( '/^\s*(\(.+?),(\d)\)/', $line, $matches ) ) continue;
-                       $this->query( "$sql $matches[1],$matches[2])" );
+                       $this->query( "$sql $matches[1],$matches[2],'','')" );
                }
        }
 
@@ -592,7 +590,9 @@ class DatabaseSqlite extends DatabaseBase {
                        // no such thing as unsigned
                        $s = preg_replace( '/\b(un)?signed\b/i', '', $s );
                        // INT -> INTEGER
-                       $s = preg_replace( '/\b(tiny|small|medium|big|)int(\s*\([\s\d]*\)|\b)/i', 'INTEGER', $s );
+                       $s = preg_replace( '/\b(tiny|small|medium|big|)int(\s*\(\s*\d+\s*\)|\b)/i', 'INTEGER', $s );
+                       // floating point types -> REAL
+                       $s = preg_replace( '/\b(float|double(\s+precision)?)(\s*\(\s*\d+\s*(,\s*\d+\s*)?\)|\b)/i', 'REAL', $s );
                        // varchar -> TEXT
                        $s = preg_replace( '/\b(var)?char\s*\(.*?\)/i', 'TEXT', $s );
                        // TEXT normalization
@@ -647,6 +647,7 @@ class DatabaseSqlite extends DatabaseBase {
 class DatabaseSqliteStandalone extends DatabaseSqlite {
        public function __construct( $fileName, $flags = 0 ) {
                $this->mFlags = $flags;
+               $this->tablePrefix( null );
                $this->openFile( $fileName );
        }
 }