www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Beispielprogramm

db-tierdbm.pl
#!/usr/local/bin/perl -w
# db-tierdbm.pl -- Persistente Hashes auf Datenbanktabellen: Tie::RDBM

use Tie::RDBM;

tie %uxpw, 'Tie::RDBM', 'mysql:test', { table => 'uxpass', create => 1 }
    or die "can't tie: $!\n";

open(PASSWD, "< /etc/passwd") or die "can't open: $!\n";
while (<PASSWD>) {
    chomp; my @f = split(/:/);
    foreach my $f (@f) { undef $f if defined $f and $f eq '' };

    # Wir speichern unsere komplexe Datenstruktur ab:
    $uxpw{$f[0]} = { uid => $f[2], gid => $f[3],
                     gcos => defined $f[4] ? [ split /,/, $f[4] ] : [],
             home => $f[5], shell => $f[6] };

    # Fuer normale Abfragen durch andere Tools, wie z.B. mysql,
    # fuegen wir stringifizierte Eintraege hinzu [optional]:
    $uxpw{$f[0] . "_str"} = join(':', @f[0,2,3]);

    $found{$f[0]} = 1;
}
close(PASSWD);

# Wir loeschen alle Eintraege, die nicht mehr vorhanden sind:
while (($key, undef) = each(%uxpw)) {
    next if $key =~ /_str$/;
    unless (exists $found{$key}) {
    delete $uxpw{$key};
    delete $uxpw{$key . "_str"};
    }
}

# MySQL kennt keine Transaktionen, sonst haetten wir sagen sollen:
# tied(%uxpw)->commit();     # Wenn alles okay ist.
# tied(%uxpw)->rollback();   # Nein, wir wollen es doch nicht.

# Wir aendern unter MySQL eine komplexe Datenstruktur:
tied(%uxpw)->{'dbh'}->do("LOCK TABLES uxpass WRITE");
die "Error: $DBI::errstr\n" if $DBI::err;

    $tmpgcos = $uxpw{$ENV{'USER'}};
    push(@{$tmpgcos->{'gcos'}}, "Test added " . localtime(time));
    $uxpw{$ENV{'USER'}} = $tmpgcos;

tied(%uxpw)->{'dbh'}->do("UNLOCK TABLES");
die "Error: $DBI::errstr\n" if $DBI::err;

# Nun geben wir noch unseren Eintrag aus:
use Data::Dumper;
print Dumper($uxpw{$ENV{'USER'}});

# Das war's, Leute!
untie %uxpw;
   

[Prev] [Up] [Relevant Chapter] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:55:55 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo