From: Sean O'Dell Date: 2003-07-18T03:18:51+09:00 Subject: Re: abnormal program termination with dynamic data, but not with fixed data "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,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? Actually, what is the entire backtrace? What line in your code is causing the failure? Sean O'Dell