我正面临着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级别上解决方法。
答案 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);
}
所以它会......