]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/sql_cmds.c
Tweak mutex order for SD
[bacula/bacula] / bacula / src / cats / sql_cmds.c
index b4efefa061577e02d06f99fd953cc39088b5934a..9dd7a2bdac3a07259f2db8aad7200a5661a1a393 100644 (file)
@@ -316,7 +316,7 @@ const char *uar_last_full =
    "INSERT INTO temp1 SELECT Job.JobId,JobTdate "
    "FROM Client,Job,JobMedia,Media,FileSet WHERE Client.ClientId=%s "
    "AND Job.ClientId=%s "
-   "AND Job.StartTime<'%s' "
+   "AND Job.StartTime < '%s' "
    "AND Level='F' AND JobStatus IN ('T','W') AND Type='B' "
    "AND JobMedia.JobId=Job.JobId "
    "AND Media.Enabled=1 "
@@ -450,22 +450,43 @@ const char *uar_jobid_fileindex_from_table =
 #include "bacula.h"
 #include "cats.h"
 
-/* Get the list of the last recent version with a given jobid list */
+/* Get the list of the last recent version with a given jobid list 
+ * This is a tricky part because with SQL the result of 
+ *
+ * SELECT MAX(A), B, C, D FROM... GROUP BY (B,C)
+ *
+ * doesn't give the good result (for D).
+ *
+ * With PostgreSQL, we can use DISTINCT ON(), but with Mysql or Sqlite,
+ * we need an extra join using JobTDate. 
+ */
 const char *select_recent_version_with_basejob[4] = {
  /* MySQL */
- "SELECT max(FileId), JobId, FileIndex, PathId, FilenameId, LStat, MD5 "
-   "FROM "
-       "(SELECT FileId, JobId, PathId, FilenameId, FileIndex, LStat, MD5 "
-          "FROM File WHERE JobId IN (%s) "
-         "UNION ALL "
-        "SELECT File.FileId, File.JobId, PathId, FilenameId, "
-               "File.FileIndex, LStat, MD5 "
-          "FROM BaseFiles JOIN File USING (FileId) "
-         "WHERE BaseFiles.JobId IN (%s) "
-        ") AS T "
-  "GROUP BY PathId, FilenameId ",
-
- /* Postgresql */
+"SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, "
+       "File.FilenameId AS FilenameId, LStat, MD5 "
+"FROM Job, File, ( "
+    "SELECT MAX(JobTDate) AS JobTDate, PathId, FilenameId "
+      "FROM ( "
+        "SELECT JobTDate, PathId, FilenameId "   /* Get all normal files */
+          "FROM File JOIN Job USING (JobId) "    /* from selected backup */
+         "WHERE File.JobId IN (%s) "
+          "UNION ALL "
+        "SELECT JobTDate, PathId, FilenameId "   /* Get all files from */ 
+          "FROM BaseFiles "                      /* BaseJob */
+               "JOIN File USING (FileId) "
+               "JOIN Job  ON    (BaseJobId = Job.JobId) "
+         "WHERE BaseFiles.JobId IN (%s) "        /* Use Max(JobTDate) to find */
+       ") AS tmp GROUP BY PathId, FilenameId "   /* the latest file version */
+    ") AS T1 "
+"WHERE (Job.JobId IN ( "  /* Security, we force JobId to be valid */
+        "SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s)) "
+        "OR Job.JobId IN (%s)) "
+  "AND T1.JobTDate = Job.JobTDate " /* Join on JobTDate to get the orginal */
+  "AND Job.JobId = File.JobId "     /* Job/File record */
+  "AND T1.PathId = File.PathId "
+  "AND T1.FilenameId = File.FilenameId",
+
+  /* Postgresql */    /* The DISTINCT ON () permits to avoid extra join */
  "SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
          "FileIndex, PathId, FilenameId, LStat, MD5 "
    "FROM "
@@ -479,42 +500,67 @@ const char *select_recent_version_with_basejob[4] = {
         ") AS T JOIN Job USING (JobId) "
    "ORDER BY FilenameId, PathId, StartTime DESC ",
 
- /* SQLite */
- "SELECT max(FileId), JobId, FileIndex, PathId, FilenameId, LStat, MD5 "
-   "FROM "
-       "(SELECT FileId, JobId, PathId, FilenameId, FileIndex, LStat, MD5 "
-          "FROM File WHERE JobId IN (%s) "
-         "UNION ALL "
-        "SELECT File.FileId, File.JobId, PathId, FilenameId, "
-               "File.FileIndex, LStat, MD5 "
-          "FROM BaseFiles JOIN File USING (FileId) "
+  /* SQLite */              /* See Mysql section for doc */
+"SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, "
+       "File.FilenameId AS FilenameId, LStat, MD5 "
+"FROM Job, File, ( "
+    "SELECT MAX(JobTDate) AS JobTDate, PathId, FilenameId "
+      "FROM ( "
+        "SELECT JobTDate, PathId, FilenameId "
+          "FROM File JOIN Job USING (JobId) "
+         "WHERE File.JobId IN (%s) "
+          "UNION ALL "
+        "SELECT JobTDate, PathId, FilenameId "
+          "FROM BaseFiles "
+               "JOIN File USING (FileId) "
+               "JOIN Job  ON    (BaseJobId = Job.JobId) "
          "WHERE BaseFiles.JobId IN (%s) "
-        ") AS T "
-  "GROUP BY PathId, FilenameId ",
-
- /* SQLite3 */
- "SELECT max(FileId), JobId, FileIndex, PathId, FilenameId, LStat, MD5 "
-   "FROM "
-       "(SELECT FileId, JobId, PathId, FilenameId, FileIndex, LStat, MD5 "
-          "FROM File WHERE JobId IN (%s) "
-         "UNION ALL "
-        "SELECT File.FileId, File.JobId, PathId, FilenameId, "
-               "File.FileIndex, LStat, MD5 "
-          "FROM BaseFiles JOIN File USING (FileId) "
+       ") AS tmp GROUP BY PathId, FilenameId "
+    ") AS T1 "
+"WHERE (Job.JobId IN ( "
+       "SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s)) "
+       "OR Job.JobId IN (%s)) "
+  "AND T1.JobTDate = Job.JobTDate "
+  "AND Job.JobId = File.JobId "
+  "AND T1.PathId = File.PathId "
+  "AND T1.FilenameId = File.FilenameId",
+
+ /* SQLite3 */              /* See Mysql section for doc */
+"SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, "
+       "File.FilenameId AS FilenameId, LStat, MD5 "
+"FROM Job, File, ( "
+    "SELECT MAX(JobTDate) AS JobTDate, PathId, FilenameId "
+      "FROM ( "
+        "SELECT JobTDate, PathId, FilenameId "
+          "FROM File JOIN Job USING (JobId) "
+         "WHERE File.JobId IN (%s) "
+          "UNION ALL "
+        "SELECT JobTDate, PathId, FilenameId "
+          "FROM BaseFiles "
+               "JOIN File USING (FileId) "
+               "JOIN Job  ON    (BaseJobId = Job.JobId) "
          "WHERE BaseFiles.JobId IN (%s) "
-        ") AS T "
-  "GROUP BY PathId, FilenameId "
+       ") AS tmp GROUP BY PathId, FilenameId "
+    ") AS T1 "
+"WHERE (Job.JobId IN ( "
+         "SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s)) "
+        "OR Job.JobId IN (%s)) "
+  "AND T1.JobTDate = Job.JobTDate "
+  "AND Job.JobId = File.JobId "
+  "AND T1.PathId = File.PathId "
+  "AND T1.FilenameId = File.FilenameId"
 };
 
 /* Get the list of the last recent version with a given BaseJob jobid list */
 const char *select_recent_version[4] = {
    /* MySQL */
    "SELECT j1.JobId AS JobId, f1.FileId AS FileId, f1.FileIndex AS FileIndex, "
-          "f1.PathId AS PathId, f1.FilenameId AS FilenameId, f1.LStat AS LStat "
+          "f1.PathId AS PathId, f1.FilenameId AS FilenameId, "
+          "f1.LStat AS LStat, f1.MD5 AS MD5 "
      "FROM ( "     /* Choose the last version for each Path/Filename */
        "SELECT max(JobTDate) AS JobTDate, PathId, FilenameId "
          "FROM File JOIN Job USING (JobId) "
-        "WHERE JobId IN (%s) "
+        "WHERE File.JobId IN (%s) "
        "GROUP BY PathId, FilenameId "
      ") AS t1, Job AS j1, File AS f1 "
     "WHERE t1.JobTDate = j1.JobTDate "
@@ -525,18 +571,19 @@ const char *select_recent_version[4] = {
 
    /* Postgresql */
    "SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
-          "FileIndex, PathId, FilenameId, LStat "
+          "FileIndex, PathId, FilenameId, LStat, MD5 "
      "FROM File JOIN Job USING (JobId) "
     "WHERE JobId IN (%s) "
     "ORDER BY FilenameId, PathId, StartTime DESC ",
 
    /* SQLite */
    "SELECT j1.JobId AS JobId, f1.FileId AS FileId, f1.FileIndex AS FileIndex, "
-          "f1.PathId AS PathId, f1.FilenameId AS FilenameId, f1.LStat AS LStat "
+          "f1.PathId AS PathId, f1.FilenameId AS FilenameId, "
+          "f1.LStat AS LStat, f1.MD5 AS MD5 "
      "FROM ( "
        "SELECT max(JobTDate) AS JobTDate, PathId, FilenameId "
          "FROM File JOIN Job USING (JobId) "
-        "WHERE JobId IN (%s) "
+        "WHERE File.JobId IN (%s) "
        "GROUP BY PathId, FilenameId "
      ") AS t1, Job AS j1, File AS f1 "
     "WHERE t1.JobTDate = j1.JobTDate "
@@ -547,11 +594,12 @@ const char *select_recent_version[4] = {
 
    /* SQLite3 */
    "SELECT j1.JobId AS JobId, f1.FileId AS FileId, f1.FileIndex AS FileIndex, "
-          "f1.PathId AS PathId, f1.FilenameId AS FilenameId, f1.LStat AS LStat "
+          "f1.PathId AS PathId, f1.FilenameId AS FilenameId, "
+          "f1.LStat AS LStat, f1.MD5 AS MD5 "
      "FROM ( "
        "SELECT max(JobTDate) AS JobTDate, PathId, FilenameId "
          "FROM File JOIN Job USING (JobId) "
-        "WHERE JobId IN (%s) "
+        "WHERE File.JobId IN (%s) "
        "GROUP BY PathId, FilenameId "
      ") AS t1, Job AS j1, File AS f1 "
     "WHERE t1.JobTDate = j1.JobTDate "
@@ -754,3 +802,26 @@ const char *uar_jobid_fileindex_from_dir[4] = {
    "AND Path.PathId=File.Pathid "
    "AND Filename.FilenameId=File.FilenameId "
    "GROUP BY File.FileIndex "};
+
+const char *sql_get_max_connections[4] = {
+   /* Mysql */
+   "SHOW VARIABLES LIKE 'max_connections'",
+   /* Postgresql */
+   "SHOW max_connections",
+   /* SQLite */
+   "SELECT 0",
+   /* SQLite3 */
+   "SELECT 0"
+};
+
+/* Row number of the max_connections setting */
+const uint32_t sql_get_max_connections_index[4] = {
+    /* Mysql */
+   1,
+   /* Postgresql */
+   0,
+   /* SQLite */
+   0,
+   /* SQLite3 */
+   0
+};