#!/usr/local/bin/ruby # logparser.rb - Create SQL statements to replicate database changes # Copyright 2007 Eric Shane Radman # # This is free software; you may redistribute, modify, and use it under the # terms of the Modified BSD License. PG_LOGS = "/var/pgsql/data/pg_log" PG_SYNC = "/home/system" def parselog(logfile) puts "Processing '#{logfile}'" lf = File.new(logfile) sql = db = "" lf.each_line {|ln| if ln.slice(0,2) === "::" # Not a query, skip print '.' # » skip » elsif ln.slice(0,1) === ":" # New statement flush_query db, sql # Write query before next statement print '!' # » new statement » sql = "#{ln.split(/statement:/)[1]}" db = ln.split(':')[2] else # Everything else is statement body print '-' # » statement continued » sql.concat(ln) end } flush_query db, sql # Write whatever was collected 'till EOF puts File.delete(logfile) puts "done" end def flush_query(db, sql) if sql.strip.length > 0 and db != "" then sql.strip!.concat(";\n") begin file = open("#{PG_SYNC}/db_#{db}_updates.sql", "a") file.syswrite(sql) end end end if $0 == __FILE__ lst = Dir.entries(PG_LOGS).delete_if {|i| i[0,11] != 'postgresql-'}.sort if lst.length > 1 parselog "#{PG_LOGS}/#{lst[0]}" end end