summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfukachan <fukachan>2001-01-26 07:21:32 +0000
committerfukachan <fukachan>2001-01-26 07:21:32 +0000
commitdf88fed133dd67f2d6fd34d4d3b3c7642affe890 (patch)
tree57ca820c75673ba24294321c30f449b3b4f6614d
parent465f3fc1d8a893ff7f5baf98a64c3a3aaf3a696d (diff)
downloadfml8-df88fed133dd67f2d6fd34d4d3b3c7642affe890.tar.gz
fml8-df88fed133dd67f2d6fd34d4d3b3c7642affe890.tar.bz2
fml8-df88fed133dd67f2d6fd34d4d3b3c7642affe890.zip
log structured file dbsnap-20010125
-rw-r--r--fml/lib/Tie/LogFileDB.pm183
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;