fixed duplicate spot, always make clean ending
[spider.git] / perl / DXDupe.pm
1 #
2 # class to handle all dupes in the system
3 #
4 # each dupe entry goes into a tied hash file 
5 #
6 # the only thing this class really does is provide a
7 # mechanism for storing and checking dups
8 #
9
10 package DXDupe;
11
12 use DXDebug;
13 use DXUtil;
14 use DXVars;
15
16 use vars qw{$lasttime $dbm %d $default $fn};
17
18 $default = 48*24*60*60;
19 $lasttime = 0;
20 $fn = "$main::data/dupefile";
21
22 sub init
23 {
24         unlink $fn;
25         $dbm = tie (%d, 'DB_File', $fn);
26         confess "cannot open $fn $!" unless $dbm;
27 }
28
29 sub finish
30 {
31         undef $dbm;
32         untie %d;
33         undef %d;
34         unlink $fn;
35 }
36
37 sub active
38 {
39         return $dbm;
40 }
41
42 sub check
43 {
44         my $s = shift;
45         return 1 if find($s);
46         add($s, shift);
47         return 0;
48 }
49
50 sub find
51 {
52         return $d{$_[0]};
53 }
54
55 sub add
56 {
57         my $s = shift;
58         my $t = shift || $main::systime + $default;
59         $d{$s} = $t;
60 }
61
62 sub del
63 {
64         my $s = shift;
65         delete $d{$s};
66 }
67
68 sub process
69 {
70         # once an hour
71         if ($main::systime - $lasttime >=  3600) {
72                 my @del;
73                 while (($k, $v) = each %d) {
74                         push @del, $k  if $main::systime >= $v;
75                 }
76                 delete $d{$_} for @del;
77                 $lasttime = $main::systime;
78         }
79 }
80
81 sub get
82 {
83         my $start = shift;
84         my @out;
85         while (($k, $v) = each %d) {
86                 push @out, $k, $v if !$start || $k =~ /^$start/; 
87         }
88         return @out;
89 }
90
91 sub listdups
92 {
93         my $let = shift;
94         my $dupage = shift;
95         my $regex = shift;
96
97         $regex =~ s/[\^\$\@\%]//g;
98         $regex = ".*$regex" if $regex;
99         $regex = "^$let" . $regex;
100         my @out;
101         for (sort { $d{$a} <=> $d{$b} } grep { m{$regex}i } keys %d) {
102                 my ($dum, $key) = unpack "a1a*", $_;
103                 push @out, "$key = " . cldatetime($d{$_} - $dupage) . " expires " . cldatetime($d{$_});
104         }
105         return @out;
106 }
107 1;