Forum: Ruby on Rails activerecord-jdbc-adapter 0.9 oracle number id problem

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
F218884a22d1276dfadcf96ec9d3b531?d=identicon&s=25 Mark Becker (mbec)
on 2009-03-03 20:40
I'm having a problem using jruby on rails with a legacy oracle database
(Oracle Database 10g Enterprise Edition Release 10.1.0.3.0).  The oracle
number primary key is getting converted into a decimal, which is causing
restful style URIs not to work.  For example I'm seeing URIs like
http://localhost:3000/members/show/7201.0?tab=names where the id should
be an integer, not a double, and they result in "Missing template"
errors.

A friend of mine said that the same problem arose for him when he
updated from activerecord-jdbc-adapter version 0.8 to version 0.9, which
is what I'm using.  Is this a known issue?  Is there a workaround short
of changing the database to use integer primary keys? That isn't an
option for us.

Here's my configuration:

jruby 1.1.6 (ruby 1.8.6 patchlevel 114) (2008-12-17 rev 8388)
[amd64-java]
rails (2.2.2)
activerecord (2.2.2)
activerecord-jdbc-adapter (0.9)
activerecord-oracle-adapter (1.0.0.9250)
Aad37b5f7116c8d1f547d23b37566032?d=identicon&s=25 Greg Donald (destiney)
on 2009-03-04 03:50
(Received via mailing list)
On Tue, Mar 3, 2009 at 1:40 PM, Mark Becker
<rails-mailing-list@andreas-s.net> wrote:
>
> I'm having a problem using jruby on rails with a legacy oracle database
> (Oracle Database 10g Enterprise Edition Release 10.1.0.3.0).  The oracle
> number primary key is getting converted into a decimal, which is causing
> restful style URIs not to work.
>
> activerecord-oracle-adapter (1.0.0.9250)

Have you tried the activerecord-oracle_enhanced-adapter ?  It solved a
number of issues for me.


--
Greg Donald
http://destiney.com/
526d60de6472502bb570a9df2842b33b?d=identicon&s=25 Nick Sieger (Guest)
on 2009-03-04 05:28
(Received via mailing list)
On Tue, Mar 3, 2009 at 1:40 PM, Mark Becker
<rails-mailing-list@andreas-s.net> wrote:
> updated from activerecord-jdbc-adapter version 0.8 to version 0.9, which
> activerecord-jdbc-adapter (0.9)
If you could file a bug [1] and provide a short test case, we'll try
to have this fixed for 0.9.1, due out in a week or two. In your
example/test case, please be sure to provide the schema or migration
that you use to create the table.

Thanks,
/Nick

[1]: http://kenai.com/jira/browse/ACTIVERECORD_JDBC
C82837fc4e549294b73e08de0f34c443?d=identicon&s=25 Sylvain (Guest)
on 2009-03-20 15:46
(Received via mailing list)
Hello Nick,
I experience the same bug described by Mark with version 0.9.1, so I
guess he did not file a bug report in Jira.
Can you please confirm, so I open a bug ?
One last question, when do you plan to release a 0.9.2 version ?

Thanks again for your time and your work you give to the ruby and
rails community.

  Sylvain
7bff8e0fdf3dece314be67b5e1a54895?d=identicon&s=25 Guillaume Desrat (Guest)
on 2009-03-25 17:06
(Received via mailing list)
Hi,

I think I've found where the problem is.

In the file lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.1/lib/
jdbc_adapter/jdbc_oracle.rb, there's this :

module JdbcSpec
  ...
  module Column
  ...
    private
    def simplified_type(field_type)
        case field_type
        when /^number\(1\)$/i                  : :boolean
        when /char/i                           : :string
        when /float|double/i                   : :float
        when /int/i                            : :integer
        when /num|dec|real/i                   : @scale ==
0 ? :integer : :decimal
        when /date|time/i                      : :datetime
        when /clob/i                           : :text
        when /blob/i                           : :binary
        end
    end
  end
end

When I read my model columns, both integer and number(x,0) Oracle
columns report as following :

#<ActiveRecord::ConnectionAdapters::JdbcColumn:0x18af9c0
@precision=nil, @limit=nil, @sql_type="NUMBER", @name="id",
@type=:decimal, @scale=nil, @null=false, @primary=true, @default=nil>

As @scale is nil and not 0, the simplified_type returned is :decimal,
not :integer.


The corresponding case line :
        when /num|dec|real/i                   : @scale ==
0 ? :integer : :decimal
should be replaced by :
        when /num|dec|real/i                   : (@scale.nil? ||
@scale == 0) ? :integer : :decimal


This works fine for me. If it does for you, could you please open an
issue so that the next version includes it ?


Kind regards,

--
Guillaume Desrat
http://www.rubyfrance.org/
C82837fc4e549294b73e08de0f34c443?d=identicon&s=25 Sylvain (Guest)
on 2009-03-30 17:08
(Received via mailing list)
Thanks Guillaume, you're terrific !

On Mar 25, 5:27 pm, Guillaume Desrat <guillaume.des...@rubyfrance.org>
526d60de6472502bb570a9df2842b33b?d=identicon&s=25 Nick Sieger (Guest)
on 2009-03-30 17:59
(Received via mailing list)
On Wed, Mar 25, 2009 at 10:27 AM, Guillaume Desrat
<guillaume.desrat@rubyfrance.org> wrote:
>  module Column
>        when /date|time/i                      : :datetime
> #<ActiveRecord::ConnectionAdapters::JdbcColumn:0x18af9c0
> should be replaced by :
>        when /num|dec|real/i                   : (@scale.nil? ||
> @scale == 0) ? :integer : :decimal
>
>
> This works fine for me. If it does for you, could you please open an
> issue so that the next version includes it ?

Guillaume, merci bien pour votres enquêtes.

I can certainly make the fix, but if possible it would be nice to have
an Oracle test to verify the problem and ensure we don't regress. Can
you tell me how the column in your database is set up so we can create
a test case?

Cordialement,

/Nick
7bff8e0fdf3dece314be67b5e1a54895?d=identicon&s=25 Guillaume Desrat (Guest)
on 2009-04-06 19:00
(Received via mailing list)
Hello,

sorry for answering so late.

> Guillaume, merci bien pour votres enquêtes.

You're welcome. Thanks for your work, Nick.

> I can certainly make the fix, but if possible it would be nice to have
> an Oracle test to verify the problem and ensure we don't regress. Can
> you tell me how the column in your database is set up so we can create
> a test case?

The ID column is defined as NUMBER(38) and the PAGES is an INTEGER
one. The ID is not nullable while the PAGES one is.


Regards,

--
Guillaume Desrat
http://www.rubyfrance.org/
Fb919dfe6c759e4b079f9ab1d5a274b3?d=identicon&s=25 Ales Bukovsky (abukovsky)
on 2009-05-14 15:40
Hello,

First of all, thank you Guillaume very much for the workaround.

I would like to ask whether this issue had been reported in JRuby bug
tracker? If so, does anyone knows the ticket #>I can't find it
anywhere...

Since this problem still exists in 0.9.1 version I'd like to stress that
it actually renders Rails running on JRuby using Oracle backend (via
JDBC adapter) almost inoperational. None of the generated path/URL
helpers (model_url, edit_model_path etc.) and functions that use them
(like form_for) work. Everything starts running properly with the
described workaround in place. Note there still could be a related issue
in Rails as well but the BigDecimal typecast for ID column certainly
contributes to it.

Thanks

~Ales~
526d60de6472502bb570a9df2842b33b?d=identicon&s=25 Nick Sieger (Guest)
on 2009-05-14 16:23
(Received via mailing list)
I don't know of one. Ales, if you could create a new issue for this at
http://kenai.com/jira/browse/ACTIVERECORD_JDBC, that would be great.

Thanks,
/Nick

On Thu, May 14, 2009 at 8:40 AM, Ales Bukovsky
Fb919dfe6c759e4b079f9ab1d5a274b3?d=identicon&s=25 Ales Bukovsky (abukovsky)
on 2009-05-14 17:31
It's officially reported now:

http://kenai.com/jira/browse/ACTIVERECORD_JDBC-17

Thanks

-Ales-
This topic is locked and can not be replied to.