Daniel Kinzler has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/401507 )
Change subject: Introduce DBConnectionProxy base class.
......................................................................
Introduce DBConnectionProxy base class.
DBConnectionProxy is intended to act as a base class for IDatabase
implementations that delegate to an underlying IDatabase instance.
Change-Id: Ia6a3bfe2fbef2bed94ed87798f4158cb32a9ea35
---
M autoload.php
M includes/libs/rdbms/database/DBConnRef.php
A includes/libs/rdbms/database/DBConnectionProxy.php
3 files changed, 649 insertions(+), 568 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/07/401507/1
diff --git a/autoload.php b/autoload.php
index 4a8e18d..a225ad1 100644
--- a/autoload.php
+++ b/autoload.php
@@ -1657,6 +1657,7 @@
'Wikimedia\\Rdbms\\DBAccessError' => __DIR__ .
'/includes/libs/rdbms/exception/DBAccessError.php',
'Wikimedia\\Rdbms\\DBConnRef' => __DIR__ .
'/includes/libs/rdbms/database/DBConnRef.php',
'Wikimedia\\Rdbms\\DBConnectionError' => __DIR__ .
'/includes/libs/rdbms/exception/DBConnectionError.php',
+ 'Wikimedia\\Rdbms\\DBConnectionProxy' => __DIR__ .
'/includes/libs/rdbms/database/DBConnectionProxy.php',
'Wikimedia\\Rdbms\\DBError' => __DIR__ .
'/includes/libs/rdbms/exception/DBError.php',
'Wikimedia\\Rdbms\\DBExpectedError' => __DIR__ .
'/includes/libs/rdbms/exception/DBExpectedError.php',
'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ .
'/includes/libs/rdbms/database/position/DBMasterPos.php',
diff --git a/includes/libs/rdbms/database/DBConnRef.php
b/includes/libs/rdbms/database/DBConnRef.php
index ef2953e..445980f 100644
--- a/includes/libs/rdbms/database/DBConnRef.php
+++ b/includes/libs/rdbms/database/DBConnRef.php
@@ -12,13 +12,12 @@
* @ingroup Database
* @since 1.22
*/
-class DBConnRef implements IDatabase {
+class DBConnRef extends DBConnectionProxy {
/** @var ILoadBalancer */
private $lb;
- /** @var Database|null Live connection handle */
- private $conn;
+
/** @var array|null N-tuple of (server index, group,
DatabaseDomain|string) */
- private $params;
+ private $params = null;
const FLD_INDEX = 0;
const FLD_GROUP = 1;
@@ -27,597 +26,58 @@
/**
* @param ILoadBalancer $lb Connection manager for $conn
- * @param Database|array $conn Database handle or (server index, query
groups, domain, flags)
+ * @param IDatabase|array $conn Database handle or (server index, query
groups, domain, flags)
*/
public function __construct( ILoadBalancer $lb, $conn ) {
$this->lb = $lb;
- if ( $conn instanceof Database ) {
- $this->conn = $conn; // live handle
+
+ if ( $conn instanceof IDatabase ) {
+ parent::__construct( $conn );
} elseif ( count( $conn ) >= 4 && $conn[self::FLD_DOMAIN] !==
false ) {
$this->params = $conn;
+
+ $instantiator = function () {
+ list( $db, $groups, $wiki, $flags ) =
$this->params;
+ return $this->lb->getConnection( $db, $groups,
$wiki, $flags );
+ };
+
+ parent::__construct( $instantiator );
} else {
throw new InvalidArgumentException( "Missing lazy
connection arguments." );
}
}
- function __call( $name, array $arguments ) {
- if ( $this->conn === null ) {
- list( $db, $groups, $wiki, $flags ) = $this->params;
- $this->conn = $this->lb->getConnection( $db, $groups,
$wiki, $flags );
- }
-
- return call_user_func_array( [ $this->conn, $name ], $arguments
);
- }
-
- public function getServerInfo() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function bufferResults( $buffer = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function trxLevel() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function trxTimestamp() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function explicitTrxActive() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function tablePrefix( $prefix = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function dbSchema( $schema = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getLBInfo( $name = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setLBInfo( $name, $value = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setLazyMasterHandle( IDatabase $conn ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function implicitGroupby() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function implicitOrderby() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function lastQuery() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function doneWrites() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function lastDoneWrites() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function writesPending() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function writesOrCallbacksPending() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function pendingWriteQueryDuration( $type = self::ESTIMATE_TOTAL
) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function pendingWriteCallers() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function pendingWriteRowsAffected() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function isOpen() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function restoreFlags( $state = self::RESTORE_PRIOR ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getFlag( $flag ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getProperty( $name ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
public function getDomainID() {
- if ( $this->conn === null ) {
+ // Avoid triggering a database connection
+ if ( $this->params ) {
$domain = $this->params[self::FLD_DOMAIN];
- // Avoid triggering a database connection
return $domain instanceof DatabaseDomain ?
$domain->getId() : $domain;
}
- return $this->__call( __FUNCTION__, func_get_args() );
+ return parent::getDomainId();
}
public function getWikiID() {
return $this->getDomainID();
}
- public function getType() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function open( $server, $user, $password, $dbName ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function fetchObject( $res ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function fetchRow( $res ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function numRows( $res ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function numFields( $res ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function fieldName( $res, $n ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function insertId() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function dataSeek( $res, $row ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function lastErrno() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function lastError() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function fieldInfo( $table, $field ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function affectedRows() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getSoftwareLink() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getServerVersion() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function close() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function reportConnectionError( $error = 'Unknown error' ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function query( $sql, $fname = __METHOD__, $tempIgnore = false )
{
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function reportQueryError( $error, $errno, $sql, $fname,
$tempIgnore = false ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function freeResult( $res ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function selectField(
- $table, $var, $cond = '', $fname = __METHOD__, $options = [],
$join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function selectFieldValues(
- $table, $var, $cond = '', $fname = __METHOD__, $options = [],
$join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function select(
- $table, $vars, $conds = '', $fname = __METHOD__,
- $options = [], $join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function selectSQLText(
- $table, $vars, $conds = '', $fname = __METHOD__,
- $options = [], $join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function selectRow(
- $table, $vars, $conds, $fname = __METHOD__,
- $options = [], $join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function estimateRowCount(
- $table, $vars = '*', $conds = '', $fname = __METHOD__, $options
= []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function selectRowCount(
- $tables, $vars = '*', $conds = '', $fname = __METHOD__,
$options = [], $join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function fieldExists( $table, $field, $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function indexExists( $table, $index, $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function tableExists( $table, $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function indexUnique( $table, $index ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function insert( $table, $a, $fname = __METHOD__, $options = []
) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function update( $table, $values, $conds, $fname = __METHOD__,
$options = [] ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function makeList( $a, $mode = self::LIST_COMMA ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function aggregateValue( $valuedata, $valuename = 'value' ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function bitNot( $field ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function bitAnd( $fieldLeft, $fieldRight ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function bitOr( $fieldLeft, $fieldRight ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function buildConcat( $stringList ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function buildGroupConcatField(
- $delim, $table, $field, $conds = '', $join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function buildStringCast( $field ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function databasesAreIndependent() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function selectDB( $db ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getDBname() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getServer() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function addQuotes( $s ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function buildLike() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function anyChar() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function anyString() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function nextSequenceValue( $seqName ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function replace( $table, $uniqueIndexes, $rows, $fname =
__METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function upsert(
- $table, array $rows, array $uniqueIndexes, array $set, $fname =
__METHOD__
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function deleteJoin(
- $delTable, $joinTable, $delVar, $joinVar, $conds, $fname =
__METHOD__
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function delete( $table, $conds, $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function insertSelect(
- $destTable, $srcTable, $varMap, $conds,
- $fname = __METHOD__, $insertOptions = [], $selectOptions = [],
$selectJoinConds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function unionSupportsOrderAndLimit() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function unionQueries( $sqls, $all ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function unionConditionPermutations(
- $table, $vars, array $permute_conds, $extra_conds = '', $fname
= __METHOD__,
- $options = [], $join_conds = []
- ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function conditional( $cond, $trueVal, $falseVal ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function strreplace( $orig, $old, $new ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getServerUptime() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function wasDeadlock() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function wasLockTimeout() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function wasErrorReissuable() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function wasReadOnlyError() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function masterPosWait( DBMasterPos $pos, $timeout ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getReplicaPos() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getMasterPos() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function serverIsReadOnly() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function onTransactionResolution( callable $callback, $fname =
__METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function onTransactionIdle( callable $callback, $fname =
__METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function onTransactionPreCommitOrIdle( callable $callback,
$fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setTransactionListener( $name, callable $callback =
null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function startAtomic( $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function endAtomic( $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function doAtomicSection( $fname, callable $callback ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function begin( $fname = __METHOD__, $mode =
IDatabase::TRANSACTION_EXPLICIT ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function commit( $fname = __METHOD__, $flush = '' ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function rollback( $fname = __METHOD__, $flush = '' ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function flushSnapshot( $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function listTables( $prefix = null, $fname = __METHOD__ ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function timestamp( $ts = 0 ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function timestampOrNull( $ts = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function ping( &$rtt = null ) {
- return func_num_args()
- ? $this->__call( __FUNCTION__, [ &$rtt ] )
- : $this->__call( __FUNCTION__, [] ); // method cares
about null vs missing
- }
-
- public function getLag() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getSessionLagStatus() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function maxListLen() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function encodeBlob( $b ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function decodeBlob( $b ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setSessionOptions( array $options ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setSchemaVars( $vars ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function lockIsFree( $lockName, $method ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function lock( $lockName, $method, $timeout = 5 ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function unlock( $lockName, $method ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getScopedLockAndFlush( $lockKey, $fname, $timeout ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function namedLocksEnqueue() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function getInfinity() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function encodeExpiry( $expiry ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function decodeExpiry( $expiry, $format = TS_MW ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setBigSelects( $value = true ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function isReadOnly() {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
- public function setTableAliases( array $aliases ) {
- return $this->__call( __FUNCTION__, func_get_args() );
- }
-
/**
* Clean up the connection when out of scope
*/
function __destruct() {
- if ( $this->conn ) {
- $this->lb->reuseConnection( $this->conn );
+ if ( $this->connection ) {
+ $this->lb->reuseConnection( $this->connection );
}
}
+
+ public function __toString() {
+ if ( $this->connection ) {
+ return get_class( $this ) . '(' . $this->connection .
')';
+ } else {
+ return get_class( $this ) . '(' . $this->getDomainID()
. ')';
+ }
+ }
+
}
class_alias( DBConnRef::class, 'DBConnRef' );
diff --git a/includes/libs/rdbms/database/DBConnectionProxy.php
b/includes/libs/rdbms/database/DBConnectionProxy.php
new file mode 100644
index 0000000..131d96c
--- /dev/null
+++ b/includes/libs/rdbms/database/DBConnectionProxy.php
@@ -0,0 +1,620 @@
+<?php
+
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+use Wikimedia\Assert\Assert;
+
+/**
+ * Abstract base class for implementations of IDatabase that proxy all (or
most)
+ * calls to an underlying IDatabase instance.
+ *
+ * @note: proxy methods are defined explicitly to avoid interface errors
+ *
+ * @ingroup Database
+ * @since 1.31
+ */
+abstract class DBConnectionProxy implements IDatabase {
+
+ /**
+ * @var IDatabase|null A database connection handle.
+ * If this is null null, $connectionInstantiator must be set.
+ */
+ protected $connection;
+
+ /**
+ * @var callable|null An instantiator callback returning an IDatabase
object
+ */
+ private $connectionInstantiator;
+
+ /**
+ * @param IDatabase|callable $conn Database handle, or a callback
returning a database handle.
+ */
+ public function __construct( $conn ) {
+ if ( $conn instanceof IDatabase ) {
+ $this->connection = $conn; // live handle
+ } elseif ( is_callable( $conn ) ) {
+ $this->connectionInstantiator = $conn; // instantiator
callback
+ } else {
+ throw new InvalidArgumentException(
+ '$conn must be an IDatabase instance of a
callable instantiator'
+ . ' that will return an IDatabase instance.'
+ );
+ }
+ }
+
+ function __call( $name, array $arguments ) {
+ if ( $this->connection === null ) {
+ $connection = call_user_func(
$this->connectionInstantiator );
+
+ Assert::postcondition(
+ $connection instanceof IDatabase,
+ 'Instantiator is expected to return an
IDatabase instance'
+ );
+
+ $this->connection = $connection;
+ }
+
+ return call_user_func_array( [ $this->connection, $name ],
$arguments );
+ }
+
+ public function getServerInfo() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function bufferResults( $buffer = null ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function trxLevel() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function trxTimestamp() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function explicitTrxActive() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function tablePrefix( $prefix = null ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function dbSchema( $schema = null ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getLBInfo( $name = null ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setLBInfo( $name, $value = null ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setLazyMasterHandle( IDatabase $conn ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function implicitGroupby() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function implicitOrderby() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function lastQuery() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function doneWrites() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function lastDoneWrites() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function writesPending() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function writesOrCallbacksPending() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function pendingWriteQueryDuration( $type = self::ESTIMATE_TOTAL
) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function pendingWriteCallers() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function pendingWriteRowsAffected() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function isOpen() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function restoreFlags( $state = self::RESTORE_PRIOR ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getFlag( $flag ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getProperty( $name ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getDomainID() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getWikiID() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getType() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function open( $server, $user, $password, $dbName ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function fetchObject( $res ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function fetchRow( $res ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function numRows( $res ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function numFields( $res ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function fieldName( $res, $n ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function insertId() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function dataSeek( $res, $row ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function lastErrno() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function lastError() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function fieldInfo( $table, $field ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function affectedRows() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getSoftwareLink() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getServerVersion() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function close() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function reportConnectionError( $error = 'Unknown error' ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function query( $sql, $fname = __METHOD__, $tempIgnore = false )
{
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function reportQueryError( $error, $errno, $sql, $fname,
$tempIgnore = false ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function freeResult( $res ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function selectField(
+ $table, $var, $cond = '', $fname = __METHOD__, $options = [],
$join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function selectFieldValues(
+ $table, $var, $cond = '', $fname = __METHOD__, $options = [],
$join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function select(
+ $table, $vars, $conds = '', $fname = __METHOD__,
+ $options = [], $join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function selectSQLText(
+ $table, $vars, $conds = '', $fname = __METHOD__,
+ $options = [], $join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function selectRow(
+ $table, $vars, $conds, $fname = __METHOD__,
+ $options = [], $join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function estimateRowCount(
+ $table, $vars = '*', $conds = '', $fname = __METHOD__, $options
= []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function selectRowCount(
+ $tables, $vars = '*', $conds = '', $fname = __METHOD__,
$options = [], $join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function fieldExists( $table, $field, $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function indexExists( $table, $index, $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function tableExists( $table, $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function indexUnique( $table, $index ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function insert( $table, $a, $fname = __METHOD__, $options = []
) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function update( $table, $values, $conds, $fname = __METHOD__,
$options = [] ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function makeList( $a, $mode = self::LIST_COMMA ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function aggregateValue( $valuedata, $valuename = 'value' ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function bitNot( $field ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function bitAnd( $fieldLeft, $fieldRight ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function bitOr( $fieldLeft, $fieldRight ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function buildConcat( $stringList ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function buildGroupConcatField(
+ $delim, $table, $field, $conds = '', $join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function buildStringCast( $field ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function databasesAreIndependent() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function selectDB( $db ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getDBname() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getServer() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function addQuotes( $s ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function buildLike() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function anyChar() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function anyString() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function nextSequenceValue( $seqName ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function replace( $table, $uniqueIndexes, $rows, $fname =
__METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function upsert(
+ $table, array $rows, array $uniqueIndexes, array $set, $fname =
__METHOD__
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function deleteJoin(
+ $delTable, $joinTable, $delVar, $joinVar, $conds, $fname =
__METHOD__
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function delete( $table, $conds, $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function insertSelect(
+ $destTable, $srcTable, $varMap, $conds,
+ $fname = __METHOD__, $insertOptions = [], $selectOptions = [],
$selectJoinConds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function unionSupportsOrderAndLimit() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function unionQueries( $sqls, $all ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function unionConditionPermutations(
+ $table, $vars, array $permute_conds, $extra_conds = '', $fname
= __METHOD__,
+ $options = [], $join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function conditional( $cond, $trueVal, $falseVal ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function strreplace( $orig, $old, $new ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getServerUptime() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function wasDeadlock() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function wasLockTimeout() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function wasErrorReissuable() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function wasReadOnlyError() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function masterPosWait( DBMasterPos $pos, $timeout ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getReplicaPos() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getMasterPos() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function serverIsReadOnly() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function onTransactionResolution( callable $callback, $fname =
__METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function onTransactionIdle( callable $callback, $fname =
__METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function onTransactionPreCommitOrIdle( callable $callback,
$fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setTransactionListener( $name, callable $callback =
null ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function startAtomic( $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function endAtomic( $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function doAtomicSection( $fname, callable $callback ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function begin( $fname = __METHOD__, $mode =
IDatabase::TRANSACTION_EXPLICIT ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function commit( $fname = __METHOD__, $flush = '' ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function rollback( $fname = __METHOD__, $flush = '' ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function flushSnapshot( $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function listTables( $prefix = null, $fname = __METHOD__ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function timestamp( $ts = 0 ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function timestampOrNull( $ts = null ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function ping( &$rtt = null ) {
+ return func_num_args()
+ ? $this->__call( __FUNCTION__, [ &$rtt ] )
+ : $this->__call( __FUNCTION__, [] ); // method cares
about null vs missing
+ }
+
+ public function getLag() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getSessionLagStatus() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function maxListLen() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function encodeBlob( $b ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function decodeBlob( $b ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setSessionOptions( array $options ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setSchemaVars( $vars ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function lockIsFree( $lockName, $method ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function lock( $lockName, $method, $timeout = 5 ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function unlock( $lockName, $method ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getScopedLockAndFlush( $lockKey, $fname, $timeout ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function namedLocksEnqueue() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function getInfinity() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function encodeExpiry( $expiry ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function decodeExpiry( $expiry, $format = TS_MW ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setBigSelects( $value = true ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function isReadOnly() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function setTableAliases( array $aliases ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
+ public function __toString() {
+ return get_class( $this ) . '( '. $this->__call( __FUNCTION__,
func_get_args() ) . ' )';
+ }
+
+}
--
To view, visit https://gerrit.wikimedia.org/r/401507
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia6a3bfe2fbef2bed94ed87798f4158cb32a9ea35
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Daniel Kinzler <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits