$conf->RootUser,
$conf->RootPW,
false,
+ false,
1
);
if ( !$wgDatabase->isOpen() ) {
$wgDBadminuser = $conf->RootUser;
$wgDBadminpassword = $conf->RootPW;
echo "<li>Attempting to create DB user.</li>";
- $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBadminuser, $wgDBadminpassword, $wgDBname, 64);
+ $wgDatabase = $dbc->newFromParams('DUMMY', $wgDBadminuser, $wgDBadminpassword, $wgDBname, 1, 64);
if ($wgDatabase->isOpen()) {
$wgDBOracleDefTS = $conf->DBdefTS_ora;
$wgDBOracleTempTS = $conf->DBtempTS_ora;
protected $mServer, $mUser, $mPassword, $mConn = null, $mDBname;
protected $mOpened = false;
+ protected $mFailFunction;
protected $mTablePrefix;
protected $mFlags;
protected $mTrxLevel = 0;
#------------------------------------------------------------------------------
# These optionally set a variable and return the previous state
+ /**
+ * Fail function, takes a Database as a parameter
+ * Set to false for default, 1 for ignore errors
+ */
+ function failFunction( $function = null ) {
+ return wfSetVar( $this->mFailFunction, $function );
+ }
+
/**
* Boolean, controls output of large amounts of debug information
*/
* @param $user String: database user name
* @param $password String: database user password
* @param $dbName String: database name
+ * @param $failFunction
* @param $flags
* @param $tablePrefix String: database table prefixes. By default use the prefix gave in LocalSettings.php
*/
function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $flags = 0, $tablePrefix = 'get from global' ) {
+ $failFunction = false, $flags = 0, $tablePrefix = 'get from global' ) {
global $wgOut, $wgDBprefix, $wgCommandLineMode;
# Can't get a reference if it hasn't been set yet
$wgOut = null;
}
+ $this->mFailFunction = $failFunction;
$this->mFlags = $flags;
if ( $this->mFlags & DBO_DEFAULT ) {
* @param $user String: database user name
* @param $password String: database user password
* @param $dbName String: database name
+ * @param failFunction
* @param $flags
*/
- static function newFromParams( $server, $user, $password, $dbName, $flags = 0 )
+ static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0 )
{
wfDeprecated( __METHOD__ );
- return new DatabaseMysql( $server, $user, $password, $dbName, $flags );
+ return new DatabaseMysql( $server, $user, $password, $dbName, $failFunction, $flags );
}
/**
* Usually aborts on failure
+ * If the failFunction is set to a non-zero integer, returns success
* @param $server String: database server host
* @param $user String: database user name
* @param $password String: database user password
$error = $myError;
}
- throw new DBConnectionError( $this, $error );
+ if ( $this->mFailFunction ) {
+ # Legacy error handling method
+ if ( !is_int( $this->mFailFunction ) ) {
+ $ff = $this->mFailFunction;
+ $ff( $this, $error );
+ }
+ } else {
+ # New method
+ throw new DBConnectionError( $this, $error );
+ }
}
/**
protected $mServer, $mUser, $mPassword, $mConn = null, $mDBname;
protected $mOut, $mOpened = false;
+ protected $mFailFunction;
protected $mTablePrefix;
protected $mFlags;
protected $mTrxLevel = 0;
* These can be safely inherited
*
* Getter/Setter: (18)
+ * failFunction
* bufferResults
* ignoreErrors
* trxLevel
* @param $user String: username
* @param $password String: password
* @param $dbName String: database name on the server
+ * @param $failFunction Callback (optional)
* @param $flags Integer: database behaviour flags (optional, unused)
* @param $schema String
*/
public function DatabaseIbm_db2($server = false, $user = false, $password = false,
- $dbName = false, $flags = 0,
+ $dbName = false, $failFunction = false, $flags = 0,
$schema = self::USE_GLOBAL )
{
+
global $wgOut, $wgDBmwschema;
# Can't get a reference if it hasn't been set yet
if ( !isset( $wgOut ) ) {
$wgOut = null;
}
$this->mOut =& $wgOut;
+ $this->mFailFunction = $failFunction;
$this->mFlags = DBO_TRX | $flags;
if ( $schema == self::USE_GLOBAL ) {
* @param $user String: username
* @param $password String
* @param $dbName String: database name on the server
+ * @param $failFunction Callback (optional)
* @param $flags Integer: database behaviour flags (optional, unused)
* @return DatabaseIbm_db2 object
*/
- static function newFromParams( $server, $user, $password, $dbName, $flags = 0) {
- return new DatabaseIbm_db2( $server, $user, $password, $dbName, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0)
+ {
+ return new DatabaseIbm_db2( $server, $user, $password, $dbName, $failFunction, $flags );
}
/**
var $mAffectedRows = NULL;
function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $flags = 0 )
+ $failFunction = false, $flags = 0 )
{
+ $this->mFailFunction = $failFunction;
$this->mFlags = $flags;
$this->open( $server, $user, $password, $dbName );
+
}
function cascadingDeletes() {
return false;
}
- static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
- return new DatabaseMssql( $server, $user, $password, $dbName, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0 )
+ {
+ return new DatabaseMssql( $server, $user, $password, $dbName, $failFunction, $flags );
}
/**
* Usually aborts on failure
+ * If the failFunction is set to a non-zero integer, returns success
*/
function open( $server, $user, $password, $dbName ) {
# Test for driver support, to avoid suppressed fatal error
var $mFieldInfoCache = array();
function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $flags = 0, $tablePrefix = 'get from global' )
+ $failFunction = false, $flags = 0, $tablePrefix = 'get from global' )
{
$tablePrefix = $tablePrefix == 'get from global' ? $tablePrefix : strtoupper( $tablePrefix );
- parent::__construct( $server, $user, $password, $dbName, $flags, $tablePrefix );
+ parent::__construct( $server, $user, $password, $dbName, $failFunction, $flags, $tablePrefix );
wfRunHooks( 'DatabaseOraclePostInit', array( &$this ) );
}
return true;
}
- static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ){
- return new DatabaseOracle( $server, $user, $password, $dbName, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0 )
+ {
+ return new DatabaseOracle( $server, $user, $password, $dbName, $failFunction, $flags );
}
/**
* Usually aborts on failure
+ * If the failFunction is set to a non-zero integer, returns success
*/
function open( $server, $user, $password, $dbName ) {
if ( !function_exists( 'oci_connect' ) ) {
var $mAffectedRows = null;
function DatabasePostgres($server = false, $user = false, $password = false, $dbName = false,
- $flags = 0 )
+ $failFunction = false, $flags = 0 )
{
+
+ $this->mFailFunction = $failFunction;
$this->mFlags = $flags;
$this->open( $server, $user, $password, $dbName);
+
}
function getType() {
return $this->numRows($res = $this->doQuery($SQL));
}
- static function newFromParams( $server, $user, $password, $dbName, $flags = 0) {
- return new DatabasePostgres( $server, $user, $password, $dbName, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0)
+ {
+ return new DatabasePostgres( $server, $user, $password, $dbName, $failFunction, $flags );
}
/**
* Usually aborts on failure
+ * If the failFunction is set to a non-zero integer, returns success
*/
function open( $server, $user, $password, $dbName ) {
# Test for Postgres support, to avoid suppressed fatal error
wfDebug( "DB connection error\n" );
wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
wfDebug( $this->lastError()."\n" );
- throw new DBConnectionError( $this, $phpError );
+ if ( !$this->mFailFunction ) {
+ throw new DBConnectionError( $this, $phpError );
+ } else {
+ return false;
+ }
}
$this->mOpened = true;
* Constructor.
* Parameters $server, $user and $password are not used.
*/
- function __construct( $server = false, $user = false, $password = false, $dbName = false, $flags = 0 ) {
+ function __construct( $server = false, $user = false, $password = false, $dbName = false, $failFunction = false, $flags = 0 ) {
global $wgSharedDB;
+ $this->mFailFunction = $failFunction;
$this->mFlags = $flags;
$this->mName = $dbName;
*/
function implicitGroupby() { return false; }
- static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
- return new DatabaseSqlite( $server, $user, $password, $dbName, $flags );
+ static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0 ) {
+ return new DatabaseSqlite( $server, $user, $password, $dbName, $failFunction, $flags );
}
/** Open an SQLite database and return a resource handle to it
}
if ( $this->mConn === false ) {
wfDebug( "DB connection error: $err\n" );
- throw new DBConnectionError( $this, $err );
+ if ( !$this->mFailFunction ) {
+ throw new DBConnectionError( $this, $err );
+ } else {
+ return false;
+ }
+
}
$this->mOpened = !!$this->mConn;
# set error codes only, don't raise exceptions
*/
class LoadBalancer {
/* private */ var $mServers, $mConns, $mLoads, $mGroupLoads;
- /* private */ var $mErrorConnection;
+ /* private */ var $mFailFunction, $mErrorConnection;
/* private */ var $mReadIndex, $mAllowLagged;
/* private */ var $mWaitForPos, $mWaitTimeout;
/* private */ var $mLaggedSlaveMode, $mLastError = 'Unknown error';
/**
* @param $params Array with keys:
* servers Required. Array of server info structures.
+ * failFunction Deprecated, use exceptions instead.
* masterWaitTimeout Replication lag wait timeout
* loadMonitor Name of a class used to fetch server lag and load.
*/
}
$this->mServers = $params['servers'];
+ if ( isset( $params['failFunction'] ) ) {
+ $this->mFailFunction = $params['failFunction'];
+ } else {
+ $this->mFailFunction = false;
+ }
if ( isset( $params['waitTimeout'] ) ) {
$this->mWaitTimeout = $params['waitTimeout'];
} else {
}
}
- static function newFromParams( $servers, $waitTimeout = 10 )
+ static function newFromParams( $servers, $failFunction = false, $waitTimeout = 10 )
{
- return new LoadBalancer( $servers, $waitTimeout );
+ return new LoadBalancer( $servers, $failFunction, $waitTimeout );
}
/**
// No last connection, probably due to all servers being too busy
wfLogDBError( "LB failure with no last connection\n" );
$conn = new Database;
-
- // If all servers were busy, mLastError will contain something sensible
- throw new DBConnectionError( $conn, $this->mLastError );
+ if ( $this->mFailFunction ) {
+ $conn->failFunction( $this->mFailFunction );
+ $conn->reportConnectionError( $this->mLastError );
+ } else {
+ // If all servers were busy, mLastError will contain something sensible
+ throw new DBConnectionError( $conn, $this->mLastError );
+ }
} else {
-
+ if ( $this->mFailFunction ) {
+ $conn->failFunction( $this->mFailFunction );
+ } else {
+ $conn->failFunction( false );
+ }
$server = $conn->getProperty( 'mServer' );
wfLogDBError( "Connection error: {$this->mLastError} ({$server})\n" );
$conn->reportConnectionError( "{$this->mLastError} ({$server})" );
class DatabaseMock extends DatabaseBase {
function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $flags = 0, $tablePrefix = 'get from global' )
+ $failFunction = false, $flags = 0, $tablePrefix = 'get from global' )
{
$this->mConn = true;
$this->mOpened = true;