From 38a181690bde5b115c5f71084ea56f50a663f6c3 Mon Sep 17 00:00:00 2001 From: zYne Date: Fri, 10 Nov 2006 22:29:20 +0000 Subject: [PATCH] Doctrine_Connection_Sqlite_Exception : added portable error codes --- lib/Doctrine/Connection/Sqlite/Exception.php | 53 ++++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/lib/Doctrine/Connection/Sqlite/Exception.php b/lib/Doctrine/Connection/Sqlite/Exception.php index afabf31da..11b422a70 100644 --- a/lib/Doctrine/Connection/Sqlite/Exception.php +++ b/lib/Doctrine/Connection/Sqlite/Exception.php @@ -22,8 +22,53 @@ Doctrine::autoload('Doctrine_Connection_Exception'); /** * Doctrine_Connection_Sqlite_Exception * - * @package Doctrine ORM - * @url www.phpdoctrine.com - * @license LGPL + * @package Doctrine + * @url http://www.phpdoctrine.com + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @author Konsta Vesterinen + * @author Lukas Smith (PEAR MDB2 library) + * @since 1.0 + * @version $Id$ */ -class Doctrine_Connection_Sqlite_Exception extends Doctrine_Connection_Exception { } +class Doctrine_Connection_Sqlite_Exception extends Doctrine_Connection_Exception { + /** + * @var array $errorRegexps an array that is used for determining portable + * error code from a native database error message + */ + protected static $errorRegexps = array( + '/^no such table:/' => Doctrine::ERR_NOSUCHTABLE, + '/^no such index:/' => Doctrine::ERR_NOT_FOUND, + '/^(table|index) .* already exists$/' => Doctrine::ERR_ALREADY_EXISTS, + '/PRIMARY KEY must be unique/i' => Doctrine::ERR_CONSTRAINT, + '/is not unique/' => Doctrine::ERR_CONSTRAINT, + '/columns .* are not unique/i' => Doctrine::ERR_CONSTRAINT, + '/uniqueness constraint failed/' => Doctrine::ERR_CONSTRAINT, + '/may not be NULL/' => Doctrine::ERR_CONSTRAINT_NOT_NULL, + '/^no such column:/' => Doctrine::ERR_NOSUCHFIELD, + '/column not present in both tables/i' => Doctrine::ERR_NOSUCHFIELD, + '/^near ".*": syntax error$/' => Doctrine::ERR_SYNTAX, + '/[0-9]+ values for [0-9]+ columns/i' => Doctrine::ERR_VALUE_COUNT_ON_ROW, + ); + + /** + * This method checks if native error code/message can be + * converted into a portable code and then adds this + * portable error code to errorInfo array and returns the modified array + * + * the portable error code is added at the end of array + * + * @param array $errorInfo + * @since 1.0 + * @return array + */ + public function processErrorInfo(array $errorInfo) { + foreach (self::$errorRegexps as $regexp => $code) { + if (preg_match($regexp, $errorInfo[2])) { + $errorInfo[3] = $code; + break; + } + } + + return $errorInfo; + } +}