NAME
File::Transaction - transactional change to a set of files
SYNOPSIS
#
# In this example, we wish to replace the word 'foo' with the
# word 'bar' in several files, and we wish to minimize the risk
# of ending up with the replacement done in some files but not
# in others.
#
use File::Transaction;
my $ft = File::Transaction->new;
eval {
foreach my $file (@list_of_file_names) {
$ft->linewise_rewrite($file, sub {
s#\bfoo\b#bar#g;
});
}
};
if ($@) {
$ft->revert;
die "update aborted: $@";
}
else {
$ft->commit;
}
DESCRIPTION
A "File::Transaction" object encapsulates a change to a set of files,
performed by writing out a new version of each file first and then
swapping all of the new versions in. The set of files can only end up in
an inconsistent state if a "rename" system call fails or if the Perl
process is interrupted during the commit().
Files will be committed in the order in which they are added to the
transaction. This order should be chosen with care to limit the damage
to your data if the commit() fails part way through. If there is no
order that renders a partial commit acceptable then consider using
File::Transaction::Atomic instead.
CONSTRUCTORS
new ( [TMPEXT] )
Creates a new empty "File::Transaction" object.
The TMPEXT parameter gives the string to append to a filename to
make a temporary filename for the new version. The default is
".tmp".
METHODS
linewise_rewrite ( OLDFILE, CALLBACK )
Writes out a new version of the file OLDFILE and adds it to the
transaction, invoking the coderef CALLBACK once for each line of the
file, with the line in $_. The name of the new file is generated by
appending the TMPEXT passed to new() to OLDFILE, and this file is
overwritten if it already exists.
The callback must not invoke the commit() or revert() methods of the
"File::Transaction" object that calls it.
This method calls die() on error, without first reverting any other
files in the transaction.
addfile ( OLDFILE, TMPFILE )
Adds an update to a single file to the transaction. OLDFILE is the
name of the old version of the file, and TMPFILE is the name of the
temporary file to which the new version has been written.
OLDFILE will be replaced with TMPFILE on commit(), and TMPFILE will
be unlinked on revert(). OLDFILE need not exist.
revert ()
Deletes any new versions of files that have been created with the
addfile() method so far. Dies on error.
commit ()
Swaps all new versions that have been created so far into place.
Dies on error.
BUGS
* If a rename fails or the Perl process is interrupted in the commit()
method then some files will be updated but others will not. See
File::Transaction::Atomic if that's a problem for you.
SEE ALSO
File::Transaction::Atomic
AUTHOR
Nick Cleaton <nick@cleaton.net>
COPYRIGHT
Copyright (C) 2002 Nick Cleaton. All Rights Reserved.
This module is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.