Follow-up 36f4daf32c: allow no-write database connections to use transactions
[lhc/web/wiklou.git] / includes / libs / rdbms / database / Database.php
index 7f0718c..3d40417 100644 (file)
@@ -236,6 +236,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        /** @var TransactionProfiler */
        protected $trxProfiler;
 
+       /**
+        * @var bool Whether writing is allowed on this connection.
+        *      Should be false for connections to replicas.
+        */
+       protected $allowWrite = true;
+
        /**
         * Constructor and database handle and attempt to connect to the DB server
         *
@@ -277,6 +283,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->connLogger = $params['connLogger'];
                $this->queryLogger = $params['queryLogger'];
                $this->errorLogger = $params['errorLogger'];
+               $this->allowWrite = empty( $params['noWrite'] );
 
                // Set initial dummy domain until open() sets the final DB/prefix
                $this->currentDomain = DatabaseDomain::newUnspecified();
@@ -908,6 +915,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                if ( $isWrite ) {
+                       if ( !$this->allowWrite ) {
+                               throw new DBError(
+                                       $this,
+                                       'Write operations are not allowed on this database connection!'
+                               );
+                       }
+
                        # In theory, non-persistent writes are allowed in read-only mode, but due to things
                        # like https://bugs.mysql.com/bug.php?id=33669 that might not work anyway...
                        $reason = $this->getReadOnlyReason();