]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/sql_list.c
don't use add_event() when flag "l" is not set
[bacula/bacula] / bacula / src / cats / sql_list.c
index be5bf8c9ca075a37f3fd5e1315054792cf12d9f7..0090a25490602a0ddeb85ef19c6a895dd2206b7a 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula(R) - The Network Backup Solution
 
-   Copyright (C) 2000-2015 Kern Sibbald
+   Copyright (C) 2000-2016 Kern Sibbald
 
    The original author of Bacula is Kern Sibbald, with contributions
    from many others, a complete list can be found in the file AUTHORS.
  * -----------------------------------------------------------------------
  */
 
+#define append_filter(buf, sql)  \
+   do {                          \
+      if (*buf) {                \
+         pm_strcat(buf, " AND ");\
+      } else {                   \
+         pm_strcpy(buf, " WHERE ");\
+      }                          \
+      pm_strcat(buf, sql);       \
+   } while (0)
+
 /*
  * Submit general SQL query
  */
@@ -71,21 +81,21 @@ void BDB::bdb_list_pool_records(JCR *jcr, POOL_DBR *pdbr,
          Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
             "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes,"
             "AutoPrune,Recycle,PoolType,LabelFormat,Enabled,ScratchPoolId,"
-            "RecyclePoolId,LabelType "
+            "RecyclePoolId,LabelType,ActionOnPurge,CacheRetention "
             " FROM Pool WHERE Name='%s'", esc);
       } else {
          Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
             "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes,"
             "AutoPrune,Recycle,PoolType,LabelFormat,Enabled,ScratchPoolId,"
-            "RecyclePoolId,LabelType "
+            "RecyclePoolId,LabelType,ActionOnPurge,CacheRetention "
             " FROM Pool ORDER BY PoolId");
       }
    } else {
       if (pdbr->Name[0] != 0) {
-         Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
+         Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,MaxVolBytes,VolRetention,Enabled,PoolType,LabelFormat "
            "FROM Pool WHERE Name='%s'", esc);
       } else {
-         Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
+         Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,MaxVolBytes,VolRetention,Enabled,PoolType,LabelFormat "
            "FROM Pool ORDER BY PoolId");
       }
    }
@@ -185,50 +195,75 @@ void BDB::bdb_list_media_records(JCR *jcr, MEDIA_DBR *mdbr,
 {
    char ed1[50];
    char esc[MAX_ESCAPE_NAME_LENGTH];
+   const char *expiresin = expires_in[bdb_get_type_index()];
 
    bdb_lock();
    bdb_escape_string(jcr, esc, mdbr->VolumeName, strlen(mdbr->VolumeName));
+   const char *join = "";
+   const char *where = "";
 
    if (type == VERT_LIST) {
       if (mdbr->VolumeName[0] != 0) {
          Mmsg(cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
             "MediaType,MediaTypeId,FirstWritten,LastWritten,LabelDate,VolJobs,"
-            "VolFiles,VolBlocks,VolMounts,VolBytes,VolABytes,VolAPadding,"
-            "VolHoleBytes,VolHoles,VolErrors,VolWrites,"
-            "VolCapacityBytes,VolStatus,Enabled,Recycle,VolRetention,"
-            "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger,"
-            "EndFile,EndBlock,VolParts,LabelType,StorageId,DeviceId,"
+            "VolFiles,VolBlocks,VolParts,VolCloudParts,Media.CacheRetention,VolMounts,VolBytes,"
+            "VolABytes,VolAPadding,"
+            "VolHoleBytes,VolHoles,LastPartBytes,VolErrors,VolWrites,"
+            "VolCapacityBytes,VolStatus,Media.Enabled,Media.Recycle,Media.VolRetention,"
+            "Media.VolUseDuration,Media.MaxVolJobs,Media.MaxVolFiles,Media.MaxVolBytes,InChanger,"
+            "EndFile,EndBlock,VolType,Media.LabelType,StorageId,DeviceId,"
             "MediaAddressing,VolReadTime,VolWriteTime,"
-            "LocationId,RecycleCount,InitialWrite,ScratchPoolId,RecyclePoolId, "
-            "ActionOnPurge,Comment"
-            " FROM Media WHERE Media.VolumeName='%s'", esc);
+            "LocationId,RecycleCount,InitialWrite,Media.ScratchPoolId,Media.RecyclePoolId, "
+            "Media.ActionOnPurge,%s AS ExpiresIn, Comment"
+           " FROM Media %s WHERE Media.VolumeName='%s' %s",
+              expiresin,
+              join,
+              esc,
+              where
+            );
       } else {
          Mmsg(cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
             "MediaType,MediaTypeId,FirstWritten,LastWritten,LabelDate,VolJobs,"
-            "VolFiles,VolBlocks,VolMounts,VolBytes,VolABytes,VolAPadding,"
-            "VolHoleBytes,VolHoles,VolErrors,VolWrites,"
-            "VolCapacityBytes,VolStatus,Enabled,Recycle,VolRetention,"
-            "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger,"
-            "EndFile,EndBlock,VolParts,LabelType,StorageId,DeviceId,"
+            "VolFiles,VolBlocks,VolParts,VolCloudParts,Media.CacheRetention,VolMounts,VolBytes,"
+            "VolABytes,VolAPadding,"
+            "VolHoleBytes,VolHoles,LastPartBytes,VolErrors,VolWrites,"
+            "VolCapacityBytes,VolStatus,Media.Enabled,Media.Recycle,Media.VolRetention,"
+            "Media.VolUseDuration,Media.MaxVolJobs,Media.MaxVolFiles,Media.MaxVolBytes,InChanger,"
+            "EndFile,EndBlock,VolType,Media.LabelType,StorageId,DeviceId,"
             "MediaAddressing,VolReadTime,VolWriteTime,"
-            "LocationId,RecycleCount,InitialWrite,ScratchPoolId,RecyclePoolId, "
-            "ActionOnPurge,Comment"
-            " FROM Media WHERE Media.PoolId=%s ORDER BY MediaId",
-            edit_int64(mdbr->PoolId, ed1));
+            "LocationId,RecycleCount,InitialWrite,Media.ScratchPoolId,Media.RecyclePoolId, "
+            "Media.ActionOnPurge,%s AS ExpiresIn, Comment"
+            " FROM Media %s WHERE Media.PoolId=%s %s ORDER BY MediaId",
+              expiresin,
+              join,
+              edit_int64(mdbr->PoolId, ed1),
+              where
+            );
       }
    } else {
       if (mdbr->VolumeName[0] != 0) {
-         Mmsg(cmd, "SELECT MediaId,VolumeName,VolStatus,Enabled,"
-            "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,VolParts,LastWritten "
-            "FROM Media WHERE Media.VolumeName='%s'", esc);
+         Mmsg(cmd, "SELECT MediaId,VolumeName,VolStatus,Media.Enabled,"
+            "VolBytes,VolFiles,Media.VolRetention,Media.Recycle,Slot,InChanger,MediaType,VolType,"
+              "VolParts,%s AS ExpiresIn "
+              "FROM Media %s WHERE Media.VolumeName='%s' %s",
+              expiresin,
+              join,
+              esc,
+              where
+            );
       } else {
-         Mmsg(cmd, "SELECT MediaId,VolumeName,VolStatus,Enabled,"
-            "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,VolParts,LastWritten "
-            "FROM Media WHERE Media.PoolId=%s ORDER BY MediaId",
-            edit_int64(mdbr->PoolId, ed1));
+         Mmsg(cmd, "SELECT MediaId,VolumeName,VolStatus,Media.Enabled,"
+            "VolBytes,VolFiles,Media.VolRetention,Media.Recycle,Slot,InChanger,MediaType,VolType,"
+            "VolParts,LastWritten,%s AS ExpiresIn "
+            "FROM Media %s WHERE Media.PoolId=%s %s ORDER BY MediaId",
+              expiresin,
+              join,
+              edit_int64(mdbr->PoolId, ed1),
+              where
+            );
       }
    }
-
+   Dmsg1(DT_SQL|50, "q=%s\n", cmd);
    if (!QueryDB(jcr, cmd)) {
       bdb_unlock();
       return;
@@ -246,30 +281,45 @@ void BDB::bdb_list_jobmedia_records(JCR *jcr, uint32_t JobId,
    char ed1[50];
 
    bdb_lock();
+   const char *join = "";
+   const char *where = "";
+
    if (type == VERT_LIST) {
       if (JobId > 0) {                   /* do by JobId */
          Mmsg(cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName,"
             "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock,"
             "JobMedia.EndBlock "
-            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
-            "AND JobMedia.JobId=%s", edit_int64(JobId, ed1));
+            "FROM JobMedia JOIN Media USING (MediaId) %s "
+            "WHERE JobMedia.JobId=%s %s",
+              join,
+              edit_int64(JobId, ed1),
+              where);
       } else {
          Mmsg(cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName,"
             "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock,"
             "JobMedia.EndBlock "
-            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
+            "FROM JobMedia JOIN Media USING (MediaId) %s %s",
+              join,
+              where);
       }
 
    } else {
       if (JobId > 0) {                   /* do by JobId */
          Mmsg(cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
-            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
-            "AND JobMedia.JobId=%s", edit_int64(JobId, ed1));
+            "FROM JobMedia JOIN Media USING (MediaId) %s WHERE "
+            "JobMedia.JobId=%s %s",
+              join,
+              edit_int64(JobId, ed1),
+              where);
       } else {
          Mmsg(cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
-            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
+              "FROM JobMedia JOIN Media USING (MediaId) %s %s",
+              join,
+              where);
       }
    }
+   Dmsg1(DT_SQL|50, "q=%s\n", cmd);
+
    if (!QueryDB(jcr, cmd)) {
       bdb_unlock();
       return;
@@ -366,94 +416,94 @@ alist *BDB::bdb_list_job_records(JCR *jcr, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
                     void *ctx, e_list_type type)
 {
    char ed1[50];
-   char limit[100];
-   char status[100];
+   char limit[50];
    char esc[MAX_ESCAPE_NAME_LENGTH];
    alist *list = NULL;
+   POOLMEM *where  = get_pool_memory(PM_MESSAGE);
+   POOLMEM *tmp    = get_pool_memory(PM_MESSAGE);
+   const char *order = "ASC";
+   *where = 0;
 
    bdb_lock();
+   if (jr->order == 1) {
+      order = "DESC";
+   }
    if (jr->limit > 0) {
       snprintf(limit, sizeof(limit), " LIMIT %d", jr->limit);
    } else {
       limit[0] = 0;
    }
+   if (jr->Name[0]) {
+      bdb_escape_string(jcr, esc, jr->Name, strlen(jr->Name));
+      Mmsg(tmp, " Job.Name='%s' ", esc);
+      append_filter(where, tmp);
+
+   } else if (jr->JobId != 0) {
+      Mmsg(tmp, " Job.JobId=%s ", edit_int64(jr->JobId, ed1));
+      append_filter(where, tmp);
+
+   } else if (jr->Job[0] != 0) {
+      bdb_escape_string(jcr, esc, jr->Job, strlen(jr->Job));
+      Mmsg(tmp, " Job.Job='%s' ", esc);
+      append_filter(where, tmp);
+   }
+
+   if (type == INCOMPLETE_JOBS && jr->JobStatus == JS_FatalError) {
+      Mmsg(tmp, " Job.JobStatus IN ('E', 'f') ");
+      append_filter(where, tmp);
+
+   } else if (jr->JobStatus) {
+      Mmsg(tmp, " Job.JobStatus='%c' ", jr->JobStatus);
+      append_filter(where, tmp);
+   }
+
+   if (jr->JobType) {
+      Mmsg(tmp, " Job.Type='%c' ", jr->JobType);
+      append_filter(where, tmp);
+   }
+
+   if (jr->JobErrors > 0) {
+      Mmsg(tmp, " Job.JobErrors > 0 ");
+      append_filter(where, tmp);
+   }
+
+   if (jr->ClientId > 0) {
+      Mmsg(tmp, " Job.ClientId=%s ", edit_int64(jr->ClientId, ed1));
+      append_filter(where, tmp);
+   }
+
    switch (type) {
    case VERT_LIST:
-      if (jr->JobId == 0 && jr->Job[0] == 0) {
-         Mmsg(cmd,
-            "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
-            "Job.ClientId,Client.Name as ClientName,JobStatus,SchedTime,"
-            "StartTime,EndTime,RealEndTime,JobTDate,"
-            "VolSessionId,VolSessionTime,JobFiles,JobBytes,ReadBytes,JobErrors,"
-            "JobMissingFiles,Job.PoolId,Pool.Name as PooLname,PriorJobId,"
-            "Job.FileSetId,FileSet.FileSet,Job.HasBase,Job.HasCache,Job.Comment "
-            "FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId) "
-            "LEFT JOIN FileSet USING (FileSetId) ",
-            "ORDER BY StartTime%s", limit);
-      } else {                           /* single record */
-         Mmsg(cmd,
-            "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
-            "Job.ClientId,Client.Name as ClientName,JobStatus,SchedTime,"
-            "StartTime,EndTime,RealEndTime,JobTDate,"
-            "VolSessionId,VolSessionTime,JobFiles,JobBytes,ReadBytes,JobErrors,"
-            "JobMissingFiles,Job.PoolId,Pool.Name as PooLname,PriorJobId,"
-            "Job.FileSetId,FileSet.FileSet,Job.HasBase,Job.HasCache,Job.Comment "
-            "FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId) "
-            "LEFT JOIN FileSet USING (FileSetId) WHERE Job.JobId=%s ",
-            edit_int64(jr->JobId, ed1));
-      }
+      Mmsg(cmd,
+           "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
+           "Job.ClientId,Client.Name as ClientName,JobStatus,SchedTime,"
+           "StartTime,EndTime,RealEndTime,JobTDate,"
+           "VolSessionId,VolSessionTime,JobFiles,JobBytes,ReadBytes,JobErrors,"
+           "JobMissingFiles,Job.PoolId,Pool.Name as PoolName,PriorJobId,"
+           "Job.FileSetId,FileSet.FileSet,Job.HasBase,Job.HasCache,Job.Comment "
+           "FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId) "
+           "LEFT JOIN FileSet USING (FileSetId) %s "
+           "ORDER BY StartTime %s %s", where, order, limit);
       break;
    case HORZ_LIST:
-      if (jr->Name[0] != 0) {
-         bdb_escape_string(jcr, esc, jr->Name, strlen(jr->Name));
-         Mmsg(cmd,
+      Mmsg(cmd,
            "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-             "FROM Job WHERE Name='%s' ORDER BY StartTime,JobId ASC", esc);
-      } else if (jr->Job[0] != 0) {
-         bdb_escape_string(jcr, esc, jr->Job, strlen(jr->Job));
-         Mmsg(cmd,
-            "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-            "FROM Job WHERE Job='%s' ORDER BY StartTime,JobId ASC", esc);
-      } else if (jr->JobId != 0) {
-         Mmsg(cmd,
-            "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-            "FROM Job WHERE JobId=%s", edit_int64(jr->JobId, ed1));
-      } else {                           /* all records */
-         Mmsg(cmd,
-           "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-           "FROM Job ORDER BY StartTime,JobId ASC%s", limit);
-      }
+           "FROM Job %s ORDER BY StartTime %s,JobId %s %s", where, order, order, limit);
       break;
    case INCOMPLETE_JOBS:
-      if (jr->Name[0] != 0) {
-         bdb_escape_string(jcr, esc, jr->Name, strlen(jr->Name));
-         if (jr->JobStatus == JS_FatalError) {
-            snprintf(status, sizeof(status), "JobStatus IN ('E','f') AND");
-         } else if (jr->JobStatus != 0) {
-            snprintf(status, sizeof(status), "JobStatus='%c' AND", jr->JobStatus);
-         } else {
-            status[0] = 0;
-         }
-         Mmsg(cmd,
+      Mmsg(cmd,
            "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-             "FROM Job WHERE %s Name='%s' ORDER BY StartTime,JobId ASC%s",
-              status, esc, limit);
-         Dmsg1(100, "SQL: %s\n", cmd);
-      } else {                           /* all records */
-         if (jr->JobStatus != 0) {
-            snprintf(status, sizeof(status), "WHERE JobStatus='%c'", jr->JobStatus);
-         } else {
-            status[0] = 0;
-         }
-         Mmsg(cmd,
-           "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-           "FROM Job %s ORDER BY StartTime,JobId ASC%s", status, limit);
-         Dmsg1(100, "SQL: %s\n", cmd);
-      }
+             "FROM Job %s ORDER BY StartTime %s,JobId %s %s",
+           where, order, order, limit);
       break;
    default:
       break;
    }
+
+   free_pool_memory(tmp);
+   free_pool_memory(where);
+
+   Dmsg1(100, "SQL: %s\n", cmd);
    if (!QueryDB(jcr, cmd)) {
       bdb_unlock();
       return NULL;
@@ -509,11 +559,27 @@ void BDB::bdb_list_job_totals(JCR *jcr, JOB_DBR *jr, DB_LIST_HANDLER *sendit, vo
    bdb_unlock();
 }
 
-void BDB::bdb_list_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
+/* List all file records from a job
+ * "deleted" values are described just below
+ */
+void BDB::bdb_list_files_for_job(JCR *jcr, JobId_t jobid, int deleted, DB_LIST_HANDLER *sendit, void *ctx)
 {
    char ed1[50];
+   const char *opt;
    LIST_CTX lctx(jcr, this, sendit, ctx, HORZ_LIST);
 
+   switch (deleted) {
+   case 0:                      /* Show only actual files */
+      opt = " AND FileIndex <> 0 ";
+      break;
+   case 1:                      /* Show only deleted files */
+      opt = " AND FileIndex = 0 ";
+      break;
+   default:                     /* Show everything */
+      opt = "";
+      break;
+   }
+
    bdb_lock();
 
    /*
@@ -521,7 +587,7 @@ void BDB::bdb_list_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendi
     */
    if (bdb_get_type_index() == SQL_TYPE_MYSQL) {
       Mmsg(cmd, "SELECT CONCAT(Path.Path,Filename.Name) AS Filename "
-           "FROM (SELECT PathId, FilenameId FROM File WHERE JobId=%s "
+           "FROM (SELECT PathId, FilenameId FROM File WHERE JobId=%s %s "
                   "UNION ALL "
                  "SELECT PathId, FilenameId "
                    "FROM BaseFiles JOIN File "
@@ -530,10 +596,10 @@ void BDB::bdb_list_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendi
            ") AS F, Filename,Path "
            "WHERE Filename.FilenameId=F.FilenameId "
            "AND Path.PathId=F.PathId",
-           edit_int64(jobid, ed1), ed1);
+           edit_int64(jobid, ed1), opt, ed1);
    } else {
       Mmsg(cmd, "SELECT Path.Path||Filename.Name AS Filename "
-           "FROM (SELECT PathId, FilenameId FROM File WHERE JobId=%s "
+           "FROM (SELECT PathId, FilenameId FROM File WHERE JobId=%s %s "
                   "UNION ALL "
                  "SELECT PathId, FilenameId "
                    "FROM BaseFiles JOIN File "
@@ -542,9 +608,9 @@ void BDB::bdb_list_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendi
            ") AS F, Filename,Path "
            "WHERE Filename.FilenameId=F.FilenameId "
            "AND Path.PathId=F.PathId",
-           edit_int64(jobid, ed1), ed1);
+           edit_int64(jobid, ed1), opt, ed1);
    }
-
+   Dmsg1(100, "q=%s\n", cmd);
    if (!bdb_big_sql_query(cmd, list_result, &lctx)) {
        bdb_unlock();
        return;
@@ -595,16 +661,6 @@ void BDB::bdb_list_base_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *
    bdb_unlock();
 }
 
-#define append_filter(buf, sql)  \
-   do {                          \
-      if (*buf) {                \
-         pm_strcat(buf, " AND ");\
-      } else {                   \
-         pm_strcpy(buf, " WHERE ");\
-      }                          \
-      pm_strcat(buf, sql);       \
-   } while (0)
-
 void BDB::bdb_list_snapshot_records(JCR *jcr, SNAPSHOT_DBR *sdbr,
               DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {