From: Sean O'Dell Date: 2003-07-18T02:58:21+09:00 Subject: Re: abnormal program termination with dynamic data, but not with fixed data 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,String,St > ring,String,String,String,String,String,String,String,String,String,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,String,St > ring,String,String,String,String,String,String,String,String,String,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? Sean O'Dell