Commit graph

254 commits

Author SHA1 Message Date
Aaron Schulz
c351a9cab0 rdbms: cleanup some Database error message wording for consistency
Change-Id: I7b338e6e856c62ecaab2ef97f76431c2220b430d
2019-07-11 21:37:54 +00:00
Aaron Schulz
a830c14d0b rdbms: make implement IResultWrapper directly instead of via inheritence
Change-Id: If1b15c0c21d0ee336025fb99f47fc19ddf1d5435
2019-07-04 13:42:53 +00:00
Aaron Schulz
23ffabbf77 rdbms: combine trxLevel and trxShortId fields in Database
This avoids having to keep multiple fields in sync

Change-Id: If96267afe56a9b9cd660bab333e7667e4d8dc3d4
2019-06-28 14:40:27 -07:00
Aaron Schulz
7911da9c6f rdbms: remove $opened field from Database for simplicity
This avoids having two similar fields that have to stay
in sync. Clean up the related error handling for connections.
If a connection handle is unusable, like when essential SET
queries fail, then destroy it.

Also:
* Avoid use of transactions in DatabasePostgres::determineCoreSchema.
* Make sure all subclasses log on connection failure.
* Add schema sanity checks to mysql/sqlite classes.
* Add IDatabase::QUERY_NO_RETRY flag to simplify reasoning about
  queries that already run on open() to begin with.
* Remove unused return value of Database::open.
* Remove deprecated Database::reportConnectionError method.

Change-Id: I97beba7ead1523085bda8784234d00c69ef1accc
2019-06-27 18:29:12 +01:00
Umherirrender
348a784f48 Adjust type hints in database related classes
Change from ResultWrapper to IResultWrapper
Change from mysqli_result to resource
Changed mixed to return hint of interface
Document that fieldInfo returns bool

Change-Id: I5572fd41e0e11a2bc2eb116d0c82327499ecc518
2019-06-05 19:10:13 +02:00
Derick Alangi
70cafa4eed db: Use $fname instead of __METHOD__ magic constant
The insert() method calls insertOneRow() method on line 391. It then
passes $fname which defaults to __METHOD__ in its function header and
not using $fname instead of __METHOD__ in insertOneRow() method makes
this parameter unused which of course should be used.

Change-Id: Ic5f5ee878e4f919a96900ba88755641ac85929df
2019-04-15 16:05:31 +01:00
Aaron Schulz
2775ad190c rdbms: drop inappropriate and poorly documented "DatabaseOraclePostInit" hook
Change-Id: I3152e80d99b040b7918927e6c2a215cab59a9b10
2019-04-12 14:41:44 +00:00
Aaron Schulz
ff181a3c4e rdbms: inject reserved word table name rewrite logic into DatabaseOracle
This works similar to that of DatabasePostgres, which uses similar rules.

Fix bogus field access in duplicateTableStructure() as well.
Also, remove a pointless wfDebug() call in DatabaseOracle.

Change-Id: Ia06ff78011dfabc17c525d7a6d2ffad98fe297de
2019-04-11 22:25:08 +00:00
Aaron Schulz
e40d52557e rdbms: inject more dependencies into DatabaseOracle and remove $wgContLang use
Instead of guessing/assuming input encodings for non-UTF8 fields,
just require that they be valid UTF-8 to begin with.

Also replace MWException use and break some long lines.

Change-Id: Ibb6f841d5d143776eca2a9d0d12cbb74f1e0d23e
2019-04-11 04:48:44 +00:00
Aaron Schulz
b9a8ba3b06 rdbms: remove $wgDBprefix reference from DatabaseOracle
Rely on MWLBFactory as other DB classes do

Change-Id: I33d535c659626dd42c9cb8d20c1a0fc90a885c8c
2019-03-26 11:44:17 -07:00
jenkins-bot
7dddd2f7e2 Merge "db: Use variable functions/callbacks instead of call_user_func()" 2019-03-26 05:41:52 +00:00
Derick Alangi
d656baac64 db: Drop child methods as they're same as parent methods
Change-Id: I8b3827a57782f02497da2ab8191d1dad11e92bca
2019-03-25 00:29:22 +01:00
Derick Alangi
a7d1ad4d24 db: Use variable functions/callbacks instead of call_user_func()
Performance-wise, this gives a little boost in performance and also
it's more readable I think. But I could be wrong so please someone
let me know.

See: https://www.php.net/manual/en/function.call-user-func.php

Change-Id: I2f0a00408c29549a786b56792411f88998a5f003
2019-03-25 00:17:22 +01:00
Derick Alangi
e552f30253 db: Use brackets () in operation for better readability
Wrap the expression into () to improve readability of the code.

Change-Id: Id53ea4709a7601fd1354833a44bd652570c733e6
2019-03-20 19:02:06 +01:00
Aaron Schulz
f41a0837a9 rdbms: clarify $uniqueIndexes argument to replace()/upsert()
Also make upsert() match replace() for consistency.

Change-Id: I208f3ab810a61c6949ac0050436767675f99a60b
2019-03-12 20:09:21 -07:00
Thiemo Kreuz
cfda5e7efa Streamline code involving .= string concatenations
This was inspired by Idbbdb31. Originally, I did a regex search for
code that did string concatenations like `$str = $str . …` and replaced
them all with the .= operator. A duplicate patch was uploaded by another
author. I rebeased this patch on top of the other, which leaves all
the manual optimizations I did.

Change-Id: Iaeb73d9c63302c9409bd1051b91e0d2bd77788a7
2019-03-11 12:43:45 +01:00
Fomafix
f17c297624 Use short assignment operator in PHP
Use
  $var .= $foo
instead of
  $var = $var . $foo

Change-Id: I5dcdd7278e618c14968e5ac1fb8ea43ac2200deb
2019-03-07 09:55:49 +01:00
Aaron Schulz
6ab386219e rdbms: document Database::doQuery() return value
Removed random @throws tag from a subclass while at it

Change-Id: I1cad1f66b62bb4a306feb5c773ed5556891f82a7
2019-03-01 02:23:27 +00:00
Thiemo Kreuz
734a969d55 Safe replacement of a lot of !count() with === []
This was originally a global search and replace. I manually checked all
replacements and reverted them if (due to the lack of type hints) either
null (that would be 0 when counted) or a Countable object can end in the
variable or property in question.

Now this patch only touches places where I'm sure nothing can break.

For the sanity of the honorable reviewers this patch is exclusively touching
negated counts. You should not find a single `!== []` in this patch, that
would be a mistake.

Change-Id: I5eafd4d8fccdb53a668be8e6f25a566f9c3a0a95
2019-01-15 17:28:49 +01:00
Fomafix
3ee1560232 No yoda conditions
Replace
  if ( 42 === $foo )
by
  if ( $foo === 42 )

Change-Id: Ice320ef1ae64a59ed035c20134326b35d454f943
2018-11-21 17:54:39 +01:00
Aaron Schulz
633eb437a3 rdbms: clean up return values of IDatabase write methods
Also improved the atomicity and affected row count logic for
insert/replace with sqlite.

Also remove unused "fileHandle" code from insert().

Change-Id: If7b9148fd44f3a958899885753c7c86ba66bf193
2018-10-30 03:34:52 +00:00
Brad Jorsch
993baa3493 ActorMigration: Remove possibility of read-both
When this was originally written, the plan was to read both the old and
new fields during the transition period, while stopping writes to them
midway through. It turns out that the WHERE conditions to do read-both
correctly are generally not handled well by the database and working
around that would require a lot of complicated code (see what's being
removed from ApiQueryUserContribs here, for example).

We can simplify things greatly by instead having it write both fields
during the transition period, reading from the old for the first part
and the new for the second part, as is being done for MCR.

Bug: T204669
Change-Id: I4764c1c7883dc1003cb12729455c8107319f70b1
Depends-On: I845f6ae462f2539ebd35cbb5f2ca8b5714e2c1fb
Depends-On: I88b31b977543fdbdf69f8c1158e77e448df94e11
2018-10-11 12:12:00 +11:00
Aaron Schulz
fe0af6cad5 rdbms: Database::selectDB() update the domain and handle failure better
LoadBalancer uses Database::getDomainId() for deciding which keys to use
in the foreign connection handle arrays. This method should reflect any
changes made to the DB selection.

If the query fails, then do not change domain field. This is the sort of
approach that LoadBalancer is expects in openForeignConnection(). Also,
throw an exception when selectDB() fails.

The db/schema/prefix fields of Database no longer exist in favor of just
using the newer currentDomain field.

Also:
* Add IDatabase::selectDomain() method and made selectDB() wrap it.
* Extract the DB name from sqlite files if not explicitly provided.
* Fix inconsistent open() return values from Database subclasses.
* Make a relationSchemaQualifier() method to handle the concern of
  omitting schema names in queries. The means that getDomainId() can
  still return the right value, rather than confusingly omitt the schema.
* Make RevisionStore::checkDatabaseWikiId() account for the domain schema.
  Unlike d2a4d614fc, this does not incorrectly assume the storage is
  always for the current wiki domain. Also, LBFactorySingle sets the local
  domain so it is defined even in install.php.
* Make RevisionStoreDbTestBase actually set the LoadBalancer local domain.
* Make RevisionTest::testLoadFromTitle() account for the domain schema.

Bug: T193565
Change-Id: I6e51cd54c6da78830b38906b8c46789c79498ab5
2018-10-10 12:03:30 -07:00
Aaron Schulz
41a37d14fa rdbms: make Database::open() protected
This is not called externally and there is little reason for that to
change. The current caller pattern is to use factory(), possibly with
initConnection() afterwards, or to use a LoadBalancer to begin with.

Change-Id: Ib1fdd5c960f1ed877fcd17bcb99b999d5d894716
2018-08-21 18:34:51 -07:00
Aryeh Gregor
90d4f56fe4 Mass conversion of $wgContLang to service
Brought to you by vim macros.

Bug: T200246
Change-Id: I79e919f4553e3bd3eb714073fed7a43051b4fb2a
2018-08-11 22:44:29 -06:00
Fomafix
3714131b5d Use PHP 7 '??' operator instead of '?:' with 'isset()' where convenient
This is a followup to 485f66f1.

Change-Id: I7a2a44b7e933103178929b3cdc015859612c8b35
2018-06-11 19:23:15 +02:00
addshore
f3df984c79 Introduce IDatabase::buildSubstring
Change-Id: I96f3e0c4920d52f63175cb6767c149f20a8a8cde
2018-03-07 12:32:50 +00:00
Brad Jorsch
27c61fb1e9 Add actor table and code to start using it
Storing the user name or IP in every row in large tables like revision
and logging takes up space and makes operations on these tables slower.
This patch begins the process of moving those into one "actor" table
which other tables can reference with a single integer field.

A subsequent patch will remove the old columns.

Bug: T167246
Depends-On: I9293fd6e0f958d87e52965de925046f1bb8f8a50
Change-Id: I8d825eb02c69cc66d90bd41325133fd3f99f0226
2018-02-23 10:06:20 -08:00
Aaron Schulz
ec550d4823 rdbms: remove "m" prefix from Database fields
Done using the PhpStorm refactor->rename tool.

Also move "defaultBigSelects" declaration to DatabaseMysqlBase
as no other classes uses that.

Change-Id: I424a2d9815de3a5d4cca2522f3db23a5efe6b592
2018-02-15 23:29:34 +00:00
Reedy
39f0f919c5 Update suppressWarning()/restoreWarning() calls
Bug: T182273
Change-Id: I9e1b628fe5949ca54258424c2e45b2fb6d491d0f
2018-02-10 08:50:12 +00:00
Aaron Schulz
6237fd11b6 rdbms: make affectedRows() work more consistently
* Update replace()/upsert() to combine the affected row
  count for the non-native case
* Also make replace() atomic in the non-native case,
  similar to how upsert() already works

Change-Id: I6c9bcba54eca6bcf4a93a9b230aaedf7f36aa877
2018-01-30 20:02:07 -08:00
Brad Jorsch
0a9c55bfd3 Deprecate IDatabase::nextSequenceValue()
It's often forgotten because MySQL and Sqlite don't use it, the only
users are PostgreSQL and Oracle. And when used, if inserts to multiple
tables are being done it's easy to get the ordering wrong.

This patch reimplements DatabasePostgres::insertId() in terms of PG's
lastval() function, and adds triggers to the Oracle schema to make it
work the same as the other databases.

Bug: T164900
Change-Id: Ib308190c52673a9266c8495a589ae644f9fbefce
2017-08-31 11:16:26 -04:00
Brad Jorsch
31cb62dd2d DB: Add join conditions to selectField, selectFieldValues, and insertSelect
selectField() and selectFieldValues() are trivial, they just need to
pass it through to select(). In fact, selectFieldValues() was already
doing it, just no one ever updated IDatabase.

insertSelect() is a little more work. nativeInsertSelect() was
originally written as largely a copy-paste of select() and has since
gotten well out of sync. Now that we have selectSQLText(), we should be
able to just use that. DatabasePostgres's implementation can wrap the
parent implementation instead of being another copy-paste, but
DatabaseOracle seems to still need to be special.

Change-Id: I0e6a9e6daa510639d3212641606047a5db96c500
2017-06-14 05:07:42 +00:00
Aaron Schulz
dd359741cc Move DB errors to Rdbms namespace
Change-Id: I463bd86123501abc68fdb78b4cda6110f7af2549
2017-04-15 10:47:41 -07:00
Aaron Schulz
d735dc562d Move Database and subclasses to Rdbms namespace
Change-Id: I52bef87512f9ddd155d1f4cc0052f6b7a0db5b42
2017-04-12 10:43:57 -07:00
Aaron Schulz
e01fd44388 Move ResultWrapper subclasses to Rdbms
Change-Id: I6f3f0e85e268b24c57c537aa6ad8016e0b4cdddb
2017-03-03 00:44:41 +00:00
Aaron Schulz
2dc621fd82 Move ORAResult to /db
Change-Id: I9be89faef693343a4071d7c29b6ca0c021e7fb63
2017-02-17 03:07:14 +00:00
Aaron Schulz
019fa7cb9c Move Blob class to Rdbms namespaces
Leave \Blob as an alias. Callers can now use the Rdbms\Blob class
for "extends"/"new" and the Rdbms\IBlob interface for type hints.

Change-Id: I983b76f181ac60c1eb92c350cd27ad77ec90a192
2017-02-13 21:07:00 +00:00
Aaron Schulz
58ecdd060c Fix assortment of IDEA warnings
Change-Id: I3fb482232483f37bf73ebbeb405056794109e618
2017-02-11 18:12:42 -08:00
Brad Jorsch
fb3ae6fbe3 Replace use of &$this
Use of &$this doesn't work in PHP 7.1. For callbacks to methods like
array_map() it's completely unnecessary, while for hooks we still need
to pass a reference and so we need to copy $this into a local variable.

Bug: T153505
Change-Id: I8bbb26e248cd6f213fd0e7460d6d6935a3f9e468
2017-01-31 23:01:54 -05:00
Erik Bernhardson
d67197fa11 Cleanup some incorrect return annotations
Most of these are simply changing annotations to reflect
reality. If a function can return false to indicate failure
the @return should indicate it.

Some are fixing preg_match calls, preg match returns 1, 0 or false,
but the functions all claim to return booleans.

This is far from all the incorrect return types in mediawiki, there
are around 250 detected by phan, but have to start somewhere.

Change-Id: I1bbdfee6190747bde460f8a7084212ccafe169ef
2016-12-12 10:15:05 -08:00
Aaron Schulz
aa8d127b73 Avoid use of DatabaseBase in /includes
Change-Id: Ia3b7f9cb7d40f4ec9f19c924904e8a096880ec6a
2016-12-02 12:34:06 -08:00
Aaron Schulz
83b573a3e8 Remove strictIPs(), cascadingDeletes(), and cleanupTriggers()
These DatabaseBase methods have no callers are were a mistake to
begin with. They only encouraged code forking and incompatibilities
among different backing DB types.

Also removed stray realTimestamps() method that was left over
from prior removals.

Change-Id: I37bef8585151e2782d2c88b5ae1e6752109c6ac7
2016-09-19 20:12:11 +00:00
Aaron Schulz
fcf67bde0e Stub out DatabaseBase::getSearchEngine() as a dummy method
SearchEngineFactory::getSearchEngineClass() should be used instead

Change-Id: I984b80815633a8dc38a76d7de8a46ec249ae729f
2016-09-19 08:11:18 -07:00
Aaron Schulz
4ef4438739 Remove long-since unused cruft methods from DatabaseBase
Change-Id: I4b28c15a8589504bdbbe79ba0d3aed1e52dbe65b
2016-09-18 00:20:49 +00:00
Aaron Schulz
403a1ea178 Move all of the reasonable DatabaseBase methods to Database class
The Database class was previously just a short-hand for "Database::",
and such calls should still work. The class now resides in /libs/rdbms.

The subclasses now extend DatabaseBase to avoid breaking type hints
that use that (hints use either IDatabase or DatabaseBase).

Also, use CASCADE with DROP TABLE for MySQL as with other DBs.
Keep SQLite excempt due to lack of support.

Added getDomainID() methods to avoid mentioning the word "wiki".

Change-Id: Ibd05d786cb26c21dcc9cb9601f6b2b52056af9ae
2016-09-17 03:38:05 +00:00
Aaron Schulz
0bbba6e0d4 Move various DB helper classes to /libs/rdbms
Change-Id: I0724f1acce4f6c43b1f0983fa119e628e7c53ba5
2016-09-14 20:40:12 -07:00
Aaron Schulz
272f45a8a0 Change DatabaseBase => IDatabase in /db where possible
Change-Id: Ia0a049cd4294c5a39aa9ed228d4eb5b15736ea1f
2016-09-14 19:31:51 -07:00
Aaron Schulz
4be70af8c6 Replace some MWExceptions with natives ones in /db
Change-Id: I94532d09216926d401e94c61acd60fdc6241a2a0
2016-09-14 01:50:33 -07:00
jenkins-bot
4a975b8099 Merge "add IGNORE INDEX option to mysql database handler" 2016-09-12 12:33:59 +00:00