1 package File
::Rsync
::Mirror
::Recentfile
::Done
;
6 use File
::Rsync
::Mirror
::Recentfile
::FakeBigFloat
qw(:all);
12 File::Rsync::Mirror::Recentfile::Done - intervals of already rsynced timespans
20 use version
; our $VERSION = qv
('0.0.1');
24 my $done = File::Rsync::Mirror::Recentfile::Done->new;
25 $done->register ( $recent_events, [3,4,5,9] ); # registers elements 3-5 and 9
26 my $boolean = $done->covered ( $epoch );
30 Keeping track of already rsynced timespans.
38 =head2 my $obj = CLASS->new(%hash)
40 Constructor. On every argument pair the key is a method name and the
41 value is an argument to that method name.
46 my($class, @args) = @_;
47 my $self = bless {}, $class;
49 my($method,$arg) = splice @args, 0, 2;
68 split /\n/, <<'=cut'; push @accessors, grep {s/^=item\s+//} @pod_lines; }
74 Boolean to turn on a bit verbosity.
80 use accessors
@accessors;
84 =head2 $boolean = $obj->covered ( $epoch1, $epoch2 )
86 =head2 $boolean = $obj->covered ( $epoch )
88 The first form returns true if both timestamps $epoch1 and $epoch2 in
89 floating point notation have been registered within one interval,
92 The second form returns true if this timestamp has been registered.
97 my($self, $epoch_high, $epoch_low) = @_;
98 die "Alert: covered() called without or with undefined first argument" unless defined $epoch_high;
99 my $intervals = $self->_intervals;
100 return unless @
$intervals;
101 if (defined $epoch_low) {
102 ($epoch_high,$epoch_low) = ($epoch_low,$epoch_high) if $epoch_low > $epoch_high;
104 for my $iv (@
$intervals) {
105 my($upper,$lower) = @
$iv; # may be the same
106 if (defined $epoch_low) {
108 for my $e ($epoch_high,$epoch_low) {
110 $e eq $upper || $e eq $lower || ($e < $upper && $e > $lower);
112 return 1 if $goodbound > 1;
114 return 1 if $epoch_high eq $upper || $epoch_high eq $lower || ($epoch_high < $upper && $epoch_high > $lower);
120 =head2 (void) $obj1->merge ( $obj2 )
122 Integrates all intervals in $obj2 into $obj1. Overlapping intervals
123 are conflated/folded/consolidated. Sort order is preserved as decreasing.
127 my($self, $other) = @_;
128 my $intervals = $self->_intervals;
129 my $ointervals = $other->_intervals;
130 OTHER
: for my $oiv (@
$ointervals) {
133 SELF
: for my $i (0..$#$intervals) {
134 my $iv = $intervals->[$i];
135 if ( _bigfloatlt
($oiv->[0],$iv->[1]) ) {
136 # both oiv lower than iv => next
139 if ( _bigfloatgt
($oiv->[1],$iv->[0]) ) {
140 # both oiv greater than iv => insert
144 # larger(left-iv,left-oiv) becomes left, smaller(right-iv,right-oiv) becomes right
145 $iv->[0] = _bigfloatmax
($oiv->[0],$iv->[0]);
146 $iv->[1] = _bigfloatmin
($oiv->[1],$iv->[1]);
149 unless (defined $splicepos) {
150 if ( _bigfloatlt
($oiv->[0], $intervals->[-1][1]) ) {
151 $splicepos = @
$intervals;
153 die "Panic: left-oiv[$oiv->[0]] should be smaller than smallest[$intervals->[-1][1]]";
156 splice @
$intervals, $splicepos, 0, [@
$oiv];
158 $intervals->[0] = [@
$oiv];
163 =head2 (void) $obj->register ( $recent_events_arrayref, $register_arrayref )
165 =head2 (void) $obj->register ( $recent_events_arrayref )
167 The first arrayref is a list fo hashes that contain a key called
168 C<epoch> which is a string looking like a number. The second arrayref
169 is a list if integers which point to elements in the first arrayref to
172 The second form registers all events in $recent_events_arrayref.
177 my($self, $re, $reg) = @_;
178 my $intervals = $self->_intervals;
182 REGISTRANT
: for my $i (@
$reg) {
183 my $logfile = $self->_logfile;
186 open my $fh, ">>", $logfile or die "Could not open '$logfile': $!";
187 print $fh YAML
::Syck
::Dump
({
190 ($i>0 ?
("re-1" => $re->[$i-1]) : ()),
192 ($i<$#$re ? ("re+1" => $re->[$i+1]) : ()),
193 intervals
=> $intervals,
200 intervals
=> $intervals,
204 open my $fh, ">>", $logfile or die "Could not open '$logfile': $!";
205 print $fh YAML
::Syck
::Dump
({
208 intervals
=> $intervals,
215 my($self, $one) = @_;
216 my($i,$re,$intervals) = @
{$one}{qw(i re intervals)};
217 die sprintf "Panic: illegal i[%d] larger than number of events[%d]", $i, $#$re
219 my $epoch = $re->[$i]{epoch
};
220 return if $self->covered ( $epoch );
223 for my $iv (@
$intervals) {
224 my($ivupper,$ivlower) = @
$iv; # may be the same
226 && _bigfloatge
($re->[$i-1]{epoch
}, $ivlower)
227 && _bigfloatle
($re->[$i-1]{epoch
}, $ivupper)
233 && _bigfloatle
($re->[$i+1]{epoch
}, $ivupper)
234 && _bigfloatge
($re->[$i+1]{epoch
}, $ivlower)
240 if ($registered == 2) {
241 $self->_register_one_fold2
246 } elsif ($registered == 1) {
248 $self->_register_one_fold0
255 $intervals->[0] = [($epoch)x2
];
259 sub _register_one_fold0
{
265 for my $i (0..$#$intervals) {
266 if (_bigfloatgt
($epoch, $intervals->[$i][0])) {
271 unless (defined $splicepos) {
272 if (_bigfloatlt
($epoch, $intervals->[-1][1])) {
273 $splicepos = @
$intervals;
275 die "Panic: epoch[$epoch] should be smaller than smallest[$intervals->[-1][1]]";
278 splice @
$intervals, $splicepos, 0, [($epoch)x2
];
281 sub _register_one_fold2
{
287 for my $i (0..$#$intervals) {
288 if ( $epoch eq $intervals->[$i][1]
289 && $intervals->[$i][1] eq $intervals->[$i+1][0]) {
290 $intervals->[$i+1][0] = $intervals->[$i][0];
295 if (defined $splicepos) {
296 splice @
$intervals, $splicepos, 1;
298 die "Panic: Could not find an interval position to insert '$epoch'";
302 =head1 PRIVATE METHODS
309 my $x = $self->__intervals;
310 unless (defined $x) {
312 $self->__intervals ($x);
317 =head1 COPYRIGHT & LICENSE
319 Copyright 2008 Andreas König.
321 This program is free software; you can redistribute it and/or modify it
322 under the same terms as Perl itself.
326 1; # End of File::Rsync::Mirror::Recentfile
330 # cperl-indent-level: 4