After upgrading to ruby v 3.2.3 rb_scan_args() skips argument value

Hi,

Note: I am not an expert at ruby.

I am working on ibm_db gem, its an adapter developed using ruby C extension, which helps ruby & rails applications to connect to DB2 database.
Under github source is at ibmdb/ruby-ibmdb/

As of now ibm_db gem is compatible with ruby v 3.1.
Now I am trying to make ibm_db gem compatible with ruby v 3.2.3.

All my test cases were working for ruby v 3.1, but post upgrading to ruby v 3.2.3, most of my test cases are failing.

After debugging using gdb what I see is, my ruby test cases calls ruby C extension API passing required arguments, but inside C extension code arguments are not parsed, indeed nothing is read. Because of this most of test cases are failing.

Below is a sample ruby script which when run calls ibm_db extension,

$ irb
irb(main):001:0> require 'ibm_db'
=> true
irb(main):002:0> conn = IBM_DB.connect("DATABASE=sample;HOSTNAME=waldevdbclnxtst06.dev.rocketsoftware.com;PORT=60000;PROTOCOL=TCPIP;UID=zurbie;PWD=A2m8test;",'','')
(irb):2: warning: undefining the allocator of T_DATA class IBM_DB::Connection
=> #<IBM_DB::Connection:0x00007ff60314ce58>
irb(main):003:0> stmt = IBM_DB.exec conn,'create table abc(C1 int)'
=> false
irb(main):004:0>
irb(main):005:0> IBM_DB.close(conn)
=> true
irb(main):006:0> exit


Above, If you observe IBM_DB.exec is called passing two arguments conn & string with create table query.
In extension code ibmdb/ruby-ibmdb/blob/master/IBM_DB_Driver/ibm_db.c,
below function will be called

VALUE ibm_db_exec(int argc, VALUE *argv, VALUE self)
{
....
rb_scan_args(argc, argv, "21", &connection, &stmt, &options);
......

}

Note: Please refer ibm_db.c under github ibmdb/ruby-ibmdb/blob/master/IBM_DB_Driver/ibm_db.c for complete code.

rb_scan_args used to parse arguments very well in ruby v 3.1, but now its failing to do so. I see stmt parameter doesnt hold anything.

I just want to know whats issue here, Am I passing arguments in wrong way (in ruby script), or am I not using rb_scan_args properly ?

To reproduce,
Install ruby v 3.2.3,
Install ibm_db gem version 5.4.1 (latest)
Run above sample ruby script using IRB.

Response at earliest is much appreciated.

Thanks
Praveen

Hi Praveen,

Seems that the issue is with how rb_scan_args function is parsing the arguments in Ruby v 3.2.3. The “21” argument in the rb_scan_args call expects two mandatory arguments and one optional. Check if you have provided all the necessary arguments while calling this function. Also, ensure that you’re using the latest version of the extension, as they might have fixed any compatibility issues with newer versions of Ruby.

If the issue still persists, you might want to drop an issue on the gem’s Github repository.

Best,
Bobby

Hi Robert,

I am the one who is maintaining ibm_db extension code. I am under way to make this extension compatible with Ruby v 3.2.3.

And I am passing necessary arguments to rb_scan_args, below is ruby line, conn is first argument and sql string is second argument. There are no optional arguments here.

stmt = IBM_DB.exec conn,'create table abc(C1 int)'

Thanks
Praveen