Loop in this perl script is not working
Hi
I have this script that is not working as it should be. this is what it is supposed to be doing, take images from a directory (images are coming from camera) and renames them with the date and time of image. then insert some meta information into MySQL. what the script is supposed to be doing is to always keep looking and whenever it finds images to perform the change and insert. the output is as follow: it only does the process once.
i would appreciate any help.
cheers,
Mel
-----------
renaming /home/httpd/htdocs/image.jpg to /home/me/images/2003_03_24_18_14_12.jpg
adding /home/me/images/2003_03_24_18_14_12.jpg to database
[root@cctv cgi-bin]# size is 196378
modified is 20030324181412
filename is 2003_03_24_18_14_12.jpg
Use of uninitialized value in concatenation (.) or string at renamerr.pl line 99
.
Failed to get the info
$file is: at renamerr.pl line 99.
-----------------
The script is as follow:
----------------
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use Date::Manip;
=head1 NAME # renamer - renames files received by ftp, moving them to a new directory
=head1 SYNOPSIS
nohup ./renamer image /home/httpd/htdocs /home/me/images jpg renamer.process &
=head1 DESCRIPTION
#The above instructs renamer to look for files called image.jpg in /home/httpd/htdocs.It checks once per minute for such a file to appear. If it sees a
#readable file called /home/httpd/htdocs.jpg it moves it to/home/httpd/htdocs/image.200302251530.jpg where the number is a
#time stamp with year (four digits), month, day of the month, hour (in24 mode), and minute.
#Read the bugs section closely.
=head1 BUGS
#The original and new directories must be on the same file system.The program probably does not work on windows systems.
#The daemon behavior is weak.Not much testing has been done, so the script may have other problems.
=cut
my $usage = <<EOUSAGE;
usage: $0 initial_name original_dir new_dir suffix lockfile
example: $0 pic /home/httpd/htdocs /home/me/images jpg /home/me/renamer.process
EOUSAGE
my $check_file = shift or die $usage;
my $original_dir = shift or die $usage;
my $new_dir = shift or die $usage;
my $suffix = shift or die $usage;
my $lockfile = shift or die $usage;
##################################
# If you put it into the cron, comment out between the START and END BLOCK, and uncomment the section below it so you don't get multiple copies running. Also, comment out the
# lockfile bits above.
#START BLOCK
exit if (fork());
while (-e "$lockfile") {
process($check_file) if (-r "$original_dir/$check_file.$suffix");
infoinsert();
sleep 30;
}
#END BLOCK
##################################
#
# process($check_file) if (-r "$original_dir/$check_file.$suffix");
#
##################################
sub process {
my $file = shift;
my @st = (stat("$original_dir/$file.$suffix"));
my ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime($st[10]);
$Year += 1900;
$Month++;
my $stamp = sprintf "%4d_%02d_%02d_%02d_%02d_%02d", $Year, $Month, $Day, $Hour, $Minute, $Second;
print "renaming $original_dir/$file.$suffix to $new_dir/$stamp.$suffix\n";
rename "$original_dir/$file.$suffix", "$new_dir/$stamp.$suffix" or warn "couldn't rename file: $! $file to $new_dir/$file.$stamp.$suffix\n";
print "adding $new_dir/$stamp.$suffix to database\n";
my $single_string = $new_dir . '/' . $stamp . '.' . $suffix;
infoinsert ($single_string);
}
############################################################################
#
# Connect to Database Named cctvimages on the localhost with the root user
# $dbh=DBI->connect(DBI:mysql;$database", $user, $password);
# and insert info about the file given as the argument $_[0];
############################################################################
#
sub infoinsert
{
my ($file) = @_;
die"Failed to get the info\n\$file is: $file" if not defined $file;
my $dbh = DBI->connect("DBI:mysql:dbname=cctvimages;host=localhost","root",
"**********", {'RaiseError' => 1});
my $size;
my $mtime;
my $secs;
($size, $secs) = (stat ($file))[7,9];
$mtime = &ParseDateString("epoch $secs");
# even after conversion ':' is used to seperate hh and mn and ss
$mtime =~ s/://g;
# the above swaps out the ':' for nothing
$file =~ s/\/home\/me\/images\///;
# the above strips path
print"size is $size\nmodified is $mtime\nfilename is $file\n";
my $rows_affected = $dbh->do("INSERT INTO imageinfo VALUES(null, '$file',
'$size', '$mtime')")
or die "Do Fails: $DBI::errstr\n";
my $sql = "SELECT * FROM imageinfo";
my $sth = $dbh->prepare($sql);
$sth->execute or die"Execute fails: $DBI::errstr\n";
$sth->finish;
$dbh->disconnect;
}
|