ADOdbのエラー番号(PostgreSQL)

削除時に出るforeign keyのエラーを他と分ける必要が出てきて
エラー後にADOConnectionインスタンスのErrorNoメソッドを呼んでみるものの
foreign keyエラーでも構文エラーでも常に-1、、


ErrorMsgメソッドで取れるエラーメッセージを元に各エラーの文言が入っているかで
エラー番号を決める処理を自前で入れようかと
エラー番号を決める処理を追って行って見ると
そのものずばりを行っている関数が
「adodb-error.inc.php」の中にadodb_error_pg関数として存在

バージョンが上がったせいかメッセージが微妙に違っていたので条件を追加。

function adodb_error_pg($errormsg)
{
	if (is_numeric($errormsg)) return (integer) $errormsg;
    static $error_regexps = array(
            '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => DB_ERROR_NOSUCHTABLE,
            '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/'      => DB_ERROR_ALREADY_EXISTS,
            '/divide by zero$/'                     => DB_ERROR_DIVZERO,
            '/pg_atoi: error in .*: can\'t parse /' => DB_ERROR_INVALID_NUMBER,
            '/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => DB_ERROR_NOSUCHFIELD,
-           '/parser: parse error at or near \"/'   => DB_ERROR_SYNTAX,
-           '/referential integrity violation/'     => DB_ERROR_CONSTRAINT,
+           '/(parser: parse|syntax) error at or near \"/'   => DB_ERROR_SYNTAX,
+           '/referential integrity violation|update or delete on [\"\'].*[\"\'] violates .* key constraint/'     => DB_ERROR_CONSTRAINT,
            '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/'     
			 	 => DB_ERROR_ALREADY_EXISTS
        );
	reset($error_regexps);
    while (list($regexp,$code) = each($error_regexps)) {
        if (preg_match($regexp, $errormsg)) {
            return $code;
        }
    }
    // Fall back to DB_ERROR if there was no mapping.
    return DB_ERROR;
}

すぐ必要そうになったFKと構文エラーにのみ対応。*1
DB_ERROR_ALREADY_EXISTSがほぼ同じ内容で2行あることも踏まえて
時間があったら本家にも伝えたいところ。

*1:他は対応しなくていいかも未確認