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) が 1 であることを確認しましたが、これは oci.h から OCI_SUCCESS_WITH_INFO であることが確認されました

次に何をする必要があるか分かりますか?

PS: アカウントが関連付けられているプロファイルを変更して、オラクル側でパスワードの有効期限の動作を変更したくありません。ルビーレベルでの回避策が必要です。

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 に答える