# cgi's for the tutorial sign up require 'cgi' class CgiDb def initialize(fName, paramList) @fileName = fName @paramList = paramList @db = DataFile.new(fName) end def get_value(name) ans = "" @param[name].each{ |n| if !n next end n.strip! if n.size == 0 next end if ans.size > 0 ans = ans + ";" + n else ans = ans + n end } return nil if ans == "" return ans; end def getEntryKey if ! f = get_value("first") return nil end if ! l = get_value("last") return nil end if ! s = get_value("nospam") return nil end if s != "machine" return nil end f + " " + l end def insertEntry(cgi) @param = cgi.params if ! entry_key = getEntryKey return nil end @db[entry_key] = "" @paramList.each { |name, key| n = get_value(key) if n @db.append(entry_key, name, n) end } return entry_key end def writeToFile @db.writeToFile end def writeEntry(fd, section) @db.writeEntry(fd, section) end end # class CgiDb class DataFile < Hash def initialize(fName) @fileName = fName if ! fd = open(fName,"r") $stderr.puts "Cannot open #{fName}" end parse_db(fd) fd.close end def appendToDb(key, str) if !self[key] self[key] = "" end self[key] = self[key]+str+"\n" end def append(section, name, val) appendToDb(section, "#{name}: #{val}") appendToDb(section, "
") end def parse_db(dbFile) key = nil dbFile.each {|l| if m = /\[(.*)\]/.match(l) # check to see if it is a new entry key = m[1] self[key]="" next # same as continue end self[key] = self[key]+l if key } end # yield each section name contained in the buffer (same as each) def each_section each_key { |k| yield k } nil end # For the given section, yield the entry key-value pairs def each_entry(section) self[section].scan(/(.*):(.*)/) { |k,v| k.strip! v.strip! yield k,v } end # return the section as a Hash instance def getSection(section_name) h = Hash.new each_entry(section_name) { |k,v| h[k] = v } h end def getEntry(section_key, entry_key) if val = self[section_key] each_entry(section_key) { |k,v| if entry_key == k return v end } end nil end def writeEntry(fd, k, v = nil) fd.puts "["+k+"]" # make sure val is well formed and we don't keep adding lines to # the file for a simple rewrite of the record. db = self if ! v if !(v = db[k]) return nil; end end val = v.strip fd.puts "
" if val.index("