logo       

[ruby-list:42093] [ANN] ruby-oci8 0.1.15: msg#00124

lang.ruby.japanese

Subject: [ruby-list:42093] [ANN] ruby-oci8 0.1.15

OCI8 を使用した Oracle モジュール ruby-oci8 0.1.15 をリリースしました。

URL:http://rubyforge.org/projects/ruby-oci8/

What's new:

* 新機能.... なし。:-<

* バインド済みのプレースホルダーに再度バインドしたときのメモリ消費を削減

require 'oci8'
conn = OCI8.new('ruby', 'oci8')
cursor = conn.parse('select * from foo where key = :key')
0.upto(10000) do |key|
# cursor.close を実行するまでバインド値は解放されなかった。
# 今は GC が走ると解放される。
cursor.bind_param('key', key)
cursor.exec
.... fetch ....
end

* プロセス終了時の潜在的なセグメンテーションフォルトの修正
プロセス終了時には ruby のオブジェクトは予測不能な順番で解放される。
OCIEnv のインスタンスが OCIRowid オブジェクトより先に解放された場合、
セグメンテーションフォルトが起こっていた。

* $0 に値を設定したときの問題の回避コードの追加
ruby 1.8.4、ruby-oci8 0.1.14、Oracle 10.1.0 の組み合わせで UNIX 上で
以下のコードを実行すると環境変数が見えなくなる。
(Oracle 10.2.0 や ruby 1.8.2 では問題なし)

require 'oci8'
ENV['HOME'] # --> ちゃんとした値
$0 = 'foo'
ENV['HOME'] # --> nil

以下の条件のとき変になるようです。ruby 1.8.4 のみ

1. ruby スクリプトで環境変数を変更してない、または拡張ライブラリ側
で ruby_setenv() を呼んで環境変数を変更していない状態で以下を
実行。

2. 拡張ライブラリ側で putenv() で環境変数に値を追加する。
内部的には char **environ が realloc されて environ のアドレス
がプロセス起動時のアドレスからずれる。

3. $0 へ値を設定。
ruby.c の1053行目で、環境変数を別の領域へコピーするため
ruby_setenv("", NULL); /* duplicate environ vars */
が実行されるが、2 で environ の値が origenviron からずれたため、
環境変数がコピーされない。その状態で元々の環境変数ブロックがス
ペースでクリヤされるため、プロセス起動時にあった環境変数が参照
できなくなる。

* コンパイル時のレジストリの検索パスの修正。
(OracleXE Windows版用)

--
KUBO Takehiro
email: kubo-MPg98oU6eI0dnm+yROfE0A@xxxxxxxxxxxxxxxx
web: http://www.jiubao.org
GnuPG fingerprint = 5F7B C8EF CA16 57D0 FDE1 9F47 C001 1F93 AC08 2262




<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise