1

だから私はいくつかのビジネスロジックをやっていて、次のようなコードを実行したいと思っています

select id from blah where foo = 1234 for update nolock

blahこのコードは、の対応する行がロックされている場合にDataMapper::SQLErrorをスローします。これは望ましい動作です。このエラーをキャッチし、それを使用してアプリケーションロジックに通知したいと思います。しかし、他のSQLエラーは、私がプログラミングしている場合とは異なり、同じ方法でキャッチするのは間違っているため、再スローしたいと思います。

返されるエラーオブジェクトには、文字列エラーメッセージと数値コード(50463045)が含まれています。50463045数値コードを比較するのは素晴らしいことのように思えますが、それがどのように決定されたかを少し理解することなく、定数をコードに埋め込みたくありません。特に、 Postgresのマニュアルでは、この状態のエラーコードはであると示唆されています55P03が、それは同じではないようです。この魔法の数をどれだけ信頼できるのか、実験的な以外はどうやって決めるのかわからないので、あまり使い慣れていません。

エラーコードはどのように決定されますか?

4

1 に答える 1

0

DataObjects SQL エラーに関するものを検索すると、エラー自体に関する情報ではなく、エラーを発生させる他のソフトウェアの問題がほとんど返されるように見えるため、インターネットは悲惨なほど役に立ちませんでした...しかし、正しいソースコードを見つけてソースコードをブラウジングした後、私は最終的にdo_postgres.cを見つけました:

void do_postgres_raise_error(VALUE self, PGresult *result, VALUE query) {
  const char *message = PQresultErrorMessage(result);
  char *sql_state = PQresultErrorField(result, PG_DIAG_SQLSTATE);
  int postgres_errno = MAKE_SQLSTATE(sql_state[0], sql_state[1], sql_state[2], sql_state[3], sql_state[4]);

  PQclear(result);

  data_objects_raise_error(self, do_postgres_errors, postgres_errno, message, query, rb_str_new2(sql_state));
}

5 文字の状態がMAKE_SQLSTATE... に渡され、data_objects_raise_errorそれ自体にも渡されることに注意してください。MAKE_SQLSTATE が定義されている場所を追跡して、この整数を作成するためにどのようなクレイジーな操作が行われているのかを突き止めることはできませんでしたが、エラー オブジェクトの.sqlstateプロパティを直接使用して、自分の condition を作成できるようですe.sqlstate == '55P03'

于 2012-04-24T20:55:01.333 に答える