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/, '') # $deferr.puts('> ' + line.inspect) case line when /^= .* [vV]ersion (\d+)/ then ver = $1.to_i when /^= Category (\d+)\s*-\s*/ then categ, cdesc = $1.to_i, $' puts <<-ENDSQL REPLACE INTO bufrdx(dom, ver, cls, dsc) VALUES(#{sqli domain}, #{sqli ver}, #{sqli categ}, #{sqls cdesc}); ENDSQL when /^=/ then # do nothing when /^#?\s*$/ then raise if st[:phase] if st[:seq] then puts <<-ENDSQL REPLACE INTO bufrdy(dom, ver, cls, cod, dsc) VALUES( #{sqli domain}, #{sqli ver}, #{sqli st[:cls]}, #{sqli st[:cod]}, #{sqls st[:dsc].to_s} ); ENDSQL (0...(st[:seq].size)).each {|i| f, x, y, n = st[:seq][i] puts <<-ENDSQL REPLACE INTO bufrd( dom, ver, cls, cod, pos, f, x, y, dsc, sta) VALUES( #{sqli domain}, #{sqli ver}, #{sqli st[:cls]}, #{sqli st[:cod]}, #{sqli i}, #{sqli f}, #{sqli x}, #{sqli y}, #{sqls n}, #{sqls st[:sta].to_s}); ENDSQL } end st = {} when /^# ([ \w]*):\s*$/ then st[:sta] = $1.dup when /^#\s*\(([^)]+)\)\s*$/ then st[:dsc] = $1.dup when /^#/ then # do nothing when /^ ?3([0-6]\d)(\d\d\d)\s*(?:\S.*)?$/ then raise "duplicated head #{line.inspect}" if st[:phase] st[:phase] = 1 st[:cls], st[:cod] = $1.to_i, $2.to_i st[:ver] = ver st[:seq] = [] if $3 st[:dsc] = $3.strip if $3 st[:dsc] = $1 if /^\(([^)]*)\)$/ === st[:dsc] end when /^\s+([0-3])([0-6]\d)([012]\d\d)(?:\(\d+\))?\s*(\S.*)?$/ then st.delete(:phase) elf, elx, ely, eld = $1.to_i, $2.to_i, $3.to_i, $4.to_s.strip raise "sequence #{line.inspect} without head" unless st[:seq] st[:seq].push([elf, elx, ely, eld]) when /^[a-zA-Z]/ then st[:seq].last.last.sub!(/$/, line) else raise line.inspect end end puts "COMMIT;"