DataObjects :: SQLError对象的.code如何对应于数据库发出的错误?

时间:2012-04-24 18:19:20

标签: ruby postgresql datamapper

所以我正在做一些业务逻辑,并希望运行一些类似于

的代码

select id from blah where foo = 1234 for update nolock

blah中的相应行被锁定时,此代码抛出DataMapper :: SQLError。这是理想的行为;我想捕获此错误并使用它来通知我的应用程序逻辑。但我想重新抛出任何其他SQL错误,因为它们与我正在编程的情况不同,并且以相同的方式捕获它们将是错误的。

返回的错误对象有一个字符串错误消息和一个数字代码(50463045)。似乎比较数字代码会很棒,但我不想在我的代码中嵌入常量50463045,而不需要对它如何确定它进行一些简单的理解。值得注意的是,Postgres manual suggests that the error code for this state55P03,这似乎并不相同。我不知道我能相信这个神奇的数字,以及除了实验之外如何确定它,所以我对使用它并不是很满意。

如何确定错误代码?

1 个答案:

答案 0 :(得分: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属性,并使我的条件{{1} }。