int bdb_get_client_record(JCR *jcr, CLIENT_DBR *cr);
bool bdb_get_jobmedia_record(JCR *jcr, JOBMEDIA_DBR *jmr);
bool bdb_get_job_record(JCR *jcr, JOB_DBR *jr);
- int bdb_get_job_volume_names(JCR *jcr, JobId_t JobId, POOLMEM **VolumeNames);
+ int bdb_get_job_volume_names(JCR *jcr, JobId_t JobId, POOLMEM **VolumeNames,
+ char *LastVolumeName, int maxlen);
bool bdb_get_file_attributes_record(JCR *jcr, char *fname, JOB_DBR *jr, FILE_DBR *fdbr);
int bdb_get_fileset_record(JCR *jcr, FILESET_DBR *fsr);
bool bdb_get_media_record(JCR *jcr, MEDIA_DBR *mr);
mdb->bdb_get_jobmedia_record(jcr, jmr)
#define db_get_job_record(jcr, mdb, jr) \
mdb->bdb_get_job_record(jcr, jr)
-#define db_get_job_volume_names(jcr, mdb, JobId, VolumeNames) \
- mdb->bdb_get_job_volume_names(jcr, JobId, VolumeNames)
+#define db_get_job_volume_names(jcr, mdb, JobId, VolumeNames, LastVolumeName, maxlen) \
+ mdb->bdb_get_job_volume_names(jcr, JobId, VolumeNames, LastVolumeName, maxlen)
#define db_get_file_attributes_record(jcr, mdb, fname, jr, fdbr) \
mdb->bdb_get_file_attributes_record(jcr, fname, jr, fdbr)
#define db_get_fileset_record(jcr, mdb, fsr) \
*
* Returns: number of volumes on success
*/
-int BDB::bdb_get_job_volume_names(JCR *jcr, JobId_t JobId, POOLMEM **VolumeNames)
+int BDB::bdb_get_job_volume_names(JCR *jcr, JobId_t JobId, POOLMEM **VolumeNames,
+ char *LastVolumeName, int maxlen)
{
SQL_ROW row;
char ed1[50];
"ORDER BY 2 ASC", edit_int64(JobId,ed1));
Dmsg1(130, "VolNam=%s\n", cmd);
- *VolumeNames[0] = 0;
+ *VolumeNames[0] = '\0';
+ if (LastVolumeName != NULL && maxlen>0) {
+ LastVolumeName[0] = '\0';
+ }
if (QueryDB(jcr, cmd)) {
Dmsg1(130, "Num rows=%d\n", sql_num_rows());
if (sql_num_rows() <= 0) {
pm_strcat(VolumeNames, row[0]);
}
}
+ if (LastVolumeName != NULL && stat > 0) {
+ bstrncat(LastVolumeName, row[0], maxlen); /* remember the last written volume */
+ }
}
sql_free_result();
} else {
bstrftimes_na(schedt, sizeof(schedt), jcr->jr.SchedTime);
bstrftimes_na(sdt, sizeof(sdt), jcr->jr.StartTime);
bstrftimes_na(edt, sizeof(edt), jcr->jr.EndTime);
- if (!db_get_job_volume_names(jcr, jcr->db, jcr->jr.JobId, &jcr->VolumeName)) {
+ if (!db_get_job_volume_names(jcr, jcr->db, jcr->jr.JobId, &jcr->VolumeName, NULL, 0)) {
/*
* Note, if the job has erred, most likely it did not write any
* tape, so suppress this "error" message since in that case
update_bootstrap_file(wjcr);
- if (!db_get_job_volume_names(wjcr, wjcr->db, wjcr->jr.JobId, &wjcr->VolumeName)) {
+ if (!db_get_job_volume_names(wjcr, wjcr->db, wjcr->jr.JobId, &wjcr->VolumeName,
+ mr.VolumeName, sizeof(mr.VolumeName))) {
/*
* Note, if the job has failed, most likely it did not write any
* tape, so suppress this "error" message since in that case
Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(wjcr->db));
}
wjcr->VolumeName[0] = 0; /* none */
- }
-
- if (wjcr->VolumeName[0]) {
- /* Find last volume name. Multiple vols are separated by | */
- char *p = strrchr(wjcr->VolumeName, '|');
- if (p) {
- p++; /* skip | */
- } else {
- p = wjcr->VolumeName; /* no |, take full name */
- }
- bstrncpy(mr.VolumeName, p, sizeof(mr.VolumeName));
+ } else {
+ /* retrieve the last volume record for the "Last Volume Bytes" */
if (!db_get_media_record(jcr, jcr->db, &mr)) {
Jmsg(jcr, M_WARNING, 0, _("Error getting Media record for Volume \"%s\": ERR=%s"),
mr.VolumeName, db_strerror(jcr->db));
continue;
}
VolumeName = get_pool_memory(PM_FNAME);
- n = db_get_job_volume_names(ua->jcr, ua->db, jobid, &VolumeName);
+ n = db_get_job_volume_names(ua->jcr, ua->db, jobid, &VolumeName, NULL, 0);
ua->send_msg(_("Jobid %d used %d Volume(s): %s\n"), jobid, n, VolumeName);
free_pool_memory(VolumeName);
done = true;
db_strerror(jcr->db));
}
- bstrncpy(mr.VolumeName, jcr->VolumeName, sizeof(mr.VolumeName));
- if (!db_get_media_record(jcr, jcr->db, &mr)) {
- Jmsg(jcr, M_WARNING, 0, _("Error getting Media record for Volume \"%s\": ERR=%s"),
- mr.VolumeName, db_strerror(jcr->db));
- jcr->setJobStatus(JS_ErrorTerminated);
- }
-
update_bootstrap_file(jcr);
switch (jcr->JobStatus) {
bstrftimes(schedt, sizeof(schedt), jcr->jr.SchedTime);
bstrftimes(sdt, sizeof(sdt), jcr->jr.StartTime);
bstrftimes(edt, sizeof(edt), jcr->jr.EndTime);
- if (!db_get_job_volume_names(jcr, jcr->db, jcr->jr.JobId, &jcr->VolumeName)) {
+ if (!db_get_job_volume_names(jcr, jcr->db, jcr->jr.JobId, &jcr->VolumeName,
+ mr.VolumeName, sizeof(mr.VolumeName))) {
/*
* Note, if the job has erred, most likely it did not write any
* tape, so suppress this "error" message since in that case
Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
}
jcr->VolumeName[0] = 0; /* none */
+ } else {
+ if (!db_get_media_record(jcr, jcr->db, &mr)) {
+ Jmsg(jcr, M_WARNING, 0, _("Error getting Media record for Volume \"%s\": ERR=%s"),
+ mr.VolumeName, db_strerror(jcr->db));
+ jcr->setJobStatus(JS_ErrorTerminated);
+ }
}
jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));