/** @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
*
$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();
}
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();
* @see WANObjectCache::getWithSetCallback()
*
* @param IDatabase $db1
- * @param IDatabase $dbs,...
+ * @param IDatabase $db2 [optional]
* @return array Map of values:
* - lag: highest lag of any of the DBs or false on error (e.g. replication stopped)
* - since: oldest UNIX timestamp of any of the DB lag estimates
* - pending: whether any of the DBs have uncommitted changes
+ * @throws DBError
* @since 1.27
*/
- public static function getCacheSetOptions( IDatabase $db1 ) {
+ public static function getCacheSetOptions( IDatabase $db1, IDatabase $db2 = null ) {
$res = [ 'lag' => 0, 'since' => INF, 'pending' => false ];
foreach ( func_get_args() as $db ) {
/** @var IDatabase $db */