time_t StartTime; /* Job start time */
time_t EndTime; /* Job termination time of orig job */
time_t RealEndTime; /* Job termination time of this job */
+ time_t RealStartTime; /* Job start time of this job (even VirtualFull) */
utime_t JobTDate; /* Backup time/date in seconds */
uint32_t VolSessionId;
uint32_t VolSessionTime;
char cStartTime[MAX_TIME_LENGTH];
char cEndTime[MAX_TIME_LENGTH];
char cRealEndTime[MAX_TIME_LENGTH];
+ char cRealStartTime[MAX_TIME_LENGTH];
/* Extra stuff not in DB */
int order; /* 0 ASC, 1 DESC */
int limit; /* limit records to display */
const char *fill_jobhisto =
"INSERT INTO JobHisto (JobId, Job, Name, Type, Level,"
"ClientId, JobStatus,"
- "SchedTime, StartTime, EndTime, RealEndTime, JobTDate,"
+ "SchedTime, StartTime, EndTime, RealEndTime, RealStartTime, JobTDate,"
"VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes,"
"JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, PriorJob, "
- "PurgedFiles, HasBase, HasCache, Reviewed, Comment, FileTable)"
+ "PurgedFiles, HasBase, HasCache, Reviewed, Comment, FileTable, "
+ "isVirtualFull,CompressRatio,Rate,LastReadStorageId,WriteStorageId,ReadDevice,WriteDevice,StatusInfo)"
"SELECT JobId, Job, Name, Type, Level, ClientId, JobStatus,"
- "SchedTime, StartTime, EndTime, RealEndTime, JobTDate,"
+ "SchedTime, StartTime, EndTime, RealEndTime, RealStartTime, JobTDate,"
"VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes,"
"JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, PriorJob, "
- "PurgedFiles, HasBase, HasCache, Reviewed, Comment, FileTable "
+ "PurgedFiles, HasBase, HasCache, Reviewed, Comment, FileTable, "
+ "isVirtualFull,CompressRatio,Rate,LastReadStorageId,WriteStorageId,ReadDevice,WriteDevice,StatusInfo"
"FROM Job "
"WHERE JobStatus IN ('T','W','f','A','E')"
"AND NOT EXISTS "
/* Must create it */
Mmsg(cmd,
"INSERT INTO Job (Job,Name,Type,Level,JobStatus,StartTime,SchedTime,JobTDate,"
- "ClientId,Comment) "
-"VALUES ('%s','%s','%c','%c','%c','%s','%s',%s,%s,'%s')",
+ "ClientId,Comment,isVirtualFull) "
+"VALUES ('%s','%s','%c','%c','%c','%s','%s',%s,%s,'%s',%d)",
esc_job, esc_name, (char)(jr->JobType), (char)(jr->JobLevel),
(char)(jr->JobStatus), dt2, dt, edit_uint64(JobTDate, ed1),
- edit_int64(jr->ClientId, ed2), buf.c_str());
+ edit_int64(jr->ClientId, ed2), buf.c_str(), jr->isVirtualFull);
if ((jr->JobId = sql_insert_autokey_record(cmd, NT_("Job"))) == 0) {
Mmsg2(&errmsg, _("Create DB Job record %s failed. ERR=%s\n"),
Mmsg(cmd, "SELECT VolSessionId,VolSessionTime,"
"PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
"Type,Level,ClientId,Job.Name,PriorJobId,RealEndTime,JobId,FileSetId,"
-"SchedTime,ReadBytes,HasBase,PurgedFiles,PriorJob,Comment,"
-"Reviewed, Client.Name AS Client "
-"FROM Job JOIN Client USING (ClientId) WHERE Job='%s'", esc);
+"SchedTime,RealStartTime,ReadBytes,HasBase,PurgedFiles,PriorJob,Comment,Reviewed,Client.Name AS Client,isVirtualFull,WriteStorageId,LastReadstorageId "
+"FROM Job WHERE Job='%s'", esc);
} else if (jr->PriorJob[0]) {
bdb_escape_string(jcr, esc, jr->PriorJob, strlen(jr->PriorJob));
Mmsg(cmd, "SELECT VolSessionId,VolSessionTime,"
"PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
-"Type,Level,ClientId,Job.Name AS Name,PriorJobId,RealEndTime,JobId,FileSetId,"
-"SchedTime,ReadBytes,HasBase,PurgedFiles,PriorJob,Comment,"
-"Reviewed, Client.Name AS Client "
-"FROM Job JOIN CLient USING (ClientId) WHERE PriorJob='%s' ORDER BY Type ASC LIMIT 1", esc);
+"Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId,"
+"SchedTime,RealStartTime,ReadBytes,HasBase,PurgedFiles,PriorJob,Comment,Reviewed,Client.Name AS Client,isVirtualFull,WriteStorageId,LastReadstorageId "
+"FROM Job WHERE PriorJob='%s' ORDER BY Type ASC LIMIT 1", esc);
} else {
Mmsg0(errmsg, _("No Job found\n"));
bdb_unlock();
Mmsg(cmd, "SELECT VolSessionId,VolSessionTime,"
// 2 3 4 5 6 7 8 9
"PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
-// 10 11 12 13 14 15 16 17
-"Type,Level,ClientId,Job.Name AS Name,PriorJobId,RealEndTime,JobId,FileSetId,"
-// 18 19 20 21 22 23
-"SchedTime,ReadBytes,HasBase,PurgedFiles,PriorJob,Comment,"
-// 24 25
-"Reviewed, Client.Name AS Client "
-"FROM Job JOIN Client USING (ClientId) WHERE JobId=%s",
+// 10 11 12 13 14 15 16 17
+"Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId,"
+// 18 19 20 21 22 23 24 25 26
+"SchedTime,RealStartTime,ReadBytes,HasBase,PurgedFiles,PriorJob,Comment,Reviewed,Client.Name AS Client,"
+// 27 28 29 30 31 32
+"isVirtualFull,WriteStorageId,LastReadStorageId,StatusInfo,LastReadDevice,WriteDevice "
+"FROM Job WHERE JobId=%s",
edit_int64(jr->JobId, ed1));
}
}
jr->FileSetId = str_to_int64(row[17]);
bstrncpy(jr->cSchedTime, row[18]!=NULL?row[18]:"", sizeof(jr->cSchedTime));
- jr->ReadBytes = str_to_int64(row[19]);
+ bstrncpy(jr->cRealStartTime, row[19]!=NULL?row[19]:"", sizeof(jr->cRealStartTime));
+ jr->ReadBytes = str_to_int64(row[20]);
jr->StartTime = str_to_utime(jr->cStartTime);
jr->SchedTime = str_to_utime(jr->cSchedTime);
jr->EndTime = str_to_utime(jr->cEndTime);
jr->RealEndTime = str_to_utime(jr->cRealEndTime);
- jr->HasBase = str_to_int64(row[20]);
- jr->PurgedFiles = str_to_int64(row[21]);
- bstrncpy(jr->PriorJob, NPRTB(row[22]), sizeof(jr->PriorJob));
- bstrncpy(jr->Comment, NPRTB(row[23]), sizeof(jr->Comment));
- jr->Reviewed = str_to_int64(row[24]);
- bstrncpy(jr->Client, NPRTB(row[25]), sizeof(jr->Client));
+ jr->RealStartTime = str_to_utime(jr->cRealStartTime);
+ jr->HasBase = str_to_int64(row[21]);
+ jr->PurgedFiles = str_to_int64(row[22]);
+ bstrncpy(jr->PriorJob, NPRTB(row[23]), sizeof(jr->PriorJob));
+ bstrncpy(jr->Comment, NPRTB(row[24]), sizeof(jr->Comment));
+ jr->Reviewed = str_to_int64(row[25]);
+ bstrncpy(jr->Client, NPRTB(row[26]), sizeof(jr->Client));
+ jr->isVirtualFull = str_to_int64(row[27]);
+ jr->WriteStorageId = str_to_int64(row[28]);
+ jr->LastReadStorageId = str_to_int64(row[29]);
+ bstrncpy(jr->StatusInfo, NPRTB(row[30]), sizeof(jr->StatusInfo));
+ bstrncpy(jr->LastReadDevice, NPRTB(row[31]), sizeof(jr->LastReadDevice));
+ bstrncpy(jr->WriteDevice, NPRTB(row[32]), sizeof(jr->WriteDevice));
sql_free_result();
bdb_unlock();
} else if (jr->Reviewed > 0) {
Mmsg(tmp, " Job.Reviewed = %d ", jr->Reviewed);
append_filter(&where, tmp);
+
+ } else if (jr->isVirtualFull > 0) {
+ Mmsg(tmp, " Job.isVirtualFull = %d ", jr->isVirtualFull);
+ append_filter(&where, tmp);
}
if (type == INCOMPLETE_JOBS && jr->JobStatus == JS_FatalError) {
append_filter(&where, tmp);
}
+ if (jr->isVirtualFull > 0) {
+ Mmsg(tmp, " Job.isVirtualFull=%s ", edit_int64(jr->isVirtualFull, ed1));
+ append_filter(&where, tmp);
+ }
+
where_tmp = get_acls(DB_ACL_BIT(DB_ACL_CLIENT) |
DB_ACL_BIT(DB_ACL_JOB) |
DB_ACL_BIT(DB_ACL_FILESET),
Mmsg(cmd,
"SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
"Job.ClientId,Client.Name as ClientName,JobStatus,Status.JobStatusLong,SchedTime,"
- "StartTime,EndTime,RealEndTime,JobTDate,"
+ "StartTime,EndTime,RealEndTime,RealStartTime,JobTDate,"
"VolSessionId,VolSessionTime,JobFiles,JobBytes,ReadBytes,JobErrors,"
- "JobMissingFiles,Job.PoolId,Pool.Name as PoolName,PriorJobId,"
- "Job.FileSetId,FileSet.FileSet,Job.HasCache,Comment,Reviewed "
+ "JobMissingFiles,Job.PoolId,Pool.Name as PoolName,PriorJobId,PriorJob,"
+ "Job.FileSetId,FileSet.FileSet,Job.HasCache,Comment,Reviewed,isVirtualFull,Rate,CompressRatio,StatusInfo, "
+ "SW.Name AS WriteStorage, WriteDevice, SR.Name AS LastReadStorage, LastReadDevice "
"FROM Job JOIN Client USING (ClientId) LEFT JOIN Pool USING (PoolId) "
- "LEFT JOIN FileSet USING (FileSetId) LEFT JOIN Status USING (JobStatus) %s "
+ "LEFT JOIN FileSet USING (FileSetId) LEFT JOIN Status USING (JobStatus) "
+ "LEFT JOIN Storage AS SW ON (SW.StorageId = Job.WriteStorageId) LEFT JOIN Storage AS SR ON (SR.StorageId = Job.LastReadStorageId) %s "
"ORDER BY StartTime %s %s", where, order, limit);
break;
case HORZ_LIST:
{
char dt[MAX_TIME_LENGTH];
char rdt[MAX_TIME_LENGTH];
+ char esc1[MAX_ESCAPE_NAME_LENGTH];
+ char esc2[MAX_ESCAPE_UNAME_LENGTH];
+ char esc3[MAX_ESCAPE_UNAME_LENGTH];
time_t ttime;
struct tm tm;
int stat;
- char ed1[30], ed2[30], ed3[50], ed4[50];
+ char ed1[30], ed2[30], ed3[50], ed4[50], ed5[50], ed6[50];
btime_t JobTDate;
char PriorJobId[50];
JobTDate = ttime;
bdb_lock();
+ bdb_escape_string(jcr, esc1, jr->StatusInfo, strlen(jr->StatusInfo));
+ bdb_escape_string(jcr, esc2, jr->LastReadDevice, strlen(jr->LastReadDevice));
+ bdb_escape_string(jcr, esc3, jr->WriteDevice, strlen(jr->WriteDevice));
Mmsg(cmd,
"UPDATE Job SET JobStatus='%c',EndTime='%s',"
"ClientId=%u,JobBytes=%s,ReadBytes=%s,JobFiles=%u,JobErrors=%u,VolSessionId=%u,"
"VolSessionTime=%u,PoolId=%u,FileSetId=%u,JobTDate=%s,"
-"RealEndTime='%s',PriorJobId=%s,HasBase=%u,PurgedFiles=%u,PriorJob='%s' WHERE JobId=%s",
+"RealEndTime='%s',PriorJobId=%s,HasBase=%u,PurgedFiles=%u,PriorJob='%s',"
+"Rate=%.1f,CompressRatio=%.1f,WriteStorageId=%s,LastReadStorageId=%s,StatusInfo='%s',LastReadDevice='%s',WriteDevice='%s' WHERE JobId=%s",
(char)(jr->JobStatus), dt, jr->ClientId, edit_uint64(jr->JobBytes, ed1),
edit_uint64(jr->ReadBytes, ed4),
jr->JobFiles, jr->JobErrors, jr->VolSessionId, jr->VolSessionTime,
jr->PoolId, jr->FileSetId, edit_uint64(JobTDate, ed2),
rdt, PriorJobId, jr->HasBase, jr->PurgedFiles, jr->PriorJob,
+ jr->Rate, jr->CompressRatio, edit_uint64(jr->WriteStorageId, ed5),
+ edit_uint64(jr->LastReadStorageId, ed6), esc1, esc2, esc3,
edit_int64(jr->JobId, ed3));
stat = UpdateDB(jcr, cmd, false);