From: Eric Bollengier Date: Tue, 20 Sep 2022 08:39:38 +0000 (+0200) Subject: Enhance .bvfs_ls_files() to support VirtualFull X-Git-Tag: Beta-15.0.0~442 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d961d98fbcffc2ed282c74531e5ad7b56af39e1a;p=thirdparty%2Fbacula.git Enhance .bvfs_ls_files() to support VirtualFull In one Job, a single file can have multiple instances with delta_seq != 0. We modify the queries to find the higest DeltaSeq for a file and return the correct FileId. --- diff --git a/bacula/src/cats/sql_cmds.c b/bacula/src/cats/sql_cmds.c index 9614e9da5..934de3bd3 100644 --- a/bacula/src/cats/sql_cmds.c +++ b/bacula/src/cats/sql_cmds.c @@ -763,13 +763,13 @@ static const char *sql_bvfs_list_files_default = "SELECT 'F', T.PathId, T.Filename, " "File.JobId, File.LStat, File.FileId " "FROM Job, File, ( " - "SELECT MAX(JobTDate) AS JobTDate, PathId, Filename " + "SELECT MAX(JobTDate) AS JobTDate, MAX(DeltaSeq), PathId, Filename " "FROM ( " - "SELECT JobTDate, PathId, Filename " + "SELECT JobTDate, PathId, Filename, DeltaSeq " "FROM File JOIN Job USING (JobId) " "WHERE File.JobId IN (%s) AND PathId = %s " "UNION ALL " - "SELECT JobTDate, PathId, Filename " + "SELECT JobTDate, PathId, Filename, DeltaSeq " "FROM BaseFiles " "JOIN File USING (FileId) " "JOIN Job ON (BaseJobId = Job.JobId) " @@ -777,6 +777,7 @@ static const char *sql_bvfs_list_files_default = ") AS tmp GROUP BY PathId, Filename " ") AS T " "WHERE T.JobTDate = Job.JobTDate " + "AND T.DeltaSeq = File.DeltaSeq " "AND Job.JobId = File.JobId " "AND T.PathId = File.PathId " "AND T.Filename = File.Filename " @@ -798,17 +799,17 @@ const char *sql_bvfs_list_files[] = { "SELECT DISTINCT ON (Filename) 'F' as Type, PathId, FileId, " "T.Filename, JobId, LStat, FileIndex " "FROM " - "(SELECT FileId, JobId, PathId, Filename, FileIndex, LStat, MD5 " + "(SELECT FileId, JobId, PathId, Filename, FileIndex, LStat, MD5, DeltaSeq " "FROM File WHERE JobId IN (%s) AND PathId = %s " "UNION ALL " "SELECT File.FileId, File.JobId, PathId, Filename, " - "File.FileIndex, LStat, MD5 " + "File.FileIndex, LStat, MD5, DeltaSeq " "FROM BaseFiles JOIN File USING (FileId) " "WHERE BaseFiles.JobId IN (%s) AND File.PathId = %s " ") AS T JOIN Job USING (JobId) " " WHERE T.Filename != '' " " %s " /* AND Filename LIKE '' */ - "ORDER BY Filename, StartTime DESC " + "ORDER BY Filename, DeltaSeq DESC, StartTime DESC " ") AS A WHERE A.FileIndex > 0 " "LIMIT %lld OFFSET %lld ",