From: walter@... Date: 2003-07-18T04:11:43+09:00 Subject: Re: abnormal program termination with dynamic data, but not with fixed data The exception is during the call to sth.execute(*params) It looks like it is in the ODBC module. I have been able to duplicate the error using the ODBC module directly without using DBI. The error in both cases happened when I attempt to execute with a long dynamically generated parameter list. It works fine with a hand keyed parameter list. Both lists are the same size, all matching elements show that they are equal, but the dynamically generated one always crashes. Walt > "Sean O'Dell" wrote in message > news:HiBRa.265$BG7.249@newssvr24.news.prodigy.com... > > wrote in message > > news:3F1094D4.21763.2AFC3C8@localhost... > > > hi everyone. I am stumped! > > > > > > I have code that is part of a simple persistent object manager. > > > The system takes an object, builds an update statement, and builds > > > the parameter list. > > > > > > I keep getting an abnormal program termination. Hoever as you can > > > see in the modified code segment below, I can run the same query > > > with the same data that is hand keyed and it works fine. > > > > > > Below, you can see that the dynamically created arrays and the > > > hand keyed one are identical, but one always aborts and one works > > > fine. I am running ruby 1.8 on windows 2000 using the pragmatic > > > programmers installer. > > > > > > Does anyone have any ideas? > > > > > > > > > Walt > > > > > > > > > > > > This one ends in a segmentation fault > > > ## original code ## > > > def update(obj) > > > raise SpomDBClosedException.new if closed? > > > executeCount = 0 > > > dbObject = @spom.getObjectMapping(obj.class) > > > dbHandle.prepare(dbObject.updateSQL) do |sth| > > > params = [] > > > dbObject.nonKeyFields.each{|field| params << > > > field.toDB(obj)} > > > dbObject.keyFields.each{|field| params > > > < > > executeCount = sth.execute(*params) > > > end > > > executeCount > > > end > > > ## end original code ## > > > > > > > > > > > > this modified version works. The main difference is that I am > > > executing the update with a fixed array, not the dynamically > > > computed > > > > > > array. It also has some code to compare the dynamically computed > > > array, and the fixed one. It appears that they are identical, > > > however, the dynamically created one always ends with : > > > > > > C:/ruby/lib/ruby/site_ruby/1.8/DBD/ODBC/ODBC.rb:202: [BUG] > > > Segmentation fault > > > ruby 1.8.0 (2003-05-26) [i386-mswin32] > > > > > > > > > abnormal program termination > > > > > > > > > ## modified code ## > > > def update(obj) > > > raise SpomDBClosedException.new if closed? > > > executeCount = 0 > > > dbObject = @spom.getObjectMapping(obj.class) > > > dbHandle.prepare(dbObject.updateSQL) do |sth| > > > params = [] > > > dbObject.nonKeyFields.each{|field| params << > > > field.toDB(obj)} > > > dbObject.keyFields.each{|field| params > > > < > > > > > puts "computed data" > > > puts compData = params.join(",") > > > compClasses = params.collect{|i| i.class} > > > puts compClasses.join(",") > > > > > > keyed = [Date.today, 'aaa', 'POIL', 'line1', 'line2', 'city', > > > 'st', 'zip', 'country', 'p', '1', '2', '3', '4', '5', '6', '7', > > > '8', '9', '10', Date.today, '-' , '', '', '', '', '', '', '', 20, > > > 21, 'sic', 'disp', 'oth3', "31", "32", "33", "34", "35", 'POIL', > > > 999999] > > > > > > puts "" > > > puts "hand keyed data" > > > puts keyedData = keyed.join(",") > > > keyedClasses = keyed.collect{|i| i.class} > > > puts keyedClasses.join(",") > > > > > > puts "" > > > puts "size (#{params.size}) same? #{params.size == keyed.size}" > > > puts "raw data same? #{params == keyed}" puts "joined data same? > > > #{compData == keyedData}" puts "raw classes same #{compClasses == > > > keyedClasses}" > > > > > > #note nothing prints > > > params.each_with_index do |p, index| > > > puts "******* #{index} does NOT equal data" if p != > > > keyed[index] puts "******* #{index} does NOT equal class" if > > > p.class != > > > keyed[index].class > > > end > > > > > > params = keyed #NOTE: replace dynamic data with keyed data > > > > > > executeCount = sth.execute(*params) > > > end > > > executeCount > > > end > > > > > > ## end modified code ## > > > > > > ****************** > > > ***** OUTPUT ***** > > > ****************** > > > > > > computed data > > > 2003-07- > > > 12,aaa,POIL,line1,line2,city,st,zip,country,p,1,2,3,4,5,6,7,8,9,10 > > > ,200 > > > 3-07-12,-,,,,,,,,20,21,sic,disp,oth3,31,32,33,34,35,POIL,999999 > > > Date,String,String,String,String,String,String,String,String,Strin > > > g,St > > > ring,String,String,String,String,String,String,String,String,Strin > > > g,Da > > > te,String,String,String,String,String,String,String,String,Fixnum, > > > Fixn > > > um,String,String,String,String,String,String,String,String,String, > > > Fixn um > > > > > > hand keyed data > > > 2003-07- > > > 12,aaa,POIL,line1,line2,city,st,zip,country,p,1,2,3,4,5,6,7,8,9,10 > > > ,200 > > > 3-07-12,-,,,,,,,,20,21,sic,disp,oth3,31,32,33,34,35,POIL,999999 > > > Date,String,String,String,String,String,String,String,String,Strin > > > g,St > > > ring,String,String,String,String,String,String,String,String,Strin > > > g,Da > > > te,String,String,String,String,String,String,String,String,Fixnum, > > > Fixn > > > um,String,String,String,String,String,String,String,String,String, > > > Fixn um > > > > > > size (41) same? true > > > raw data same? true > > > joined data same? true > > > raw classes same true > > > > Which line is line 202? > > Actually, what is the entire backtrace? What line in your code is > causing the failure? > > Sean O'Dell > > > ***************************************************** Walter Szewelanczyk IS Director M.W. Sewall & CO. email : walter@mwsewall.com 259 Front St. Phone : (207) 442-7994 x 128 Bath, ME 04530 Fax : (207) 443-6284 *****************************************************