intertwingly

It’s just data

DB2 interface for Ruby Milestone


I’ve completed my first pass at porting the PHP ibm_db2 extension to Ruby.  If anyone out there has both Ruby and DB2 installed on a Unix machine, I would appreciate hearing if you can reproduce my results.

If you pick up the latest code and run it, you should now see

118 tests, 124 assertions, 0 failures, 0 errors

As the PHP extension I am porting was accompanied by 118 tests, this is significant.

The first thing to note is that I ran out of test cases before I ran out of code.  Functions which were not ported due to a lack of test cases:

columnprivileges/column_privileges
cursor_type
field_precision
field_scale
foreignkeys/foreign_keys
free_stmt
primarykeys/primary_keys
procedurecolumns/procedure_columns
procedures
setoption/set_option
specialcolumns/special_columns
statistics
tableprivileges/table_privileges

So, at this point, all that can be said is that the code does what the test test for.  It might actually do quite a bit more than that as much of the logic is largely untouched.  Areas where I likely injected bugs would be in language specific areas, like binding obscure data types as DB2::PARAM_INOUT.

Speaking of DB2::PARAM_INOUT, I had to work around one problem with Ruby 1.8, as I could not successfully resolve rb_dvar_asn at runtime.

void var_assign(char *name, VALUE value) {
#if TODO
    // this compiles and links, but fails to resolve at runtime
    rb_dvar_asgn(rb_intern(name_id), value);
#else
    // so we do it the hard way
    ID inspect;
    char *expr, *statement;
    long expr_len;
 
    inspect = rb_intern("inspect");
    value = rb_funcall(value, inspect, 0);
 
    expr = rb_str2cstr(value, &expr_len);
    statement = ALLOC_N(char, strlen(name)+1+expr_len+1);
    strcpy(statement, name);
    strcat(statement, "=");
    strcat(statement, expr);
    rb_eval_string(statement);
    free(statement);
#endif
}