Wir speichern die Daten nicht mehr in eigenen Hashtabellen, sondern übertragen Hostname und URL in die request-Tabelle. Die gesamte Auswertelogik des ersten Skripts entfällt, da sie später mit SQL-Befehlen implementiert wird.
require "dbi"
re = /(.*)\s-\s-\s(?:.*)(?:GET|POST)\s(.*)\sH/
split = "\n"
sql = "INSERT INTO request(host, url) VALUES(?, ?)"
DBI.connect("DBI:Mysql:logs",
"rubychan", "Rubin") { |conn|
conn.prepare(sql) { |query|
loop {
data = STDIN.read(4095) or break
data += (STDIN.gets || "")
for line in data.split(split)
if md = re.match(line)
query.execute(md[1], md[2])
end
end
}
}
}
Mit connect wird eine Verbindung zum lokalen MySQL-Server
aufgebaut, wenn sich der angegebene Benutzer für die logs-Datenbank
authentifizieren kann. Für die erhaltene Verbindung bereiten wir dann
die SQL-Anweisung für das Einfügen vor. An Stelle der ? im
SQL-Text fügt die execute-Methode der Reihe nach die angegebenen
Argumente ein.
Wenn es der Datenbankserver unterstützt, parst und speichert prepare die
SQL-Anweisung bis auf die ?-Parameter, so dass die Abfrage schneller
ausgeführt werden kann.