AC-Yenta
view release on metacpan or search on metacpan
lib/AC/Yenta/Store/File.pm view on Meta::CPAN
# Copyright (c) 2009 AdCopy
# Author: Jeff Weisberg
# Created: 2009-Mar-31 16:04 (EDT)
# Function: store file data
#
# $Id$
package AC::Yenta::Store::File;
use AC::Yenta::Debug 'store_file';
use File::Path;
use strict;
sub new {
my $class = shift;
my $name = shift;
my $conf = shift;
return bless {
name => $name,
conf => $conf,
}, $class;
}
sub get {
my $me = shift;
my $name = shift;
my $cf = $me->{conf};
my $base = $cf->{basedir};
return unless $base;
my $filename = "$base/$name";
my $f;
unless( open($f, $filename) ){
problem("cannot open file '$filename': $!");
return;
}
local $/ = undef;
my $content = <$f>;
return \$content;
}
sub put {
my $me = shift;
my $name = shift;
my $cont = shift; # reference
# validate filename
return if $name =~ m%(^\.\./)|(/\.\./)%;
my $cf = $me->{conf};
my $base = $cf->{basedir};
return 1 unless $base;
# split name into dir / file
my($dir, $file) = $name =~ m|(.*)/([^/]+)$|;
# create directory
debug("mkpath: $base/$dir");
my $mask = umask 0;
eval { mkpath("$base/$dir", undef, 0777); };
umask $mask;
# save file
my $f;
unless( open($f, "> $base/$name.tmp") ){
problem("cannot save file '$base/$name.tmp': $!");
return;
}
debug("saving file '$base/$name'");
print $f $$cont;
close $f;
rename "$base/$name.tmp", "$base/$name";
return 1;
}
1;
( run in 0.748 second using v1.01-cache-2.11-cpan-39bf76dae61 )