It has not been necessary to call this method outside the Database classes
since 1.11 (r23756 / 9382bc7a85).
This is a breaking change and should not be merged before the following
changes to extensions:
* Disambiguator: Ibef942fd
* Maps: Ic90bd0ad
* OAI: Idbbe08d6
* Oversight: I63071e65
* Video: Id71914cd
Change-Id: Idfe7cd6f516f0aca850878282c47e7914accc6d8
Also removed the protected $mErrorCount property used by this method.
Also removed DatabaseOracle::reportQueryError(). After removing its use
of $mErrorCount and applying relevant changes from 419221e4a7 ("Fixed
bug where catching DB errors left ignoreErrors() on"), the only effect
would be that, like for the other DB types, query errors would be
logged using wfLogDBError().
Change-Id: Ie26a5f5ef7dc5619d9db38d3eb6b7af3e6592aff
* This should *only* ever be used internal for error suppression,
such as in the exception reporting methods. Having it public
means callers have to worry (in theory) about whether the
DB handles errors one way or a totally different way even
though there is really only meant to be one.
Change-Id: I5916830d1bd53ee948308f394e55c17dd515ad33
* IDEs can now make sense of IDatabase, which is useful for
lazy connections. The interface might also help lower coupling.
* This also updates DBConnRef, which implements IDatabase
* Some discouraged methods are left out of IDatabase.
These methods either encourage manual query building,
are only needed by the updater, are obscure/unused,
or either wise encourage bad practice. DBConnRef still
supports these if called to avoid breakage though.
Change-Id: Ia83530820f185415725c1d5f54b5172121b4938f
* Moved some duplicated logic to assertOpen() method
* Override doc type for mConn for the mysqli subclass
* Fixed a few code comments
Change-Id: I78d595554ed51f64ca7cf7bd7ce369a492a59145
We expect these to be implemented and where
implemented we expect them to return these types.
This means when typehinting against Database
(Which is done throughout the code as we dont know
what DB we will eb using) warnings about void return
types will no longer be shown by static analysis stuff
Change-Id: I03d85560d9eb92d6df11dba8bc90339bf41cee8c
The Database::factory() method treats $dbType as of one of
predefined "canonicalDBTypes", and defaults to using it as driver.
Which is then used for the name of the Database subclass.
This allows extensions and wiki farms to have custom subclasses
to override certain methods, or even provide new drivers.
The $defaultSchemas array added in f7174057a4 was given all canonical
keys (with null values) to allow unconditionally access. This
doesn't scale very well and is error-prone. Reduce it to the
override only and fallback make the fallback to null explicitly.
See T102285 for where this would help prevent a PHP Notice.
Change-Id: I3f1e1f59c300d34de30f6480ff4e54f159d51b16
wfSuppressWarnings() and wfRestoreWarnings() were split out into a
separate library. All usages in core were replaced with the new
functions, and the wf* global functions are marked as deprecated.
Additionally, some uses of @ were replaced due to composer's autoloader
being loaded even earlier.
Ie1234f8c12693408de9b94bf6f84480a90bd4f8e adds the library to
mediawiki/vendor.
Bug: T100923
Change-Id: I5c35079a0a656180852be0ae6b1262d40f6534c4
* This is a more specific form of the logic removed in 3c2bc32ae1.
It does not suffer the problem of causing constant master DB
queries due to a bad template reference or such.
* It will use the master if writes from the current thread
are pending or were recently committed. This deals with the
common problem of code that needs to read things it just wrote,
such as diffs on rollback or edit hooks.
* This commit reverts 8624e261f by making the hack obsolete.
Bug: T93866
Bug: T94407
Change-Id: Ib9ecb75e1236e767bdc86d124d5e22a03ae0fb5f
There's a bunch of stuff that probably only works because the database
representation of infinity is actually 'infinity' on all databases
besides Oracle, and Oracle in general isn't maintained.
Generally, we should probably use 'infinity' everywhere except where
directly dealing with the database.
* Many extension callers of Language::formatExpiry() with $format !==
true are assuming it'll return 'infinity', none are checking for
$db->getInfinity().
* And Language::formatExpiry() would choke if passed 'infinity', despite
callers doing this.
* And Language::formatExpiry() could be more useful for the API if we
can override the string returned for infinity.
* As for core, Title is using Language::formatExpiry() with TS_MW which
is going to be changing anyway. Extension callers mostly don't exist.
* Block already normalizes its mExpiry field (and ->getExpiry()),
but some stuff is comparing it with $db->getInfinity() anyway. A few
external users set mExpiry to $db->getInfinity(), but this is mostly
because SpecialBlock::parseExpiryInput() returns $db->getInfinity()
while most callers (including all extensions) are assuming 'infinity'.
* And for that matter, Block should use $db->decodeExpiry() instead of
manually doing it, once we make that safe to call with 'infinity' for
all the extensions passing $db->getInfinity() to Block's contructor.
* WikiPage::doUpdateRestrictions() and some of its callers are using
$db->getInfinity(), when all the inserts using that value are using
$db->encodeExpiry() which will convert 'infinity'.
This also cleans up a slave-lag issue I noticed in ApiBlock while
testing.
Bug: T92550
Change-Id: I5eb68c1fb6029da8289276ecf7c81330575029ef
* Set a custom profiler with no expectations to avoid tripping
the "0 write" expection. This avoids useless log entries.
Change-Id: Iac849a729eb36b1a8affb0dbc8b8c195fab4b03a
* The array based format is now required
* Pass any additional parameters through factory() to __construct() even
if the base clase does not recognize them. This makes DB specific
options simpler.
* Also added missing bits to Sqlite constructors
Bug: T90288
Change-Id: I29b79a3c1bb2b5e51c1c8f5e04cd08c71e0662a3
Was broken by I1a8830eaf, which accidentally caused the log message to
be output for every write query, instead of only the first write query.
Change-Id: I4a53914bcb28804ff4c31b4e0418591793d411b6
* Master connections and writes on read requests will now be logged to
get visibility into code that reduces performance and site availability.
bug: T88445
bug: T86862
Change-Id: Ic2ae95c33facbb54e062aef2ce67d6182caa044a
Doc comments state that these methods return ints. In order to ensure
that, values must be cast to int before they are returned.
With respect to selectRowCount(), follows-up 65f81d2843.
Change-Id: I108221ce4ad1b5b103b015fe875de54e04781741
The current API for Database::encodeBlob/Database::addQuotes requires
the code that is outputting binary data to have a database handle, so
that it may call Database::encodeBlob to get either a plain string or
a Blob object back. All database implementations other than MySQL
return a Blob object from Database::encodeBlob.
This is a rather inconvenient API, it tightly couples the creation of
binary data with the Database object unnecessarily. If all database
objects accept a Blob via Database::addQuotes then code can simply
wrap its arguments in Blob and know that any database it ends up at
will be properly handled.
This patch changes the default implementation of Database::addQuotes
to recognize a Blob object was passed in, and use Blob::fetch to turn
it back into a string. Database implementations other than MySQL all
handle this Blob object already. The postgresql implementation had
to be adjusted slightly. Now when it sees a Blob object that it did
not create it will encode that appropriately.
Bug: 72367
Change-Id: I12fb4bd339be19137fffba2e47a70741382f6a8c
* Also added a selectFieldValues helper method to the DB classes
since this use case keeps coming up.
Change-Id: I62cdbb497dc2c8fe4758e756d13688b85165e869
Amends to Database::makeList() to check if 'NULL' is present in array while
building IN clause. Presently a NULL in array intended to build IN clause, is
treated as a usual value. This creates
problem:https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in
Therefore null is appended at the end of the IN clause as " $field IS NULL"
rather than within the IN clause.
DatabaseSQLTest.php: Some test cases added for the modified behaviour.
Bug: T50853
Change-Id: Ic255c37e9702fd44d8173027ab8036ddc48f9d2e
* Add DatabaseBase::isTransactableQuery() for checking whether a query could
benefit from being executed in a transaction.
Change-Id: Ie5b116bc726b47c68459e6525a1bb43b96bd9f30