From b303645f803dd4e69af72598e4d933b4f366aa49 Mon Sep 17 00:00:00 2001 From: fukachan Date: Wed, 21 Feb 2001 11:06:03 +0000 Subject: add prototype --- fml/lib/File/Rotate.pm | 139 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 fml/lib/File/Rotate.pm (limited to 'fml/lib/File/Rotate.pm') 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 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 for more details. + +=cut + +1; -- cgit v1.2.1