def sqls arg case arg when String then ["'", arg.gsub(/'/, "''"), "'"].join when NilClass then 'NULL' else raise "bad arg #{arg.inspect} to sqls" end end def sqli arg case arg when Integer then arg.to_i when NilClass then 'NULL' else raise "bad arg #{arg.inspect} to sqli" end end ver = klass = nil domain = 0 st = {} puts "BEGIN;" for line in ARGF line = line.chomp.gsub(/\r/, '') case line when /^= .* [vV]ersion (\d+)/ then ver = $1.to_i when /^= Class (\d+)\s*-\s*/ then kklass, kdesc = $1.to_i, $' puts <<-ENDSQL REPLACE INTO bufrbx(dom, ver, cls, dsc) VALUES(#{sqli domain}, #{sqli ver}, #{sqli kklass}, #{sqls kdesc}); ENDSQL when /^=/ then # do nothing when /^#?\s*$/ then st = {} when /^# ([ \w]*):\s*$/ then st[:sta] = $1.dup when /^#/ then # do nothing when /^ 0([0-6]\d)(\d\d\d)\s*/ then raise if st[:phase] st[:phase] = 1 st[:ver] = ver st[:cls], st[:cod], st[:dsc] = $1.to_i, $2.to_i, $' when /^ (-?\d+) +(-?\d+) +(\d+)(\*| N| Numeric)?\s*$/ then raise unless st[:phase] == 2 st.delete(:phase) st[:scl], st[:rfv], st[:wid] = $1.to_i, $2.to_i, $3.to_i puts <<-ENDSQL REPLACE INTO bufrb( dom, ver, cls, cod, uni, wid, scl, rfv, dsc, sta) VALUES(#{sqli domain}, #{sqli ver}, #{sqli st[:cls]}, #{sqli st[:cod]}, #{sqls st[:uni]}, #{sqli st[:wid]}, #{sqli st[:scl]}, #{sqli st[:rfv]}, #{sqls st[:dsc]}, #{sqls st[:sta].to_s}); ENDSQL #p st when /^ (\S.*)$/ then raise [line, st].inspect unless st[:phase] == 1 st[:phase] = 2 st[:uni] = $1 else $deferr.puts line.inspect end end puts "COMMIT;"