Thread Hilfe für Regex
(21 answers)
Opened by lousek at 2011-08-06 17:24
Sali topeg
Zuerst mal vielen Dank für die investierte Zeit; ich hoffe, ich kann an der Perl Community irgendwann mein (hoffentlich dann grösseres) Wissen zurückgeben :) Genau, es ist wohl noch recht "unordentlich" :) Das mit den übergrossen Funktionen werde ich in Zukunft versuchen zu beherzigen ;) Bezüglich den unnötigen SQL-Abfragen: Eigentlich mache ich ja ein "genereller" SELECT (für die rep_dirs), dann pro rep_dir ein SELECT und dann für jedes neues Verzeichnis ein INSERT, für ein aktualisiertes ein UPDATE und für ein gelöschtes ein DELETE. Ich glaube, bei deinem Script habe ich noch nicht 100%ig verstanden, wie du die unnötigen SQL-Abfragen verhinderst :) Ich bin dein Script aufmerksam durchgegangen und versuche nun, alle restlichen "Unklarheiten" zu "erfragen" :) Und wenn ich nicht ganz verkehrt bin, hast du es nicht mit den directories, sondern mit den files gemacht, soweit bin ich zwar noch nicht, aber einen grossen Unterschied dürfte dies kaum machen :) Sehe ich das richtig, dass du sämtliche "direkte" Datenbankenfunktionen (sprich queries) als Referenzen(?) im Hash $sth_lst gespeichert hast? Warum genau hast du z.B. den prepare im delete_old und nicht einfach im sub delete_old_files "gespeichert"? So, nun zum "Ablauf": Als erstes wird bei allen Einträgen in der Tabelle dir der Status = 0 gesetzt, also auf "alt". Anschliessend wird mit File::Find für jedes file process_file aufgerufen. Hier sind mir ein paar Dinge nicht klar: - Die Funktion rel2abs konvertiert relative in absolute Pfade, aber $File::Find::Name würde ja schon den absoluten Pfad enthalten ... ? - Es wird mit return 0 unless (-f $path) erneut überprüft, ob die Datei existiert. Aber das wurde ja bereits vor dem Aufruf von process_file erledigt (return unless -f) ... ? Anschliessend wird überprüft ob der Pfad bereits in der DB steht. Aber wird hier nicht für jeden einzelnen Pfad einen eigenen SELECT gemacht? Dies wäre doch eben wieder nicht gerade so effizient ... ? Wenn der Pfad in der DB steht (defined($id)), so wird er aktualisiert wenn die atime, mtime, ctime, oder inode nicht übereinstimmt, ansonsten wird nur der status aktualisiert. Wenn der Pfad nicht in der DB steht, wird er "logischerweise" einfach eingefügt. Aber auch hier wird bei 50'000 files für jedes file ein SQL-Update oder -Insert Statement gemacht ... (?) Der letzte Teil ist wieder klar: Alle Einträge in der DB, welche verwaist sind (status = 0), werden gelöscht. Bei mir werden doch viel weniger SQL-Queries benötigt? Oder kann es sein, dass ich (trotz nachschauen auf CPAN) das mit dem begin_working() und commit() nicht ganz verstanden habe? :) So, nochmals vielen Dank :) LG lousek |