#!/usr/local/bin/ruby -w

require "dbi"

# dynamische Address Klasse
# bekommt einen Hash als Argument mit den Spalten Namen als keys
# und den Spalten Einträgen als values
class Address
       def initialize(hash)
               hash.keys.each do |key|
                       type.send(:attr_accessor, key)
               end

               hash.each do |key, value|
                       send("#{key}=", value)
               end
       end
end

# Bekommt die Daten für die Datenbank
# Jede von DBI unterstützte Datenbank ist verwendbar
class AddressDB
       def initialize(dbd_driver, database, table, user="", password="")
               @dbd_driver = dbd_driver
               @database   = database
               @table      = table
               @user       = user
               @password   = password
               @column_names = []

               @dbh = DBI.connect("dbi:#{dbd_driver}:#{database}", user, password)
               @dbh.columns("#{table}").each do |col|
                       #puts col['name']
                       @column_names << col['name']
               end
       end

       # liefert für jeden Eintrag ein Address Objekt zurück
       def each_entry
               sql = "SELECT * FROM #{@table}"
               @dbh.execute(sql)  do |sth|
                       sth.fetch do |row|
                               r = row.to_h
                               yield Address.new(r)
                       end
               end

       end

end

# Testcode
ab = AddressDB.new("Mysql", "abook1", "addresses1", "markus", "eagle")

# Einfache Datenausgabe
ab.each_entry do |address|
       print "firstname: ", address.firstname, "\n"
       print "lastname: ", address.lastname, "\n"
       print "email: ", address.email, "\n"
       puts
end