$wgResourceLoaderMinifierMaxLineLength, because there was little value in
making the behavior configurable. The default values (`false` for the former,
1000 for the latter) are now hard-coded.
+* $wgDebugDumpSqlLength was removed (deprecated in 1.24).
+* $wgDebugDBTransactions was removed (deprecated in 1.20).
=== New features in 1.27 ===
* $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
'PostgresBlob' => __DIR__ . '/includes/db/DatabasePostgres.php',
'PostgresField' => __DIR__ . '/includes/db/DatabasePostgres.php',
'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
- 'PostgresTransactionState' => __DIR__ . '/includes/db/DatabasePostgres.php',
'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
'Preferences' => __DIR__ . '/includes/Preferences.php',
'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
* Insert a block into the block table. Will fail if there is a conflicting
* block (same name and options) already in the database.
*
- * @param DatabaseBase $dbw If you have one available
+ * @param IDatabase $dbw If you have one available
* @return bool|array False on failure, assoc array on success:
* ('id' => block ID, 'autoIds' => array of autoblock IDs)
*/
/**
* Get an array suitable for passing to $dbw->insert() or $dbw->update()
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @return array
*/
protected function getDatabaseArray( $db = null ) {
*/
$wgDebugComments = false;
-/**
- * Extensive database transaction state debugging
- *
- * @since 1.20
- */
-$wgDebugDBTransactions = false;
-
/**
* Write SQL queries to the debug log.
*
*/
$wgDebugDumpSql = false;
-/**
- * Trim logged SQL queries to this many bytes. Set 0/false/null to do no
- * trimming.
- * @since 1.24
- */
-$wgDebugDumpSqlLength = 500;
-
/**
* Performance expectations for DB usage
*
* make additional queries to pull source data while the
* main query is still running.
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
* WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
* - offset: non-inclusive offset at which to start the query
* Load a page revision from a given revision ID number.
* Returns null if no such revision can be found.
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param int $id
* @return Revision|null
*/
* that's attached to a given page. If not attached
* to that page, will return null.
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param int $pageid
* @param int $id
* @return Revision|null
* that's attached to a given page. If not attached
* to that page, will return null.
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param Title $title
* @param int $id
* @return Revision|null
* WARNING: Timestamps may in some circumstances not be unique,
* so this isn't the best key to use.
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param Title $title
* @param string $timestamp
* @return Revision|null
* Given a set of conditions, fetch a revision from
* the given database connection.
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param array $conditions
* @param int $flags (optional)
* @return Revision|null
* which will return matching database rows with the
* fields necessary to build Revision objects.
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param array $conditions
* @param int $flags (optional)
* @return ResultWrapper
/**
* Do a batched query to get the parent revision lengths
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param array $revIds
* @return array
*/
* Get previous revision Id for this page_id
* This is used to populate rev_parent_id on save
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @return int
*/
private function getPreviousRevisionId( $db ) {
* Insert a new revision into the database, returning the new revision ID
* number on success and dies horribly on failure.
*
- * @param DatabaseBase $dbw (master connection)
+ * @param IDatabase $dbw (master connection)
* @throws MWException
* @return int
*/
* Such revisions can for instance identify page rename
* operations and other such meta-modifications.
*
- * @param DatabaseBase $dbw
+ * @param IDatabase $dbw
* @param int $pageId ID number of the page to read from
* @param string $summary Revision's summary
* @param bool $minor Whether the revision should be considered as minor
/**
* Get count of revisions per page...not very efficient
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param int $id Page id
* @return int
*/
/**
* Get count of revisions per page...not very efficient
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param Title $title
* @return int
*/
* @since 1.20
* @deprecated since 1.24
*
- * @param DatabaseBase|int $db The Database to perform the check on. May be given as a
+ * @param IDatabase|int $db The Database to perform the check on. May be given as a
* Database object or a database identifier usable with wfGetDB.
* @param int $pageId The ID of the page in question
* @param int $userId The ID of the user in question
/**
* Do the DB query to iterate through the objects.
- * @param DatabaseBase $db DatabaseBase object to use for the query
+ * @param IDatabase $db DatabaseBase object to use for the query
*/
abstract public function doQuery( $db );
}
/**
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @return mixed
*/
public function doQuery( $db ) {
}
/**
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @return bool|ResultWrapper
*/
static function doLoad( $db ) {
* Do all updates and commit them. More or less a replacement
* for the original initStats, but without output.
*
- * @param DatabaseBase|bool $database
+ * @param IDatabase|bool $database
* - Boolean: whether to use the master DB
* - DatabaseBase: database connection to use
* @param array $options Array of options, may contain the following values
/**
* Get the last touched timestamp
*
- * @param DatabaseBase $db Optional db
+ * @param IDatabase $db Optional db
* @return string Last-touched timestamp
*/
public function getTouched( $db = null ) {
*
* @see newFromId()
* @see newFromName()
- * @param DatabaseBase $db Db connection
+ * @param IDatabase $db Db connection
* @param string $database Database name
* @param string $name User name
* @param int $id User ID
/**
* @deprecated since 1.25, always returns empty string
- * @param DatabaseBase|bool $db
+ * @param IDatabase|bool $db
* @return string
*/
public function getModuleProfileName( $db = false ) {
* Note that the query result must include the columns returned by
* $this->getPageTableFields().
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param ResultWrapper $queryResult Query result object
*/
public function populateFromQueryResult( $db, $queryResult ) {
/**
* Set the Database object to use
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
*/
public function setDB( $db ) {
$this->db = $db;
* Construct a WHERE clause which will match all the given titles.
*
* @param string $prefix The appropriate table's field name prefix ('page', 'pl', etc)
- * @param DatabaseBase $db DatabaseBase object to use
+ * @param IDatabase $db DatabaseBase object to use
* @return string|bool String with SQL where clause fragment, or false if no items.
*/
public function constructSet( $prefix, $db ) {
}
/**
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @return mixed
*/
public function doQuery( $db ) {
}
/**
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @return mixed
*/
public function doQuery( $db ) {
* - DBO_PERSISTENT: use persistant database connection
*/
public function setFlag( $flag ) {
- global $wgDebugDBTransactions;
$this->mFlags |= $flag;
- if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
- wfDebug( "Implicit transactions are now enabled.\n" );
- }
}
/**
* - DBO_PERSISTENT: use persistant database connection
*/
public function clearFlag( $flag ) {
- global $wgDebugDBTransactions;
$this->mFlags &= ~$flag;
- if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
- wfDebug( "Implicit transactions are now disabled.\n" );
- }
}
/**
* @param array $params Parameters passed from DatabaseBase::factory()
*/
function __construct( array $params ) {
- global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode, $wgDebugDBTransactions;
+ global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode;
$server = $params['host'];
$user = $params['user'];
if ( $this->mFlags & DBO_DEFAULT ) {
if ( $wgCommandLineMode ) {
$this->mFlags &= ~DBO_TRX;
- if ( $wgDebugDBTransactions ) {
- wfDebug( "Implicit transaction open disabled.\n" );
- }
} else {
$this->mFlags |= DBO_TRX;
- if ( $wgDebugDBTransactions ) {
- wfDebug( "Implicit transaction open enabled.\n" );
- }
}
}
* for a successful read query, or false on failure if $tempIgnore set
*/
public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
- global $wgUser, $wgDebugDBTransactions, $wgDebugDumpSqlLength;
+ global $wgUser;
$this->mLastQuery = $sql;
$commentedSql = preg_replace( '/\s|$/', " /* $fname $userName */ ", $sql, 1 );
if ( !$this->mTrxLevel && $this->getFlag( DBO_TRX ) && $this->isTransactableQuery( $sql ) ) {
- if ( $wgDebugDBTransactions ) {
- wfDebug( "Implicit transaction start.\n" );
- }
$this->begin( __METHOD__ . " ($fname)" );
$this->mTrxAutomatic = true;
}
}
if ( $this->debug() ) {
- static $cnt = 0;
-
- $cnt++;
- $sqlx = $wgDebugDumpSqlLength ? substr( $commentedSql, 0, $wgDebugDumpSqlLength )
- : $commentedSql;
- $sqlx = strtr( $sqlx, "\t\n", ' ' );
-
- $master = $isMaster ? 'master' : 'slave';
- wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
+ wfDebugLog( 'queries', sprintf( "%s: %s", $this->mDBname, $sql ) );
}
$queryId = MWDebug::query( $sql, $fname, $isMaster );
*
* @return string
*/
- static function generalizeSQL( $sql ) {
+ protected static function generalizeSQL( $sql ) {
# This does the same as the regexp below would do, but in such a way
# as to avoid crashing php on some large strings.
# $sql = preg_replace( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql );
* @throws DBError
*/
final public function begin( $fname = __METHOD__ ) {
- global $wgDebugDBTransactions;
-
if ( $this->mTrxLevel ) { // implicit commit
if ( $this->mTrxAtomicLevels ) {
// If the current transaction was an automatic atomic one, then we definitely have
) )
);
} else {
- // if the transaction was automatic and has done write operations,
- // log it if $wgDebugDBTransactions is enabled.
- if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
+ // if the transaction was automatic and has done write operations
+ if ( $this->mTrxDoneWrites ) {
wfDebug( "$fname: Automatic transaction with writes in progress" .
" (from {$this->mTrxFname}), performing implicit commit!\n"
);
}
}
-/**
- * Used to debug transaction processing
- * Only used if $wgDebugDBTransactions is true
- *
- * @since 1.19
- * @ingroup Database
- */
-class PostgresTransactionState {
- private static $WATCHED = array(
- array(
- "desc" => "%s: Connection state changed from %s -> %s\n",
- "states" => array(
- PGSQL_CONNECTION_OK => "OK",
- PGSQL_CONNECTION_BAD => "BAD"
- )
- ),
- array(
- "desc" => "%s: Transaction state changed from %s -> %s\n",
- "states" => array(
- PGSQL_TRANSACTION_IDLE => "IDLE",
- PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
- PGSQL_TRANSACTION_INTRANS => "TRANS",
- PGSQL_TRANSACTION_INERROR => "ERROR",
- PGSQL_TRANSACTION_UNKNOWN => "UNKNOWN"
- )
- )
- );
-
- /** @var array */
- private $mNewState;
-
- /** @var array */
- private $mCurrentState;
-
- public function __construct( $conn ) {
- $this->mConn = $conn;
- $this->update();
- $this->mCurrentState = $this->mNewState;
- }
-
- public function update() {
- $this->mNewState = array(
- pg_connection_status( $this->mConn ),
- pg_transaction_status( $this->mConn )
- );
- }
-
- public function check() {
- global $wgDebugDBTransactions;
- $this->update();
- if ( $wgDebugDBTransactions ) {
- if ( $this->mCurrentState !== $this->mNewState ) {
- $old = reset( $this->mCurrentState );
- $new = reset( $this->mNewState );
- foreach ( self::$WATCHED as $watched ) {
- if ( $old !== $new ) {
- $this->log_changed( $old, $new, $watched );
- }
- $old = next( $this->mCurrentState );
- $new = next( $this->mNewState );
- }
- }
- }
- $this->mCurrentState = $this->mNewState;
- }
-
- protected function describe_changed( $status, $desc_table ) {
- if ( isset( $desc_table[$status] ) ) {
- return $desc_table[$status];
- } else {
- return "STATUS " . $status;
- }
- }
-
- protected function log_changed( $old, $new, $watched ) {
- wfDebug( sprintf( $watched["desc"],
- $this->mConn,
- $this->describe_changed( $old, $watched["states"] ),
- $this->describe_changed( $new, $watched["states"] )
- ) );
- }
-}
-
/**
* Manage savepoints within a transaction
* @ingroup Database
}
protected function query( $keyword, $msg_ok, $msg_failed ) {
- global $wgDebugDBTransactions;
if ( $this->dbw->doQuery( $keyword . " " . $this->id ) !== false ) {
- if ( $wgDebugDBTransactions ) {
- wfDebug( sprintf( $msg_ok, $this->id ) );
- }
} else {
wfDebug( sprintf( $msg_failed, $this->id ) );
}
/** @var string Connect string to open a PostgreSQL connection */
private $connectString;
- /** @var PostgresTransactionState */
- private $mTransactionState;
-
/** @var string */
private $mCoreSchema;
}
$this->mOpened = true;
- $this->mTransactionState = new PostgresTransactionState( $this->mConn );
global $wgCommandLineMode;
# If called from the command-line (e.g. importDump), only show errors
if ( function_exists( 'mb_convert_encoding' ) ) {
$sql = mb_convert_encoding( $sql, 'UTF-8' );
}
- $this->mTransactionState->check();
if ( pg_send_query( $this->mConn, $sql ) === false ) {
throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
}
$this->mLastResult = pg_get_result( $this->mConn );
- $this->mTransactionState->check();
$this->mAffectedRows = null;
if ( pg_result_error( $this->mLastResult ) ) {
return false;
}
/**
- * @param DatabaseBase $dbw
+ * @param IDatabase $dbw
* @return bool|mixed
*/
public static function cacheUpdate( $dbw ) {
/**
* Get the 'blobs' table name for this database
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @return string Table name ('blobs' by default)
*/
function getTable( $db ) {
}
/**
- * @param DatabaseBase $dbr
+ * @param IDatabase $dbr
* @param string $fname
* @return array|bool
*/
/**
* SQL clause to skip forbidden log types for this user
*
- * @param DatabaseBase $db
+ * @param IDatabase $db
* @param string $audience Public/user
* @param User $user User to check, or null to use $wgUser
* @return string|bool String on success, false on failure.
* @throws MWException
*/
protected function getDB( $serverIndex ) {
- global $wgDebugDBTransactions;
-
if ( !isset( $this->conns[$serverIndex] ) ) {
if ( $serverIndex >= $this->numServers ) {
throw new MWException( __METHOD__ . ": Invalid server index \"$serverIndex\"" );
# If server connection info was given, use that
if ( $this->serverInfos ) {
- if ( $wgDebugDBTransactions ) {
- $this->logger->debug( "Using provided serverInfo for SqlBagOStuff" );
- }
$info = $this->serverInfos[$serverIndex];
$type = isset( $info['type'] ) ? $info['type'] : 'mysql';
$host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
$db = wfGetDB( $index );
}
}
- if ( $wgDebugDBTransactions ) {
- $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
- }
+ $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
$this->conns[$serverIndex] = $db;
}
/**
* Fetch a page record with the given conditions
- * @param DatabaseBase $dbr
+ * @param IDatabase $dbr
* @param array $conditions
* @param array $options
* @return object|bool Database result resource, or false on failure
* Fetch a page record matching the Title object's namespace and title
* using a sanitized title string
*
- * @param DatabaseBase $dbr
+ * @param IDatabase $dbr
* @param Title $title
* @param array $options
* @return object|bool Database result resource, or false on failure
/**
* Fetch a page record matching the requested ID
*
- * @param DatabaseBase $dbr
+ * @param IDatabase $dbr
* @param int $id
* @param array $options
* @return object|bool Database result resource, or false on failure
* or else the record will be left in a funky state.
* Best if all done inside a transaction.
*
- * @param DatabaseBase $dbw
+ * @param IDatabase $dbw
* @return int|bool The newly created page_id key; false if the title already existed
*/
public function insertOn( $dbw ) {
/**
* Update the page record to point to a newly saved revision.
*
- * @param DatabaseBase $dbw
+ * @param IDatabase $dbw
* @param Revision $revision For ID number, and text used to set
* length and redirect status fields
* @param int $lastRevision If given, will not overwrite the page field
/**
* Add row to the redirect table if this is a redirect, remove otherwise.
*
- * @param DatabaseBase $dbw
+ * @param IDatabase $dbw
* @param Title $redirectTitle Title object pointing to the redirect target,
* or NULL if this is not a redirect
* @param null|bool $lastRevIsRedirect If given, will optimize adding and
*
* @deprecated since 1.24, use updateRevisionOn instead
*
- * @param DatabaseBase $dbw
+ * @param IDatabase $dbw
* @param Revision $revision
* @return bool
*/
*/
class SearchDatabase extends SearchEngine {
/**
- * @var DatabaseBase Slave database for reading from for results
+ * @var IDatabase Slave database for reading from for results
*/
protected $db;
/**
* Constructor
- * @param DatabaseBase $db The database to search from
+ * @param IDatabase $db The database to search from
*/
- public function __construct( DatabaseBase $db = null ) {
+ public function __construct( IDatabase $db = null ) {
if ( $db ) {
$this->db = $db;
} else {
private $key;
/**
- * @param DatabaseBase $db The database to read from
+ * @param IDatabase $db The database to read from
* @param string $table The name of the table to read from
* @param string|array $primaryKey The name or names of the primary key columns
* @param integer $batchSize The number of rows to fetch per iteration
* @throws MWException
*/
- public function __construct( DatabaseBase $db, $table, $primaryKey, $batchSize ) {
+ public function __construct( IDatabase $db, $table, $primaryKey, $batchSize ) {
if ( $batchSize < 1 ) {
throw new MWException( 'Batch size must be at least 1 row.' );
}
protected $clusterName;
/**
- * @param DatabaseBase $db The database to write to
+ * @param IDatabase $db The database to write to
* @param string $table The name of the table to update
* @param string|bool $clusterName A cluster name valid for use with LBFactory
*/
- public function __construct( DatabaseBase $db, $table, $clusterName = false ) {
+ public function __construct( IDatabase $db, $table, $clusterName = false ) {
$this->db = $db;
$this->table = $table;
$this->clusterName = $clusterName;