石橋秀仁です。こんばんは。

Yoshida Masato <yoshidam / yoshidam.net> wrote:

> よしだです
> 
> Hideto ISHIBASHI <hideto-i / rr.iij4u.or.jp> writes:
> > ところで、auto commitのようなのは用意されないのでしょうか?
> > 実装は簡単だと思ったんで作ってみたんすが・・・
> > 望ましい仕様というのがどうなのかよくわからなかったので・・・ (^^;
> 
> 必要性を感じたことが無かったので入れてなかったのですが,確か
> に簡単そうだったのでとりあえず実装してみました。
> 
>   http://www.yoshidam.net/oracle-0.2.10.tar.gz

よしださん、素早い対応ありがとうございます。
#あまりに素早くて驚きました (^^;

てっきりファイナライザを使ってコミット処理を書くのかと
思っていましたが、OCIで提供されている機能で実現できたのですね。
安心して使わせていただくことができます。


ちなみに、自動コミットが欲しいな、と思ったきっかけですが、
動的ウェブサイトで人気の言語PHPの、Oracle8関数(OCI8)では、
自動コミットが標準です。

: int OCIExecute (int statement [, int mode])
: (略)オプションのmodeにより実行モードを指定することが可能とです。
: (デフォルトはOCI_COMMIT_ON_SUCCESSです)  自動的にコミット
: されたくない場合は、OCI_DEFAULTをモードとして指定します。 

ぼくは明示的でない自動コミットがデフォルトになっているのは、
気持ち悪くてヤです (^^;

でも、デフォルトで非自動コミットモードであれば、
選択肢として自動コミット機能もあっていい、と思ったのでした。



ところで、簡単に使いたい向き(=僕^^;)のために、
Oracle#exec のイテレータ呼び出し機能を書いてみました。
メール末尾にパッチを添付しました。

これを使うと、
 conn = Oracle.new("scott", "tiger")
 conn.exec("select * from foo") { |r| print(r.join("\t"), "\n") }
 conn.logoff
と書けて、エラー処理などいらない場合は簡単です。

あるいは、同じ内容を一行野郎で、
 ruby -r oracle -e 'Oracle.new("scott", "tiger").exec("select * from foo") { |r| print(r.join("\t"), "\n") }'
と書けるのが僕にとっては嬉しい点です。


ただし迷った点がありました。yieldループ(# for each row)の中で、
Oracle::Cursor#fetchがraiseしたOCIErrorを無視するかどうか。
どうすべきか迷ったので、お任せします (^^;
#File#openのイテレータ呼び出し時と(比較して、類推しやすく)
#合わせるのが自然でしょうか。



diff -cr oracle-0.2.10.orig/lib/oracle.rb oracle-0.2.10/lib/oracle.rb
*** oracle-0.2.10.orig/lib/oracle.rb    Thu Dec 21 16:19:12 2000
--- oracle-0.2.10/lib/oracle.rb Thu Dec 21 22:51:11 2000
***************
*** 34,40 ****
    end

    def exec(sql, *bindvars)
!     Oracle::Cursor.new(@conn, sql, *bindvars)
    end

    def parse(sql)
--- 34,51 ----
    end

    def exec(sql, *bindvars)
!     cursor = Oracle::Cursor.new(@conn, sql, *bindvars)
!     if iterator?
!       begin
!         cursor.fetch { |row| yield(row) }   # for each row
!       rescue OCIError
!         # re-raise or ignore?
!       ensure
!         cursor.close # if cursor
!       end
!     else
!       cursor
!     end
    end

    def parse(sql)


心配性なもので、無駄なコメントが入っています。無視してください (^^;

それでは。

--
Hideto "rubyholic" ISHIBASHI  http://www.rr.iij4u.or.jp/~hideto-i/