佐藤と申します。
Linux上のRails 1.0で、Ruby-ODBC/iodbc/FreeTDS経由でSQLServerへつないでいます。
sqlserverアダプタでmode: odbcとしています。
普通にfind(:all)したのですが、下記のようなエラーが出ました。
ArgumentError: time out of range: SELECT * FROM .......
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/abstract_adapter.rb:88:in `log'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/sqlserver_adapter.rb:467:in `select'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/sqlserver_adapter.rb:227:in `select_all'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:431:in `find_by_sql'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:395:in `find'
"out of range" time rubyとGoogleしてみましたが、Epochより前のTimeオブジェクトは
作れない、などというのがありました。
abstract_adapter.rbのlogを見ましたが、このメソッドの中で例外が投げられている
ようですが、logメソッドの中でTimeに関係しそうなのはBenchmarkモジュールくらいかと
思うのですが、まさかBenchmarkモジュールがそんなバグを含んでいるとは思いにくく。
ログレベルを:debugにして実行したところ、実際にモデルのオブジェクトをロード
するところ(ログメッセージで言うと、[モデルクラス名] Load (0.000000) Argument
Error: time out of range: SELECT * FROM ...と表示されています)で例外が起きて
いるようです。
これはやはりBenchmarkモジュールではなく、ロードしようとしているデータベースの
行にEpochより前の時刻を表すTimeオブジェクトを作ろうとしたための例外と考える
ほうが良いでしょうか?
これは、そういうデータを含むデータベースが悪いのか、sqlserver_adapter.rbの
問題か、はたまたBenchmarkモジュールに何かあるのか、どこをどういう風に見て
行けば良いか、アドバイスいただけましたらと思います。
よろしくお願いいたします。
--
佐藤