File Coverage

blib/lib/MetaStore/StoreDir.pm
Criterion Covered Total %
statement 98 112 87.5
branch 25 42 59.5
condition 7 12 58.3
subroutine 22 24 91.6
pod 1 11 9.0
total 153 201 76.1


line stmt bran cond sub pod time code
1             package MetaStore::StoreDir;
2              
3             =head1 NAME
4              
5             MetaStore::StoreDir - Simple store/restore data to files in dirs.
6              
7             =head1 SYNOPSIS
8              
9             use MetaStore::StoreDir;
10             my $fz = IO::Zlib->new($tmp_file, "rb");
11             my $dir = tempdir( CLEANUP => 0 );
12             my $temp_store = new MetaStore::StoreDir:: $dir;
13             $temp_store->putRaw("file.dat",$fz);
14             $fz->close;
15              
16             =head1 DESCRIPTION
17              
18             Simple store/restore data to files in dirs.
19              
20             =head1 METHODS
21              
22             =cut
23              
24 1     1   53426 use IO::File;
  1         12553  
  1         172  
25 1     1   12 use File::Path;
  1         2  
  1         69  
26 1     1   7 use Data::Dumper;
  1         3  
  1         57  
27 1     1   6 use warnings;
  1         2  
  1         50  
28 1     1   1239 use Encode;
  1         13797  
  1         136  
29 1     1   12 use Carp;
  1         2  
  1         89  
30 1     1   6 use strict;
  1         2  
  1         75  
31             our $VERSION = '0.1';
32              
33             my $attrs = { _dir => undef };
34             ### install get/set accessors for this object.
35             for my $key ( keys %$attrs ) {
36 1     1   6 no strict 'refs';
  1         2  
  1         1628  
37             *{ __PACKAGE__ . "::$key" } = sub {
38 16     16   31 my $self = shift;
39 16 100       66 $self->{$key} = $_[0] if @_;
40 16         127 return $self->{$key};
41             }
42             }
43              
44             sub new {
45 2     2 0 1769 my $class = shift;
46 2         6 my $obj;
47 2 50       9 if ( ref $class ) {
48 0         0 $obj = $class;
49 0         0 $class = ref $obj;
50             }
51 2         8 my $self = bless( {}, $class );
52 2 50       8 if (@_) {
53 2         5 my $dir = shift;
54 2 50       7 if ($obj) {
55 0         0 $dir =~ s%^/%%;
56 0         0 $dir = $obj->_dir . $dir;
57             }
58 2 50       18 $dir .= "/" unless $dir =~ m%/$%;
59 2         11 $self->_dir($dir);
60             }
61             else {
62 0         0 carp "need path to dir";
63 0         0 return;
64             }
65 2         18 return $self;
66             }
67              
68             sub _store_data {
69 3     3   10 my ( $self, $mode, $name, $val ) = @_;
70 3 50       12 return unless defined $val;
71 3         16 my $file_name = $self->_get_path . $name;
72 3 50       37 my $out = new IO::File:: "> $file_name" or die $!;
73 3         558 local $/;
74 3         37 $/ = undef;
75 3         8 my ($atime, $mtime);
76 3 100       12 if ( ref $val ) {
77 1 50 33     18 if ( UNIVERSAL::isa( $val, 'IO::Handle' )
      33        
78             or ( ref $val eq 'GLOB' )
79             or UNIVERSAL::isa( $val, 'Tie::Handle' ) )
80             {
81 1         31 $out->print(<$val>);
82             #set atime and mtime
83 1         29 ($atime, $mtime) = (stat $val )[8,9];
84 1         7 $val->close;
85             }
86             else {
87 0 0       0 $out->print(
88             ( $mode =~ /utf8/ ) ? $self->_utfx2utf($$val) : $$val );
89             }
90             }
91             else {
92 2 50       22 $out->print( ( $mode =~ /utf8/ ) ? $self->_utfx2utf($val) : $val );
93             }
94 3 50       65 $out->close or die $!;
95 3 100 66     244 if ( $atime && $mtime) {
96 1         53 utime $atime, $mtime, $file_name;
97             }
98              
99             }
100              
101             sub _utfx2utf {
102 2     2   7 my ( $self, $str ) = @_;
103 2 50       11 $str = encode( 'utf8', $str ) if utf8::is_utf8($str);
104 2         18 return $str;
105             }
106              
107             sub _utf2utfx {
108 1     1   3 my ( $self, $str ) = @_;
109 1 50       12 $str = decode( 'utf8', $str ) unless utf8::is_utf8($str);
110 1         90 return $str;
111             }
112              
113             sub _get_path {
114 3     3   6 my $self = shift;
115 3         5 my $key = shift;
116 3         7 my $dir = $self->_dir;
117 3 100       393 mkpath( $dir, 0 ) unless -e $dir;
118 3         16 return $dir;
119             }
120              
121             sub putText {
122 3     3 0 8 my $self = shift;
123 3         16 return $self->_store_data( ">:utf8", @_ );
124             }
125              
126             sub putRaw {
127 0     0 0 0 my $self = shift;
128 0         0 return $self->_store_data( ">", @_ );
129             }
130              
131             sub getRaw_fh {
132 2     2 0 4 my $self = shift;
133 2         4 my $key = shift;
134 2 50       10 my $fh = new IO::File:: "< " . $self->_dir . $key or return;
135 2         288 return $fh;
136             }
137              
138             sub getRaw {
139 1     1 0 2 my $self = shift;
140 1 50       6 if ( my $fd = $self->getRaw_fh(@_) ) {
141 1         2 my $data;
142             {
143 1         2 local $/;
  1         7  
144 1         4 undef $/;
145 1         27 $data = <$fd>;
146             }
147 1         8 $fd->close;
148 1         27 return $data;
149             }
150 0         0 else { return }
151             }
152              
153             sub getText {
154 1     1 0 4 my $self = shift;
155 1         5 return $self->_utf2utfx( $self->getRaw(@_) );
156             }
157              
158             sub getText_fh {
159 1     1 0 4 my $self = shift;
160 1         5 return $self->getRaw_fh(@_);
161             }
162              
163             sub get_path_to_key {
164 0     0 0 0 my $self = shift;
165 0         0 my $key = shift;
166 0         0 my $dir = $self->_dir;
167 0         0 return $dir . $key;
168             }
169              
170             sub get_keys {
171 5     5 0 15 my $self = shift;
172 5         16 my $dir = $self->_dir;
173 5 50       136 return [] unless -e $dir;
174 5 50       184 opendir DIR, $dir or die $!;
175 5         17 my @keys = ();
176 5         157 while ( my $key = readdir DIR ) {
177 15 100 100     242 next if $key =~ /^\.\.?$/ or -d "$dir/$key";
178 3         21 push @keys, $key;
179             }
180 5         49 return \@keys;
181             }
182              
183             =head3 delete_keys [,[,]]
184              
185             Delete files from dir
186              
187             =cut
188             sub delete_keys {
189 1     1 1 2 my $self = shift;
190 1         5 my $dir = $self->_dir;
191 1         128 unlink "$dir/$_" for (@_)
192             }
193              
194             sub clean {
195 2     2 0 7 my $self = shift;
196 2         8 my $dir = $self->_dir;
197 2         1445 rmtree( $dir, 0 );
198             }
199             1;
200             __END__