From 22508bec75fb05546520398ac0a195c7c79ef87e Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Mon, 23 Feb 2015 16:32:00 -0800 Subject: [PATCH] Allow configuring the transaction locking mode for SQLite Bug: T89180 Change-Id: Ib18347299ea78f9b31e56313b2acf749f693cddb --- includes/db/DatabaseSqlite.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php index 7b04716f43..0b51972ee1 100644 --- a/includes/db/DatabaseSqlite.php +++ b/includes/db/DatabaseSqlite.php @@ -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 -- 2.20.1