]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/sql_find.c
Implement InChanger code + fix Volume ordering
[bacula/bacula] / bacula / src / cats / sql_find.c
index 948a9840629fc135409a1e8ed1c22f648be048fa..5e245119663906ba5b22e6ac47a023c861801ba7 100644 (file)
@@ -72,20 +72,20 @@ db_find_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime)
    /* If no Id given, we must find corresponding job */
    if (jr->JobId == 0) {
       /* Differential is since last Full backup */
-      Mmsg(&mdb->cmd, 
+        Mmsg(&mdb->cmd, 
 "SELECT StartTime FROM Job WHERE JobStatus='T' AND Type='%c' AND "
 "Level='%c' AND Name='%s' AND ClientId=%u AND FileSetId=%u "
 "ORDER BY StartTime DESC LIMIT 1",
-        jr->Type, L_FULL, jr->Name, jr->ClientId, jr->FileSetId);
+          jr->Type, L_FULL, jr->Name, jr->ClientId, jr->FileSetId);
 
       if (jr->Level == L_DIFFERENTIAL) {
-      /* Incremental is since last Full, Incremental, or Differential */
-        /* SQL cmd already edited above */
+        /* SQL cmd for Differential backup already edited above */
 
+      /* Incremental is since last Full, Incremental, or Differential */
       } else if (jr->Level == L_INCREMENTAL) {
         /* 
          * For an Incremental job, we must first ensure
-         *  that a Full backup wase done (cmd edited above)
+         *  that a Full backup was done (cmd edited above)
          *  then we do a second look to find the most recent
          *  backup
          */
@@ -97,7 +97,7 @@ db_find_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime)
         }
         if ((row = sql_fetch_row(mdb)) == NULL) {
            sql_free_result(mdb);
-            Mmsg(&mdb->errmsg, _("No prior Full backup Job record found.\n"));
+               Mmsg(&mdb->errmsg, _("No prior Full backup Job record found.\n"));
            db_unlock(mdb);
            return 0;
         }
@@ -106,9 +106,9 @@ db_find_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime)
         Mmsg(&mdb->cmd, 
 "SELECT StartTime FROM Job WHERE JobStatus='T' AND Type='%c' AND "
 "Level IN ('%c','%c','%c') AND Name='%s' AND ClientId=%u "
-"ORDER BY StartTime DESC LIMIT 1",
-          jr->Type, L_INCREMENTAL, L_DIFFERENTIAL, L_FULL, jr->Name,
-          jr->ClientId);
+"AND FileSetId=%u ORDER BY StartTime DESC LIMIT 1",
+           jr->Type, L_INCREMENTAL, L_DIFFERENTIAL, L_FULL, jr->Name,
+           jr->ClientId, jr->FileSetId);
       } else {
          Mmsg1(&mdb->errmsg, _("Unknown level=%d\n"), jr->Level);
         db_unlock(mdb);
@@ -119,7 +119,6 @@ db_find_job_start_time(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM **stime)
       Mmsg(&mdb->cmd, "SELECT StartTime FROM Job WHERE Job.JobId=%u", jr->JobId);
    }
 
-
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       pm_strcpy(stime, "");                   /* set EOS */
       Mmsg2(&mdb->errmsg, _("Query error for start time request: ERR=%s\nCMD=%s\n"),
@@ -160,7 +159,8 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, char *Name, JOB_DBR *jr)
    db_lock(mdb);
    if (jr->Level == L_VERIFY_CATALOG) {
       Mmsg(&mdb->cmd, 
-"SELECT JobId FROM Job WHERE Type='V' AND Level='%c' AND Name='%s' AND "
+"SELECT JobId FROM Job WHERE Type='V' AND Level='%c' AND "
+" JobStatus='T' AND Name='%s' AND "
 "ClientId=%u ORDER BY StartTime DESC LIMIT 1",
           L_VERIFY_INIT, jr->Name, jr->ClientId);
    } else if (jr->Level == L_VERIFY_VOLUME_TO_CATALOG ||
@@ -171,7 +171,7 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, char *Name, JOB_DBR *jr)
 "Name='%s' ORDER BY StartTime DESC LIMIT 1", Name);
       } else {
         Mmsg(&mdb->cmd, 
-"SELECT JobId FROM Job WHERE Type='B' AND "
+"SELECT JobId FROM Job WHERE Type='B' AND JobStatus='T' AND "
 "ClientId=%u ORDER BY StartTime DESC LIMIT 1", jr->ClientId);
       }
    } else {
@@ -214,7 +214,7 @@ db_find_last_jobid(JCR *jcr, B_DB *mdb, char *Name, JOB_DBR *jr)
  *         numrows on success
  */
 int
-db_find_next_volume(JCR *jcr, B_DB *mdb, int item, MEDIA_DBR *mr) 
+db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr) 
 {
    SQL_ROW row;
    int numrows;
@@ -223,21 +223,32 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, MEDIA_DBR *mr)
    if (item == -1) {      /* find oldest volume */
       /* Find oldest volume */
       Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
-"VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
-"VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
-"FirstWritten,LastWritten,VolStatus "
-"FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus IN ('Full',"
-"'Recycle','Purged','Used','Append') "
-"ORDER BY LastWritten LIMIT 1", mr->PoolId, mr->MediaType); 
+          "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
+          "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
+          "FirstWritten,LastWritten,VolStatus "
+          "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus IN ('Full',"
+          "'Recycle','Purged','Used','Append') "
+          "ORDER BY LastWritten LIMIT 1", mr->PoolId, mr->MediaType); 
      item = 1;
    } else {
       /* Find next available volume */
-      Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
-"VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
-"VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
-"FirstWritten,LastWritten,VolStatus "
-"FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus='%s' "
-"ORDER BY MediaId", mr->PoolId, mr->MediaType, mr->VolStatus); 
+      if (InChanger) {
+         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
+             "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
+             "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
+             "FirstWritten,LastWritten,VolStatus "
+             "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus='%s' "
+             "AND InChanger=1 ORDER BY LastWritten,MediaId", 
+             mr->PoolId, mr->MediaType, mr->VolStatus); 
+      } else {
+         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
+             "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
+             "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
+             "FirstWritten,LastWritten,VolStatus "
+             "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus='%s' "
+             "ORDER BY LastWritten,MediaId", 
+             mr->PoolId, mr->MediaType, mr->VolStatus); 
+      }
    }
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);