]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/sql_list.c
SetIP command + CloseOnPoll + Full,Inc,Diff Pools + more access control checks
[bacula/bacula] / bacula / src / cats / sql_list.c
index 48fa727697739244f1189328d71723bfd3fb056c..6541f3a27f4c45e05bfac10f5b32509619f6c21b 100644 (file)
@@ -34,7 +34,7 @@
 #include "bacula.h"
 #include "cats.h"
 
-#if    HAVE_MYSQL || HAVE_SQLITE
+#if    HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL
 
 /* -----------------------------------------------------------------------
  *
  */
 
 /* Imported subroutines */
-extern void list_result(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx);
-extern int QueryDB(char *file, int line, B_DB *db, char *select_cmd);
+extern void list_result(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
+extern int QueryDB(char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
 
 
 /* 
  * Submit general SQL query
  */
-int db_list_sql_query(B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, void *ctx,
-                     int verbose)
+int db_list_sql_query(JCR *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, 
+                     void *ctx, int verbose, e_list_type type)
 {
    db_lock(mdb);
    if (sql_query(mdb, query) != 0) {
@@ -67,7 +67,7 @@ int db_list_sql_query(B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, void *ctx
    mdb->result = sql_store_result(mdb);
 
    if (mdb->result) {
-      list_result(mdb, sendit, ctx);
+      list_result(mdb, sendit, ctx, type);
       sql_free_result(mdb);
    }
    db_unlock(mdb);
@@ -75,60 +75,135 @@ int db_list_sql_query(B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, void *ctx
 }
 
 void
-db_list_pool_records(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx
+db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type
 {
-   Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
-"FROM Pool ORDER BY PoolId");
-
    db_lock(mdb);
-   if (!QUERY_DB(mdb, mdb->cmd)) {
+   if (type == VERT_LIST) {
+      Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
+         "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes,"
+         "AutoPrune,Recycle,PoolType,LabelFormat "
+          "FROM Pool ORDER BY PoolId");
+   } else {
+      Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
+        "FROM Pool ORDER BY PoolId");
+   }
+
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return;
    }
 
-   list_result(mdb, sendit, ctx);
+   list_result(mdb, sendit, ctx, type);
    
    sql_free_result(mdb);
    db_unlock(mdb);
 }
 
 void
-db_list_media_records(B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx)
+db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {
-   Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,MediaType,VolStatus,\
-VolBytes,LastWritten,VolRetention,Recycle,Slot \
-FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId);
-
    db_lock(mdb);
-   if (!QUERY_DB(mdb, mdb->cmd)) {
+   if (type == VERT_LIST) {
+      Mmsg(&mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,"
+         "FileRetention,JobRetention "
+         "FROM Client ORDER BY ClientId");
+   } else {
+      Mmsg(&mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention "
+         "FROM Client ORDER BY ClientId");
+   }
+
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return;
    }
 
-   list_result(mdb, sendit, ctx);
+   list_result(mdb, sendit, ctx, type);
    
    sql_free_result(mdb);
    db_unlock(mdb);
 }
 
-void db_list_jobmedia_records(B_DB *mdb, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx)
+
+/*
+ * If VolumeName is non-zero, list the record for that Volume
+ *   otherwise, list the Volumes in the Pool specified by PoolId
+ */
+void
+db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr, 
+                     DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {
-   if (JobId > 0) {                  /* do by JobId */
-      Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \
-FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId and JobMedia.JobId=%u", 
-          JobId);
+   db_lock(mdb);
+   if (type == VERT_LIST) {
+      if (mdbr->VolumeName[0] != 0) {
+         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
+            "MediaType,FirstWritten,LastWritten,LabelDate,VolJobs,"
+            "VolFiles,VolBlocks,VolMounts,VolBytes,VolErrors,VolWrites,"
+            "VolCapacityBytes,VolStatus,Recycle,VolRetention,"
+            "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger "
+            "FROM Media WHERE Media.VolumeName='%s'", mdbr->VolumeName);
+      } else {
+         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
+            "MediaType,FirstWritten,LastWritten,LabelDate,VolJobs,"
+            "VolFiles,VolBlocks,VolMounts,VolBytes,VolErrors,VolWrites,"
+            "VolCapacityBytes,VolStatus,Recycle,VolRetention,"
+            "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger "
+            "FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId);
+      }
    } else {
-      Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \
-FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId");
+      if (mdbr->VolumeName[0] != 0) {
+         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,"
+            "VolBytes,VolFiles,VolRetention,Recycle,Slot,MediaType,LastWritten "
+            "FROM Media WHERE Media.VolumeName='%s'", mdbr->VolumeName);
+      } else {
+         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,"
+            "VolBytes,VolFiles,VolRetention,Recycle,Slot,MediaType,LastWritten "
+            "FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId);
+      }
    }
 
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
+      db_unlock(mdb);
+      return;
+   }
+
+   list_result(mdb, sendit, ctx, type);
+   
+   sql_free_result(mdb);
+   db_unlock(mdb);
+}
+
+void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId, 
+                             DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
+{
    db_lock(mdb);
-   if (!QUERY_DB(mdb, mdb->cmd)) {
+   if (type == VERT_LIST) {
+      if (JobId > 0) {                  /* do by JobId */
+         Mmsg(&mdb->cmd, "SELECT JobMediaId,JobId,MediaId,Media.VolumeName,"
+            "FirstIndex,LastIndex,StartFile,EndFile,StartBlock,EndBlock "
+            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
+            "AND JobMedia.JobId=%u", JobId);
+      } else {
+         Mmsg(&mdb->cmd, "SELECT JobMediaId,JobId,MediaId,Media.VolumeName,"
+            "FirstIndex,LastIndex,StartFile,EndFile,StartBlock,EndBlock "
+            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
+      }
+
+   } else {
+      if (JobId > 0) {                  /* do by JobId */
+         Mmsg(&mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
+            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
+            "AND JobMedia.JobId=%u", JobId);
+      } else {
+         Mmsg(&mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
+            "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
+      }
+   }
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return;
    }
 
-   list_result(mdb, sendit, ctx);
+   list_result(mdb, sendit, ctx, type);
    
    sql_free_result(mdb);
    db_unlock(mdb);
@@ -143,24 +218,47 @@ FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId");
  *  only the job with the specified id.
  */
 void
-db_list_job_records(B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
+db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, 
+                   void *ctx, e_list_type type)
 {
-   if (jr->JobId == 0 && jr->Job[0] == 0) {
-      Mmsg(&mdb->cmd, 
-"SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-"FROM Job ORDER BY JobId");
-   } else {                          /* single record */
-      Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,\
-JobFiles,JobBytes,JobStatus FROM Job WHERE Job.JobId=%u", jr->JobId);
-   }
-
    db_lock(mdb);
-   if (!QUERY_DB(mdb, mdb->cmd)) {
+   if (type == VERT_LIST) {
+      if (jr->JobId == 0 && jr->Job[0] == 0) {
+        Mmsg(&mdb->cmd, 
+            "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
+            "Job.ClientId,Client.Name,JobStatus,SchedTime,"
+            "StartTime,EndTime,JobTDate,"
+            "VolSessionId,VolSessionTime,JobFiles,JobErrors,"
+            "JobMissingFiles,Job.PoolId,Pool.Name,Job.FileSetId,FileSet.FileSet "
+            "FROM Job,Client,Pool,FileSet WHERE "
+            "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId "
+            "AND FileSet.FileSetId=Job.FileSetId  ORDER BY JobId");
+      } else {                          /* single record */
+        Mmsg(&mdb->cmd, 
+            "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
+            "Job.ClientId,Client.Name,JobStatus,SchedTime,"
+            "StartTime,EndTime,JobTDate,"
+            "VolSessionId,VolSessionTime,JobFiles,JobErrors,"
+            "JobMissingFiles,Job.PoolId,Pool.Name,Job.FileSetId,FileSet.FileSet "
+            "FROM Job,Client,Pool,FileSet WHERE Job.JobId=%u AND "
+            "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId "
+            "AND FileSet.FileSetId=Job.FileSetId", jr->JobId);
+      }
+   } else {
+      if (jr->JobId == 0 && jr->Job[0] == 0) {
+        Mmsg(&mdb->cmd, 
+           "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
+           "FROM Job ORDER BY JobId");
+      } else {                          /* single record */
+         Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,"
+            "JobFiles,JobBytes,JobStatus FROM Job WHERE JobId=%u", jr->JobId);
+      }
+   }
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return;
    }
-
-   list_result(mdb, sendit, ctx);
+   list_result(mdb, sendit, ctx, type);
    
    sql_free_result(mdb);
    db_unlock(mdb);
@@ -171,7 +269,7 @@ JobFiles,JobBytes,JobStatus FROM Job WHERE Job.JobId=%u", jr->JobId);
  *
  */
 void
-db_list_job_totals(B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
+db_list_job_totals(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
 {
    db_lock(mdb);
 
@@ -179,12 +277,12 @@ db_list_job_totals(B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
    Mmsg(&mdb->cmd, "SELECT  count(*) AS Jobs, sum(JobFiles) \
 AS Files, sum(JobBytes) AS Bytes, Name AS Job FROM Job GROUP BY Name");
 
-   if (!QUERY_DB(mdb, mdb->cmd)) {
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return;
    }
 
-   list_result(mdb, sendit, ctx);
+   list_result(mdb, sendit, ctx, HORZ_LIST);
    
    sql_free_result(mdb);
 
@@ -192,12 +290,12 @@ AS Files, sum(JobBytes) AS Bytes, Name AS Job FROM Job GROUP BY Name");
    Mmsg(&mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) \
 AS Files,sum(JobBytes) As Bytes FROM Job");
 
-   if (!QUERY_DB(mdb, mdb->cmd)) {
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return;
    }
 
-   list_result(mdb, sendit, ctx);
+   list_result(mdb, sendit, ctx, HORZ_LIST);
    
    sql_free_result(mdb);
    db_unlock(mdb);
@@ -205,25 +303,25 @@ AS Files,sum(JobBytes) As Bytes FROM Job");
 
 
 void
-db_list_files_for_job(B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
+db_list_files_for_job(JCR *jcr, B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
 {
+   db_lock(mdb);
 
    Mmsg(&mdb->cmd, "SELECT Path.Path,Filename.Name FROM File,\
 Filename,Path WHERE File.JobId=%u AND Filename.FilenameId=File.FilenameId \
 AND Path.PathId=File.PathId",
       jobid);
 
-   db_lock(mdb);
-   if (!QUERY_DB(mdb, mdb->cmd)) {
+   if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
       return;
    }
 
-   list_result(mdb, sendit, ctx);
+   list_result(mdb, sendit, ctx, HORZ_LIST);
    
    sql_free_result(mdb);
    db_unlock(mdb);
 }
 
 
-#endif /* HAVE_MYSQL || HAVE_SQLITE */
+#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */