Workaround for SQLite's inability to perform multi-row replacements
authorMax Semenik <maxsem@users.mediawiki.org>
Sun, 10 Jan 2010 17:27:46 +0000 (17:27 +0000)
committerMax Semenik <maxsem@users.mediawiki.org>
Sun, 10 Jan 2010 17:27:46 +0000 (17:27 +0000)
includes/db/DatabaseSqlite.php

index 457d895..159d373 100644 (file)
@@ -295,7 +295,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * Based on MySQL method (parent) with some prior SQLite-sepcific adjustments
+        * Based on generic method (parent) with some prior SQLite-sepcific adjustments
         */
        function insert( $table, $a, $fname = 'DatabaseSqlite::insert', $options = array() ) {
                if ( !count( $a ) ) return true;
@@ -319,6 +319,22 @@ class DatabaseSqlite extends DatabaseBase {
                return $ret;
        }
 
+       function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseSqlite::replace' ) {
+               if ( !count( $rows ) ) return true;
+       
+               # 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 )
+                               if ( !parent::replace( $table, $uniqueIndexes, $v, "$fname/multi-row" ) )
+                                       $ret = false;
+               } else {
+                       $ret = parent::replace( $table, $uniqueIndexes, $rows, "$fname/single-row" );
+               }
+
+               return $ret;
+       }
+
        /**
         * Returns the size of a text field, or -1 for "unlimited"
         * In SQLite this is SQLITE_MAX_LENGTH, by default 1GB. No way to query it though.