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:他は対応しなくていいかも未確認