Checking for MySQL error codes (via preg_match) are sprinkled in places in the code. (i.e., core/Updater.php, core/Updates/*.php, Dashboard.php, ExampleFeedburner.php, Installation/Controller.php, LanguagesManager.php)
To assist the non-MySQL Piwik ports, we should switch the detection to SQL codes, e.g., - '/1146/' becomes '/[42S02]/' - '/1054/' becomes '/]42S22]/'
Throwing custom exceptions would be a nice-to-have, e.g., - Piwik_Db_TableNotFound - Piwik_Db_ColumnNotFound
It looks like the 5 character SQLSTATE isn't as "standard" as documented, e.g., for "table already exists", MySQL uses 1050 and 42S01, while Postgresql uses 42P07 (referencing klando's changes).
Should tackle this in conjunction with #425.
Should also abstract the error code detection (e.g., preg_match) to a method call as some database servers use variable length error codes (e.g., mssql, http://technet.microsoft.com/en-us/library/cc917589.aspx).
For completeness, postgresql error codes are defined here (http://developer.postgresql.org/pgdocs/postgres/errcodes-appendix.html).
fixes #904 - MySQL error codes; unsupported adapters can map these to driver-specific SQLSTATE fixes #980 - Piwik Installation support for "MySQL Improved" (mysqli) extension fixes #984 - Set client connection charset to utf8.
Fixed tracker profiling data not recorded until after report generated.
More refactoring and database abstraction: - Installation gets a list of adapters instead of hardcoding in the plugin - checking for database-specific system requirements deferred to the adapter - error detection moved to adapter but we still use MySQL error codes rather than defining new constants
Note: unit tests don't run with MYSQLI -- Zend Framework's Mysqli adapater doesn't support prepare() yet