#!/usr/bin/env ruby

require 'depot'
require 'villa'

require 'reform'

class Commit
  def initialize
    @mdb = Villa::new("math.db",
                      Villa::OWRITER|Villa::OCREAT|Villa::OZCOMP)
    @intdb = Villa::new("int.db",
                        Villa::OWRITER|Villa::OCREAT|Villa::OZCOMP)
    @iddb = Depot::new("id.db", Depot::OWRITER|Depot::OCREAT, 0)

    @cnt = 0
    if (File.exists?('cnt.db'))
      File.open('cnt.db', 'r') do |ifile|
        @cnt = ifile.read.to_i
      end
    end
  end

  def add(m, site, path, title = nil)
    formula = m.dup
    r = reform(m)

    return if r.size < 3

    data = "#{site},#{path},#{formula}"
    data <<= "\n#{title}" if title
    @iddb.put(@cnt.to_s, data)

    for i in 0..r.size-3
      s = r[i..-1].join('')
      m = r[0...i].join('').size
      @mdb.put(s, "#{m},#{@cnt}", Villa::DDUP)
    end

    if (ri = intersect(r))
      for i in 0..ri.size-3
        s = ri[i..-1].join('')
        break if (s !~ /\\1.*?\\1/)
        m = ri[0...i].join('').size
        @intdb.put(s, "#{m},#{@cnt}", Villa::DDUP)
      end
    end

    @cnt += 1
    print "#{@cnt}\n"
  end

  def close
    @mdb.optimize
    @intdb.optimize
    @iddb.optimize

    @mdb.close
    @intdb.close
    @iddb.close

    File.open('cnt.db', 'w') do |of|
      of.print(@cnt.to_s)
    end
  end
end

