diff options
| author | fukachan <fukachan> | 2001-01-26 07:21:32 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2001-01-26 07:21:32 +0000 |
| commit | df88fed133dd67f2d6fd34d4d3b3c7642affe890 (patch) | |
| tree | 57ca820c75673ba24294321c30f449b3b4f6614d | |
| parent | 465f3fc1d8a893ff7f5baf98a64c3a3aaf3a696d (diff) | |
| download | fml8-df88fed133dd67f2d6fd34d4d3b3c7642affe890.tar.gz fml8-df88fed133dd67f2d6fd34d4d3b3c7642affe890.tar.bz2 fml8-df88fed133dd67f2d6fd34d4d3b3c7642affe890.zip | |
log structured file dbsnap-20010125
| -rw-r--r-- | fml/lib/Tie/LogFileDB.pm | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/fml/lib/Tie/LogFileDB.pm b/fml/lib/Tie/LogFileDB.pm new file mode 100644 index 00000000..6759a60a --- /dev/null +++ b/fml/lib/Tie/LogFileDB.pm @@ -0,0 +1,183 @@ +#-*- 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 IO::LogFileDB; + +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD); +use Carp; + +require Exporter; +@ISA = qw(Exporter); + + +sub new +{ + my ($self, $args) = @_; + my ($type) = ref($self) || $self; + my $me = {}; + + $me->{ _file } = $args->{ file }; + + if ($args->{ first_match }) { + $me->{ _match_style } = 'first'; + } + elsif ($args->{ last_match }) { + $me->{ _match_style } = 'last'; + } + else { + $me->{ _match_style } = 'first'; + } + + return bless $me, $type; +} + + +sub TIEHASH +{ + my ($self, $args) = @_; + my ($type) = ref($self) || $self; + new($self, $args); +} + + +sub grep +{ + my ($self, $key) = @_; + my $rarray = $self->_fetch($key, 'array'); + return @$rarray; +} + + +sub FETCH +{ + my ($self, $key) = @_; + $self->_fetch($key, 'scalar'); +} + + +sub STORE +{ + my ($self, $key, $value) = @_; +} + + +sub _fetch +{ + my ($self, $key, $mode) = @_; + my $prekey = $key; + + # the first 1 byte of the key + if ($key =~ /^(.)/) { $prekey = $1;} + + use IO::File; + my $fh = new IO::File; + $fh->open( $self->{ _file }, "r"); + + my ($xkey, $xvalue) = (); + my (@values) = (); + SEARCH: + while (<$fh>) { + next SEARCH if /^\#*$/; + next SEARCH if /^\s*$/; + next SEARCH unless /^$prekey/i; + next SEARCH unless /^$key/i; + + chop; + + ($xkey, $xvalue) = split(/\s+/, $_, 2); + if ($xkey eq $key) { + if ($mode eq 'array') { + push(@values, $xvalue); + } + if ($mode eq 'scalar') { + # firstmatch: exit loop ASAP if the $key is found. + if ($self->{ _match_style } eq 'first') { + last SEARCH; + } + } + } + } + close($fh); + + if ($mode eq 'scalar') { + return( $xvalue || undef ); + } + if ($mode eq 'array') { + return \@values; + } +} + + +=head1 NAME + +IO::LogFileDB.pm - what is this + +=head1 SYNOPSIS + + use IO::LogFileDB; + $db = new IO::LogFileDB { file => 'cache.txt' }; + + # all entries with the key = 'rudo' + @values = $db->grep( rudo ); + +or + + use IO::LogFileDB; + tie %db, 'IO::LogFileDB', { file => 'cache.txt' }; + print $db{ rudo }, "\n"; + +where cache file "cache.txt" format is "key value" for each line. +For example + + rudo teddy bear + kenken north fox + ..... + +By default, FETCH() returns the first value with the key. + + use IO::LogFileDB; + tie %db, 'IO::LogFileDB', { first_match => 1, file => 'cache.txt' }; + print $db{ rudo }, "\n"; + +if you find the latest value (so at the later line somewhere in the +file) for the $key + + use IO::LogFileDB; + tie %db, 'IO::LogFileDB', { last_match => 1, file => 'cache.txt' }; + print $db{ rudo }, "\n"; + + + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=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 + +IO::LogFileDB.pm appeared in fml5. + +=cut + +1; |
