App-PhotoDB
view release on metacpan or search on metacpan
lib/App/PhotoDB/funcs.pm view on Meta::CPAN
use Exporter qw(import);
use Config::IniHash;
use YAML;
use Image::ExifTool;
use Term::ReadLine;
use Term::ReadLine::Perl;
use File::Basename;
use Time::Piece;
use Text::TabularDisplay;
our @EXPORT_OK = qw(prompt db updaterecord deleterecord newrecord notimplemented nocommand nosubcommand listchoices lookupval lookuplist today validate ini printlist round pad lookupcol thin resolvenegid chooseneg annotatefilm keyword parselensmodel ...
=head2 prompt
Prompt the user for an arbitrary value. Has various options for data validation and customisation of the prompt.
If the provided input fails validation, or if a blank string is given when required=1 then the prompt is repeated.
=head4 Usage
my $camera = &prompt({prompt=>'What model is the camera?', required=>1, default=>$$defaults{model}, type=>'text'});
lib/App/PhotoDB/funcs.pm view on Meta::CPAN
=head4 Returns
Nothing
=cut
sub writeconfig {
my $inifile = shift;
# Untaint
unless ($inifile =~ m#^([\w.-\/]+)$#) {
die "filename '$inifile' has invalid characters.\n";
}
$inifile = $1;
# Check for existence of config dir
my $dir = dirname($inifile);
if (!-d $dir) {
# Create it if necessary
mkdir $dir or die "Can't create config directory $dir";
lib/App/PhotoDB/funcs.pm view on Meta::CPAN
my $connect = ReadINI(&ini);
if (!defined($$connect{'filesystem'}{'basepath'})) {
die "Config file did not contain basepath";
}
my $basepath = $$connect{'filesystem'}{'basepath'};
# Strip off trailing slash
$basepath =~ s/\/$//;
return $basepath;
}
# Untaint input
=head2 untaint
Untaint a tainted value
=head4 Usage
my $untainted = &untaint($tainted);
=head4 Arguments
=item * C<$tainted> Tainted value to untaint
=head4 Returns
Returns the untained string
=cut
sub untaint {
my $input = shift;
$input =~ m/^(.*)$/;
my $output = $1;
return $output;
}
=head2 fsfiles
List all scan files on the filesystem
lib/App/PhotoDB/handlers.pm view on Meta::CPAN
# Test for non-null subdir
if ($subdir =~ m/.+/) {
my $basepath = &basepath;
my $correctpath = "$basepath/$subdir/$filename";
# Test to make sure it's in a valid directory
if ($fsonlyfile ne $correctpath) {
if (&prompt({prompt=>"Move scan $fsonlyfile to its correct path $correctpath?", type=>'boolean', default=>'yes'})) {
# Rename it to the correct dir and continue using the new path
rename(&untaint($fsonlyfile), &untaint($correctpath));
$fsonlyfile = $correctpath;
}
}
}
if (!$neg_id || $neg_id !~ /\d+/) {
print "Could not determine negative ID for negative $film_id/$frame, skipping\n";
next;
}
&newrecord({db=>$db, data=>{negative_id=>$neg_id, filename=>$filename}, table=>'SCAN', silent=>$auto});
lib/App/PhotoDB/handlers.pm view on Meta::CPAN
} else {
# For negatives
$newname = "$ref->{film_id}-$ref->{frame}-$safedesc.jpg";
}
# Check if a change is needed
if ($ref->{'filename'} ne $newname) {
print "\t$ref->{'filename'} => $newname\n";
# Move file on fs
rename(&untaint("$basepath/$ref->{'directory'}/$ref->{'filename'}"), &untaint("$basepath/$ref->{'directory'}/$newname"));
# Update scan in db
&updaterecord({db=>$db, data=>{filename=>$newname}, table=>'SCAN', where=>{scan_id=>$ref->{scan_id}}, silent=>1});
}
}
}
}
return $rows;
}
( run in 0.429 second using v1.01-cache-2.11-cpan-4e96b696675 )