Allow configuring the transaction locking mode for SQLite
authorAaron Schulz <aschulz@wikimedia.org>
Tue, 24 Feb 2015 00:32:00 +0000 (16:32 -0800)
committerTim Starling <tstarling@wikimedia.org>
Thu, 26 Feb 2015 01:21:20 +0000 (01:21 +0000)
Bug: T89180
Change-Id: Ib18347299ea78f9b31e56313b2acf749f693cddb

includes/db/DatabaseSqlite.php

index 7b04716..0b51972 100644 (file)
@@ -32,6 +32,9 @@ class DatabaseSqlite extends DatabaseBase {
        /** @var string File name for SQLite database file */
        public $mDatabaseFile;
 
+       /** @var string Transaction mode */
+       protected $trxMode;
+
        /** @var int The number of rows affected as an integer */
        protected $mAffectedRows;
 
@@ -44,6 +47,11 @@ class DatabaseSqlite extends DatabaseBase {
        /** @var FSLockManager (hopefully on the same server as the DB) */
        protected $lockMgr;
 
+       /**
+        * Additional params include:
+        *   - trxMode : one of (deferred, immediate, exclusive)
+        * @param array $p
+        */
        function __construct( array $p ) {
                global $wgSharedDB, $wgSQLiteDataDir;
 
@@ -58,6 +66,12 @@ class DatabaseSqlite extends DatabaseBase {
                        }
                }
 
+               $this->trxMode = isset( $p['trxMode'] ) ? strtoupper( $p['trxMode'] ) : null;
+               if ( $this->trxMode && !in_array( $this->trxMode, array( 'IMMEDIATE', 'EXCLUSIVE' ) ) ) {
+                       $this->trxMode = null;
+                       wfWarn( "Invalid SQLite transaction mode provided." );
+               }
+
                $this->lockMgr = new FSLockManager( array( 'lockDirectory' => "$wgSQLiteDataDir/locks" ) );
        }
 
@@ -697,6 +711,15 @@ class DatabaseSqlite extends DatabaseBase {
                return false;
        }
 
+       protected function doBegin( $fname = '' ) {
+               if ( $this->trxMode ) {
+                       $this->query( "BEGIN {$this->trxMode}", $fname );
+               } else {
+                       $this->query( 'BEGIN', $fname );
+               }
+               $this->mTrxLevel = 1;
+       }
+
        /**
         * @param string $s
         * @return string