Opened 5 years ago

Closed 5 years ago

#904 closed New feature (fixed)

MySQL error codes

Reported by: vipsoft Owned by: vipsoft
Priority: normal Milestone: Piwik 0.4.4
Component: Core Keywords:
Cc: Sensitive: no


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

Change History (5)

comment:1 Changed 5 years ago by vipsoft (robocoder)

  • Sensitive unset

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.

comment:2 Changed 5 years ago by vipsoft (robocoder)

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,

comment:3 Changed 5 years ago by vipsoft (robocoder)

For completeness, postgresql error codes are defined here (

comment:4 Changed 5 years ago by vipsoft (robocoder)

  • Milestone changed from 2- DigitalVibes to 1 - Piwik 0.4.4
  • Owner set to vipsoft
  • Priority changed from low to normal

comment:5 Changed 5 years ago by vipsoft (robocoder)

  • Resolution set to fixed
  • Status changed from new to closed

In [1473]:

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

Note: See TracTickets for help on using tickets.