DiaColloDB
view release on metacpan or search on metacpan
DiaColloDB/Upgrade/Base.pm view on Meta::CPAN
##-- remove backup directory
$up->trace("revert(): removing backup directory $backd");
remove_tree($backd)
or $up->logconfess("revert(): failed to remove backup directory $backd: $!");
return 1;
}
## @files = $up->revert_created()
## + returns list of files created by this upgrade, for use with default revert() implementation
sub revert_created {
$_[0]->logconfess("revert_created() method not implemented");
}
## @files = $up->revert_updated()
## + returns list of files updated by this upgrade, for use with default revert() implementation
sub revert_updated {
$_[0]->logconfess("revert_updated() method not implemented");
}
##==============================================================================
## Utilities
## \%hdr = $CLASS_OR_OBJECT->dbheader($dbdir?)
## + reads $dbdir/header.json
## + default uses cached $CLASS_OR_OBJECT->{hdr} if available
sub dbheader {
my ($up,$dbdir) = @_;
$dbdir //= $up->{dbdir} if (ref($up));
return $up->{hdr}
if (ref($up) && defined($up->{hdr}) && ($up->{dbdir}//'') eq $dbdir);
my $hdr = DiaColloDB::Utils::loadJsonFile("$dbdir/header.json")
or $up->logconfess("dbheader(): failed to read header $dbdir/header.json: $!");
return $hdr;
}
## \%uinfo = $up->uinfo($dbdir?,%info)
## + returns a default upgrade-info structure for %info
## + conventional keys %uinfo =
## (
## version_from => $vfrom, ##-- source version (default='unknown')
## version_to => $vto, ##-- target version (default=$CLASS_OR_OBJECT->_toversion)
## timestamp => $time, ##-- timestamp (default=$up->{timestamp} || DiaColloDB::Utils::timestamp(time))
## by => $who, ##-- user or script-name (default=$CLASS)
## )
sub uinfo {
my $up = shift;
my $dbdir = ((scalar(@_)%2)==0 ? undef : shift) // $up->{hdr};
my $header = $up->{hdr} // ($dbdir ? $up->dbheader($dbdir) : {});
return {
version_from=>($header->{version} // 'unknown'),
version_to=>$up->toversion,
timestamp=>($up->{timestamp} || DiaColloDB::Utils::timestamp(time)),
by=>$up->label,
@_
};
}
## $bool = $up->updateHeader(\%extra_uinfo, \%extra_header_data)
## + updates header $dbdir/header.json, creating backup if requested
sub updateHeader {
my ($up,$xinfo,$xhdr) = @_;
my $dbdir = $up->{dbdir};
##-- backup old header if requested
!$up->{backup}
or DiaColloDB::Utils::copyto_a("$dbdir/header.json", $up->backupdir)
or $up->logconfess("updateHeader(): failed to backup header to ".$up->backupdir.": $!");
##-- get upgrade info
my $uinfo = $up->uinfo($dbdir, %{$xinfo//{}});
return if (!defined($uinfo)); ##-- silent upgrade
my $header = $up->dbheader($dbdir);
my $upgraded = ($header->{upgraded} //= []);
unshift(@$upgraded, $uinfo);
$header->{version} = $uinfo->{version_to} if ($uinfo->{version_to});
@$header{keys %$xhdr} = values %$xhdr if ($xhdr);
DiaColloDB::Utils::saveJsonFile($header, "$dbdir/header.json")
or $up->logconfess("updateHeader(): failed to save header data to $dbdir/header.json: $!");
return $up;
}
##==============================================================================
## Footer
1; ##-- be happy
( run in 0.943 second using v1.01-cache-2.11-cpan-39bf76dae61 )