]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Enhance .bvfs_ls_files() to support VirtualFull
authorEric Bollengier <eric@baculasystems.com>
Tue, 20 Sep 2022 08:39:38 +0000 (10:39 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 14 Sep 2023 11:56:59 +0000 (13:56 +0200)
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.

bacula/src/cats/sql_cmds.c

index 9614e9da56a72ca48eb7afab7c2c32372d039cb7..934de3bd3eb73dfd86acd2dfddb1837d402f80e8 100644 (file)
@@ -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 ",