]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/sql_list.c
- Put Dmsg() on inside if() to avoid calling subroutine.
[bacula/bacula] / bacula / src / cats / sql_list.c
index 3f56ca248faec0f7063d1b2531b3d369cd007caa..cb229b72c20bdeff1e006bce3578b195507ea0b4 100644 (file)
@@ -1,13 +1,13 @@
 /*
  * Bacula Catalog Database List records interface routines
- * 
+ *
  *    Kern Sibbald, March 2000
  *
  *    Version $Id$
  */
 
 /*
-   Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+   Copyright (C) 2000-2005 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -34,7 +34,7 @@
 #include "bacula.h"
 #include "cats.h"
 
-#if    HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL
+#if    HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL
 
 /* -----------------------------------------------------------------------
  *
 
 /* Imported subroutines */
 extern void list_result(JCR *jcr, 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);
+extern int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
 
 
-/* 
+/*
  * Submit general SQL query
  */
-int db_list_sql_query(JCR *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, 
+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) {
-      Mmsg(&mdb->errmsg, _("Query failed: %s\n"), sql_strerror(mdb));
+      Mmsg(mdb->errmsg, _("Query failed: %s\n"), sql_strerror(mdb));
       if (verbose) {
         sendit(ctx, mdb->errmsg);
       }
@@ -75,16 +75,17 @@ int db_list_sql_query(JCR *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit,
 }
 
 void
-db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type) 
+db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {
    db_lock(mdb);
    if (type == VERT_LIST) {
-      Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
+      Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
          "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes,"
-         "AutoPrune,Recycle,PoolType,LabelFormat "
-          "FROM Pool ORDER BY PoolId");
+         "AutoPrune,Recycle,PoolType,LabelFormat,Enabled,ScratchPoolId,"
+         "RecyclePoolId,LabelType "
+         " FROM Pool ORDER BY PoolId");
    } else {
-      Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
+      Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
         "FROM Pool ORDER BY PoolId");
    }
 
@@ -94,7 +95,7 @@ db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_
    }
 
    list_result(jcr, mdb, sendit, ctx, type);
-   
+
    sql_free_result(mdb);
    db_unlock(mdb);
 }
@@ -104,11 +105,11 @@ db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx,
 {
    db_lock(mdb);
    if (type == VERT_LIST) {
-      Mmsg(&mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,"
-         "FileRetention,JobRetention "
+      Mmsg(mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,"
+         "JobRetention "
          "FROM Client ORDER BY ClientId");
    } else {
-      Mmsg(&mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention "
+      Mmsg(mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention "
          "FROM Client ORDER BY ClientId");
    }
 
@@ -118,7 +119,7 @@ db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx,
    }
 
    list_result(jcr, mdb, sendit, ctx, type);
-   
+
    sql_free_result(mdb);
    db_unlock(mdb);
 }
@@ -129,35 +130,40 @@ db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx,
  *   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_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr,
                      DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {
+   char ed1[50];
    db_lock(mdb);
    if (type == VERT_LIST) {
       if (mdbr->VolumeName[0] != 0) {
-         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
+         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);
+            "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger,"
+            "EndFile,EndBlock,VolParts,LabelType,StorageId"
+            " FROM Media WHERE Media.VolumeName='%s'", mdbr->VolumeName);
       } else {
-         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
+         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);
+            "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger,"
+            "EndFile,EndBlock,VolParts,LabelType,StorageId"
+            " FROM Media WHERE Media.PoolId=%s ORDER BY MediaId", 
+           edit_int64(mdbr->PoolId, ed1));
       }
    } else {
       if (mdbr->VolumeName[0] != 0) {
-         Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,"
-            "VolBytes,VolFiles,VolRetention,Recycle,Slot,MediaType,LastWritten "
+         Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,"
+            "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,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);
+         Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,"
+            "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,LastWritten "
+            "FROM Media WHERE Media.PoolId=%s ORDER BY MediaId", 
+           edit_int64(mdbr->PoolId, ed1));
       }
    }
 
@@ -167,34 +173,37 @@ db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr,
    }
 
    list_result(jcr, mdb, sendit, ctx, type);
-   
+
    sql_free_result(mdb);
    db_unlock(mdb);
 }
 
-void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId, 
+void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
                              DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {
+   char ed1[50];
    db_lock(mdb);
    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 "
+         Mmsg(mdb->cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName,"
+            "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock,"
+            "JobMedia.EndBlock,Copy,Stripe "
             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
-            "AND JobMedia.JobId=%u", JobId);
+            "AND JobMedia.JobId=%s", edit_int64(JobId, ed1));
       } else {
-         Mmsg(&mdb->cmd, "SELECT JobMediaId,JobId,MediaId,Media.VolumeName,"
-            "FirstIndex,LastIndex,StartFile,EndFile,StartBlock,EndBlock "
+         Mmsg(mdb->cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName,"
+            "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock,"
+            "JobMedia.EndBlock,Copy,Stripe "
             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
       }
 
    } else {
       if (JobId > 0) {                  /* do by JobId */
-         Mmsg(&mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
+         Mmsg(mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
-            "AND JobMedia.JobId=%u", JobId);
+            "AND JobMedia.JobId=%s", edit_int64(JobId, ed1));
       } else {
-         Mmsg(&mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
+         Mmsg(mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
       }
    }
@@ -204,7 +213,7 @@ void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
    }
 
    list_result(jcr, mdb, sendit, ctx, type);
-   
+
    sql_free_result(mdb);
    db_unlock(mdb);
 }
@@ -218,13 +227,20 @@ void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
  *  only the job with the specified id.
  */
 void
-db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, 
+db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
                    void *ctx, e_list_type type)
 {
+   char ed1[50];
+   char limit[100];
    db_lock(mdb);
+   if (jr->limit > 0) {
+      snprintf(limit, sizeof(limit), " LIMIT %d", jr->limit);
+   } else {
+      limit[0] = 0;
+   }
    if (type == VERT_LIST) {
       if (jr->JobId == 0 && jr->Job[0] == 0) {
-        Mmsg(&mdb->cmd, 
+        Mmsg(mdb->cmd,
             "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
             "Job.ClientId,Client.Name,JobStatus,SchedTime,"
             "StartTime,EndTime,JobTDate,"
@@ -232,26 +248,28 @@ db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
             "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 StartTime");
+            "AND FileSet.FileSetId=Job.FileSetId  ORDER BY StartTime%s", limit);
       } else {                          /* single record */
-        Mmsg(&mdb->cmd, 
+        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 "
+            "FROM Job,Client,Pool,FileSet WHERE Job.JobId=%s AND "
             "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId "
-            "AND FileSet.FileSetId=Job.FileSetId", jr->JobId);
+            "AND FileSet.FileSetId=Job.FileSetId", 
+           edit_int64(jr->JobId, ed1));
       }
    } else {
       if (jr->JobId == 0 && jr->Job[0] == 0) {
-        Mmsg(&mdb->cmd, 
+        Mmsg(mdb->cmd,
            "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
-           "FROM Job ORDER BY StartTime");
+           "FROM Job ORDER BY StartTime%s", limit);
       } else {                          /* single record */
-         Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,"
-            "JobFiles,JobBytes,JobStatus FROM Job WHERE JobId=%u", jr->JobId);
+         Mmsg(mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,"
+            "JobFiles,JobBytes,JobStatus FROM Job WHERE JobId=%s", 
+           edit_int64(jr->JobId, ed1));
       }
    }
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
@@ -259,7 +277,7 @@ db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
       return;
    }
    list_result(jcr, mdb, sendit, ctx, type);
-   
+
    sql_free_result(mdb);
    db_unlock(mdb);
 }
@@ -274,7 +292,7 @@ db_list_job_totals(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, vo
    db_lock(mdb);
 
    /* List by Job */
-   Mmsg(&mdb->cmd, "SELECT  count(*) AS Jobs,sum(JobFiles) "
+   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(jcr, mdb, mdb->cmd)) {
@@ -283,12 +301,12 @@ db_list_job_totals(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, vo
    }
 
    list_result(jcr, mdb, sendit, ctx, HORZ_LIST);
-   
+
    sql_free_result(mdb);
 
    /* Do Grand Total */
-   Mmsg(&mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) \
-AS Files,sum(JobBytes) As Bytes FROM Job");
+   Mmsg(mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) "
+"AS Files,sum(JobBytes) As Bytes FROM Job");
 
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
@@ -296,13 +314,13 @@ AS Files,sum(JobBytes) As Bytes FROM Job");
    }
 
    list_result(jcr, mdb, sendit, ctx, HORZ_LIST);
-   
+
    sql_free_result(mdb);
    db_unlock(mdb);
 }
 
-/* 
- * Stupid MySQL is NON-STANDARD !  
+/*
+ * Stupid MySQL is NON-STANDARD !
  */
 #ifdef HAVE_MYSQL
 #define FN "CONCAT(Path.Path,Filename.Name)"
@@ -311,14 +329,15 @@ AS Files,sum(JobBytes) As Bytes FROM Job");
 #endif
 
 void
-db_list_files_for_job(JCR *jcr, B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
+db_list_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
 {
+   char ed1[50];
    db_lock(mdb);
 
-   Mmsg(&mdb->cmd, "SELECT " FN " AS Filename FROM File,"
-"Filename,Path WHERE File.JobId=%u AND Filename.FilenameId=File.FilenameId "
+   Mmsg(mdb->cmd, "SELECT " FN " AS Filename FROM File,"
+"Filename,Path WHERE File.JobId=%s AND Filename.FilenameId=File.FilenameId "
 "AND Path.PathId=File.PathId",
-      jobid);
+      edit_int64(jobid, ed1));
 
    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
       db_unlock(mdb);
@@ -326,10 +345,10 @@ db_list_files_for_job(JCR *jcr, B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *send
    }
 
    list_result(jcr, mdb, sendit, ctx, HORZ_LIST);
-   
+
    sql_free_result(mdb);
    db_unlock(mdb);
 }
 
 
-#endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */
+#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/