0

我正面临耙子的问题。当我提供 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 的 1,我验证为 OCI_SUCCESS_WITH_INFO

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

PS:我不想通过更改与帐户关联的配置文件来更改 oracle 端的密码过期行为。我需要一个红宝石级别的解决方法。

4

1 回答 1

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);
  }

就这样……

于 2012-09-06T16:43:59.417 回答