Fix Bacula restore browsing with Bacula 11+ catalogs #1520

This commit is contained in:
Ilia Ross
2026-05-22 01:16:39 +02:00
parent cc02cbabb4
commit 685c07ffbb
2 changed files with 32 additions and 10 deletions

View File

@@ -58,6 +58,23 @@ $testcmd->finish();
return $dbh;
}
# bacula_catalog_table_exists(&dbh, table)
# Returns 1 if the Bacula catalog contains a table, 0 if not
sub bacula_catalog_table_exists
{
local ($dbh, $table) = @_;
$table =~ /^\w+\z/ || die "Illegal catalog table name";
local $dbh->{'PrintError'} = 0;
local $dbh->{'RaiseError'} = 0;
my $cmd = eval { $dbh->prepare("SELECT 1 FROM $table WHERE 1 = 0") };
my $ok;
if ($cmd) {
$ok = eval { $cmd->execute() };
$cmd->finish();
}
return $ok ? 1 : 0;
}
# read_config_file(file)
# Parses a bacula config file
sub read_config_file
@@ -1678,4 +1695,3 @@ return ( \%tags, $run );
}
1;

View File

@@ -78,6 +78,12 @@ $cmd->finish();
@rv = &unique(@rv);
my $filename_table = &bacula_catalog_table_exists($dbh, "Filename");
my $filename_col = $filename_table ? "Filename.Name" : "File.Filename";
my $filename_from = $filename_table ? ", Filename" : "";
my $filename_join = $filename_table ?
"AND File.FilenameId = Filename.FilenameId" : "";
# Build the nodes structure for folders
foreach $f (@rv) {
$f =~ /([^\/]+)\/\Z/;
@@ -92,16 +98,16 @@ foreach $f (@rv) {
if ($in{'volume'}) {
# Files in directory, that are on this volume
$cmd = $dbh->prepare("
SELECT Filename.Name
FROM File, Filename, Job, JobMedia, Media
WHERE File.FilenameId = Filename.FilenameId
AND File.JobId = Job.JobId
SELECT $filename_col
FROM File$filename_from, Job, JobMedia, Media
WHERE File.JobId = Job.JobId
AND Job.JobId = JobMedia.JobId
AND JobMedia.MediaId = Media.MediaId
AND File.PathId = ?
AND Media.VolumeName = ?
$filename_join
$jobsql
ORDER BY Filename.Name
ORDER BY $filename_col
");
$cmd->execute($pid, $in{'volume'}) || die "db error: ".$dbh->errstr;
@@ -109,13 +115,13 @@ if ($in{'volume'}) {
else {
# Files in directory
$cmd = $dbh->prepare("
SELECT Filename.Name
FROM Job, File, Filename
SELECT $filename_col
FROM Job, File$filename_from
WHERE Job.JobId = File.JobId
AND File.FilenameId = Filename.FilenameId
AND File.PathId = ?
$filename_join
$jobsql
ORDER BY Filename.Name
ORDER BY $filename_col
");
$cmd->execute($pid) || die "db error: ".$dbh->errstr;