Abnormal program termination with dynamic data, but not with fixed data

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
<<field.toDB(obj)}
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
<<field.toDB(obj)}

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


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


walter@mwsewall.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
<<field.toDB(obj)}
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
<<field.toDB(obj)}

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

“Sean O’Dell” sean@REMOVEME.celsoft.com wrote in message
news:HiBRa.265$BG7.249@newssvr24.news.prodigy.com

walter@mwsewall.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
<<field.toDB(obj)}
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
<<field.toDB(obj)}

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

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” sean@REMOVEME.celsoft.com wrote in message
news:HiBRa.265$BG7.249@newssvr24.news.prodigy.com

walter@mwsewall.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
<<field.toDB(obj)}
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
<<field.toDB(obj)}

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