[wp-trac] [WordPress Trac] #16615: Inconsistent and un-pluggable handling of db error messages esp. dead_db()
WordPress Trac
wp-trac at lists.automattic.com
Tue Feb 22 21:42:58 UTC 2011
#16615: Inconsistent and un-pluggable handling of db error messages esp. dead_db()
--------------------------+-----------------------------
Reporter: jeremyclarke | Owner:
Type: enhancement | Status: new
Priority: normal | Milestone: Awaiting Review
Component: General | Version:
Severity: normal | Keywords: dev-feedback
--------------------------+-----------------------------
'''The Problem: DB Error reporting can't be modified'''
I'm trying to set my sites up for some scheduled downtime of our
(separate) MySQL server. I am hoping that I can show cached pages if they
are requested, but show a 'We are down for scheduled maintenance' message
when a user loads a page that needs the database.
In the process I'm seeing there are many different places in the code that
fire depending on exactly how broken the database is. Specifically, there
are some scenarios where `dead_db()`, which is totally different from the
rest of the messages, will fire. dead_db() is cool because it promises to
let us use a `/wp-content/db-error.php` file to control output in case of
a db error, but currently it is just frustrating because most types of db
error (server missing, db missing) don't cause `dead_db()` to fire, but
instead use `$wpdb::bail()`. These bail()-based errors are used in wp-
db.php.
However `dead_db()` CAN still fire, which I know because our site often
has database outages that result in the H2 from `dead_db()` being shown. I
think it's a certain mix of "the mysql server and database seem to exist,
but are failing to respond to actual queries". That said, I'm pretty sure
that the scenarios where dead_db still fires are ones also covered by some
of the `$wpdb::bail()` situations, and would be better off handled by one
consistent system of errors. dead_db() should either be used for all DB
related errors or deprecated, otherwise it is just an awkward red-herring
for developers.
'''The Solution: Better filters on `$wpdb::bail()`'''
I think that all these messages need to be pluggable somehow and it should
be clear how to do so when looking at the code itself. Asking people who
want to change a wp_die() message to find it in the code is reasonable,
but it should be clear from there how to change it. Ideally there would be
a filter in the function that calls bail() that lets you edit the text
and/or forward the user to another URL where a maintenance message lives.
It should be of of those situations where finding the source of the
message also finds the means of changing it.
The simplest answer would be a filter added in `$wpdb::bail()` that used
the $error_code to identify the specific message. In the database errors
the $error_code passed to bail() are useful slug-type strings like
'db_select_fail'. Something like:
{{{
apply_filters('wpdb_bail', $error_code, $message);
wp_die($message);
}}}
This would give people a lot of control, and could easily be referred to
in a comment before any given instance of `$wpdb::bail()`.
To make the $error_code easier to find I think it's also worth
reformatting the code used to call `$wpdb::bail()`. Currently it takes
this form:
{{{
$this->bail( sprintf( /*WP_I18N_DB_CONN_ERROR*/"
...
SUPER LONG HTML MESSAGE
...
"/*/WP_I18N_DB_CONN_ERROR*/, $details['db_host'] ), 'db_connect_fail' );
}}}
This makes it hard to notice the 'db_connect_fail' string all the noise.
Instead the message perparation and bail() call should be on two lines,
one for defining the message and another that only calls bail (with an
explanation about the $error_message and filter above it).
Looking at it deeper I imagine I can achieve what I want by hooking into
the 'wp_die_handler' filter, checking for the exact HTML generated by the
DB error (the `$message` value in the code above), and doing something
based on that, but it's obviously a house of cards for future updates
where the text might change. It will also be easily foiled by any
translation of the `$message` which will change its output.
--
Ticket URL: <http://core.trac.wordpress.org/ticket/16615>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list