/*
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
*/
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");
}
}
{
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;
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;
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;
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();
/*
*/
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 "
") 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 "
") 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;
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)
{