Ruby的OCI_SUCCESS_WITH_INFO错误

时间:2012-09-06 06:37:29

标签: ruby-on-rails ruby oracle oci

我正面临着rake的问题。当我给rake时,rake失败并出现以下错误:

/Ruby/lib/ruby/site_ruby/1.8/oci8.rb:228 - ORA-28002: the password will expire within 5 days

这里的问题是OCILogon会将状态设为OCI_SUCCESS_WITH_INFO,我认为这个状态在evn.c中没有处理。

所以当我挖出代码时,我发现evn.c确实只检查了OCI_SUCCESS 但是,我在ruby的env.c中出现的函数oci8_logon中将代码更改为类似的内容:

rv = OCILogon(envh->hp, envh->errhp, &svchp,
            u.ptr, u.len, p.ptr, p.len, d.ptr, d.len);

if (rv != OCI_SUCCESS && rv != OCI_SUCCESS_WITH_INFO) {
    oci8_raise(envh->errhp, rv, NULL);
  }

我仍然面临同样的问题。 我验证了返回值(rv)它来自oci.h,我验证为OCI_SUCCESS_WITH_INFO

知道接下来需要做什么吗?

PS:我不想通过更改帐户关联的配置文件来改变oracle端的密码到期行为。我需要在ruby级别上解决方法。

1 个答案:

答案 0 :(得分:0)

将您的比较更改为

if (rv != OCI_SUCCESS && rv != OCI_SUCCESS_WITH_INFO)
                      ^^ logical AND instead of logical OR

分享并享受。


编辑: 在进一步考虑之后,我认为如果重写它以进行积极的比较而不是负面的比较,这将更清楚:

rv = OCILogon(envh->hp, envh->errhp, &svchp,    
            u.ptr, u.len, p.ptr, p.len, d.ptr, d.len);    

if (rv == OCI_SUCCESS || rv == OCI_SUCCESS_WITH_INFO)
  {
  /* Code to perform when OCILogon succeeds */
  }
else
  {
  /* Code to perform when OCILogon fails */

  oci8_raise(envh->errhp, rv, NULL);
  }

所以它会......