Prepare for git repository
[spider.git] / perl / DXDupe.pm
index 2ab0ca8cee3c81c15e677dafa8d855511186bb10..851e3a6953eef03450020f399a9efa2b4b17f42f 100644 (file)
@@ -21,24 +21,43 @@ $fn = "$main::data/dupefile";
 
 sub init
 {
-       $dbm = tie (%d, 'DB_File', $fn) or confess "can't open dupe file: $fn ($!)";
+       $dbm = tie (%d, 'DB_File', $fn);
+       unless ($dbm) {
+               eval { untie %d };
+               dbg("Dupefile $fn corrupted, removing...");
+               unlink $fn;
+               $dbm = tie (%d, 'DB_File', $fn) or confess "can't open dupe file: $fn ($!)";
+               confess "cannot open $fn $!" unless $dbm; 
+       }
 }
 
 sub finish
 {
        undef $dbm;
        untie %d;
+       undef %d;
 }
 
 sub check
 {
-       my ($s, $t) = @_;
-       return 1 if exists $d{$s};
-       $t = $main::systime + $default unless $t;
-       $d{$s} = $t;
+       my $s = shift;
+       return 1 if find($s);
+       add($s, shift);
        return 0;
 }
 
+sub find
+{
+       return $d{$_[0]};
+}
+
+sub add
+{
+       my $s = shift;
+       my $t = shift || $main::systime + $default;
+       $d{$s} = $t;
+}
+
 sub del
 {
        my $s = shift;
@@ -49,9 +68,11 @@ sub process
 {
        # once an hour
        if ($main::systime - $lasttime >=  3600) {
+               my @del;
                while (($k, $v) = each %d) {
-                       delete $d{$k} if $main::systime >= $v;
+                       push @del, $k  if $main::systime >= $v;
                }
+               delete $d{$_} for @del;
                $lasttime = $main::systime;
        }
 }
@@ -73,11 +94,12 @@ sub listdups
        my $regex = shift;
 
        $regex =~ s/[\^\$\@\%]//g;
+       $regex = ".*$regex" if $regex;
        $regex = "^$let" . $regex;
        my @out;
        for (sort { $d{$a} <=> $d{$b} } grep { m{$regex}i } keys %d) {
                my ($dum, $key) = unpack "a1a*", $_;
-               push @out, "$key = " . cldatetime($d{$_} - $dupage);
+               push @out, "$key = " . cldatetime($d{$_} - $dupage) . " expires " . cldatetime($d{$_});
        }
        return @out;
 }