"John W. Krahn" wrote:
> 
> Jeff wrote:
> >
> > From: John W. Krahn [mailto:[EMAIL PROTECTED]]
> > >
> > > Jeff wrote:
> > > >
> > > > I'm use flat files to manage a list containing approx 25,000 records.  For
> > > > updates, I write to a temp file then unlink main and rename temp file to
> > > > main.  I use flock for both temp and main files during update.  My main file
> > > > gets blown away on occasions.  What gives?  I can't figure out why this
> > > > happens.  Thanks for any help!
> > >
> > > OS?  code?
> >
> > unix,
> >
> > sub Update_db {
> >   $main_db = $_[0];
> >   $tmp_db = $_[1];
> >   $update = $_[2];
> >   open IN, "<$main_db" or print "Can't open $main_db: $!\n";
> >   flock( IN, LOCK_EX ) or print "Unable to acquire lock: $!. Aborting";
> >   open OUT, ">$tmp_db" or print "Can't open temporary file $tmp_db: $!\n";
> >   flock( OUT, LOCK_EX ) or print "Unable to acquire lock: $!. Aborting";
> >   while ( <IN> ) {
> >     ($name, $team, $location)= split(/\|/, $_);
> >     next unless $name eq $update;
> >     $new_location = "palm_bay";
> >     $_ = join( "|", $name, $team, $new_location);
> >   }
> >   continue {
> >     print OUT $_ or print "Error writing $tmp_db: $!\n";
> >   }
> >   close IN;
> >   close OUT;
> >   unlink $main_db;
> >   rename $tmp_db, $main_db or print "Can't rename '$tmp_db' to '$main_db':
> > $!\n";
> > }
> 
> The main problem appears to be that instead of taking a different branch
> if open() or flock() fails you continue on as if they had succeeded.
> 
> sub Update_db {
>     my ( $main_db, $tmp_db, $update ) = @_;
>     local ( *IN, *OUT );
> 
>     unless ( open IN, "<$main_db" ) {
>         print STDERR "Can't open $main_db: $!";
>         return;
>         }
>     unless ( flock IN, LOCK_EX ) {
>         print STDERR "Unable to acquire lock: $!. Aborting";
>         return;
>         }
>     unless ( open OUT, ">$tmp_db" ) {
>         print STDERR "Can't open temporary file $tmp_db: $!";
>         return;
>         }
>     unless ( flock OUT, LOCK_EX ) {
>         print STDERR "Unable to acquire lock: $!. Aborting";
>         return;
>         }
> 
>     while ( <IN> ) {
>         my ( $name, $team, $location ) = split /\|/;
>         next unless $name eq $update;
> #************************************************
> # Why are you assigning a literal string to this variable here????
>         $new_location = "palm_bay";
> #************************************************
>         unless ( print OUT join '|', $name, $team, $new_location ) {
>             print STDERR "Error writing $tmp_db: $!\n";
>             return;
>             }
>         }

# sorry, forgot the close

    close OUT;
    close IN;

>     unless ( unlink $main_db ) {
>         print STDERR "Unable to unlink $main_db: $!. Aborting";
>         return;
>         }
>     rename $tmp_db, $main_db or print STDERR "Can't rename '$tmp_db' to '$main_db': 
>$!";
>     }



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to