diff options
| author | fukachan <fukachan> | 2001-02-21 11:06:03 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2001-02-21 11:06:03 +0000 |
| commit | b303645f803dd4e69af72598e4d933b4f366aa49 (patch) | |
| tree | 3fd7673130d14b8719babf246feee87cfd7e9d65 /fml/lib/File/Rotate.pm | |
| parent | 1e8c7cd38a2f8339116ed7a1951fb8770ee8703d (diff) | |
| download | fml8-b303645f803dd4e69af72598e4d933b4f366aa49.tar.gz fml8-b303645f803dd4e69af72598e4d933b4f366aa49.tar.bz2 fml8-b303645f803dd4e69af72598e4d933b4f366aa49.zip | |
add prototype
Diffstat (limited to 'fml/lib/File/Rotate.pm')
| -rw-r--r-- | fml/lib/File/Rotate.pm | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/fml/lib/File/Rotate.pm b/fml/lib/File/Rotate.pm new file mode 100644 index 00000000..9437f05a --- /dev/null +++ b/fml/lib/File/Rotate.pm @@ -0,0 +1,139 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package File::Rotate; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; + +BEGIN {} +END {} + +=head1 NAME + +IO::Rotate - IO with rotate operations + +=head1 SYNOPSIS + + $obj = new IO::Rotate { + max_size => 10000, + num_backlog => 4, + }; + $obj->rotate( \@target_files ); + +=head1 DESCRIPTION + +library to wrap Rotate IO operations. +It automatically rotates $file in close() operation. +C<rotation> rearranges files like this: + + rm file.4 + mv file.3 file.4 + mv file.2 file.3 + mv file.1 file.2 + mv file.0 file.1 + mv file file.0 + +=cut + +# Descriptions: constructor +# forward new() request to superclass (IO::File) +# Arguments: $class_name $HASH_REFERENCE +# Side Effects: none +# Return Value: class object +# XXX $self is blessed file handle. +sub new +{ + my ($self, $args) = shift; + my ($type) = ref($self) || $self; + my $me = {}; + + if ( ref($args->{ file_list }) eq 'ARRAY' ) { + $me->{ _file_list } = $args->{ file_list }; + } + $me->{ _max_size } = $args->{ max_size } || 300*1024; + $me->{ _num_backlog } = $args->{ num_backlog } || 4; + + return bless $me, $type; +} + + +sub is_time_to_rotate +{ + my ($self) = @_; + my ($file, $size, $max) = $self->_get_param(); + + use File::stat; + my $st = stat($file); + + return 1 if $st->size > $size; + return 0; +} + + +sub rotate +{ + my ($self) = @_; + my ($file, $size, $max) = $self->_get_param(); + + # remove oldest file + my $maxfile = $file.".".$max; + if (-f $maxfile) { unlink $maxfile;} + + # mv var/log/file.3 -> var/log/file.4 ...; + do { + my $old = "$file.".($max - 1 > 0 ? $max - 1 : 0); + my $new = "$file.".($max); + print STDERR "rename($old, $new)" if -f $old; + -f $old && rename($old, $new); + $max--; + } while ($max > 0); +} + + +sub _get_param +{ + my ($self) = @_; + (${*$self}{_file}, ${*$self}{_max_size}, ${*$self}{_num_backlog}); +} + + +# Descriptions: return error message +# Arguments: $self +# XXX $self is blessed file handle. +# Side Effects: none +# Return Value: error message string +sub error +{ + my ($self) = @_; + my $fh = $self; + ${ *$fh }{ _error }; +} + + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +File::Rotate appeared in fml5 mailing list driver package. +See C<http://www.fml.org/> for more details. + +=cut + +1; |
