+ } else if (sscanf(bs->msg, Update_media, &Job, &sdmr.VolumeName,
+ &sdmr.VolJobs, &sdmr.VolFiles, &sdmr.VolBlocks, &sdmr.VolBytes,
+ &sdmr.VolMounts, &sdmr.VolErrors, &sdmr.VolWrites, &sdmr.MaxVolBytes,
+ &VolLastWritten, &sdmr.VolStatus, &sdmr.Slot, &label, &sdmr.InChanger,
+ &sdmr.VolReadTime, &sdmr.VolWriteTime, &VolFirstWritten,
+ &sdmr.VolParts) == 19) {
+
+ db_lock(jcr->db);
+ Dmsg3(400, "Update media %s oldStat=%s newStat=%s\n", sdmr.VolumeName,
+ mr.VolStatus, sdmr.VolStatus);
+ bstrncpy(mr.VolumeName, sdmr.VolumeName, sizeof(mr.VolumeName)); /* copy Volume name */
+ unbash_spaces(mr.VolumeName);
+ if (!db_get_media_record(jcr, jcr->db, &mr)) {
+ Jmsg(jcr, M_ERROR, 0, _("Unable to get Media record for Volume %s: ERR=%s\n"),
+ mr.VolumeName, db_strerror(jcr->db));
+ bs->fsend(_("1991 Catalog Request for vol=%s failed: %s"),
+ mr.VolumeName, db_strerror(jcr->db));
+ db_unlock(jcr->db);
+ return;
+ }
+ /* Set first written time if this is first job */
+ if (mr.FirstWritten == 0) {
+ if (VolFirstWritten == 0) {
+ mr.FirstWritten = jcr->start_time; /* use Job start time as first write */
+ } else {
+ mr.FirstWritten = VolFirstWritten;
+ }
+ mr.set_first_written = true;
+ }
+ /* If we just labeled the tape set time */
+ if (label || mr.LabelDate == 0) {
+ mr.LabelDate = jcr->start_time;
+ mr.set_label_date = true;
+ if (mr.InitialWrite == 0) {
+ mr.InitialWrite = jcr->start_time;
+ }
+ Dmsg2(400, "label=%d labeldate=%d\n", label, mr.LabelDate);
+ } else {
+ /*
+ * Insanity check for VolFiles get set to a smaller value
+ */
+ if (sdmr.VolFiles < mr.VolFiles) {
+ Jmsg(jcr, M_FATAL, 0, _("Volume Files at %u being set to %u"
+ " for Volume \"%s\". This is incorrect.\n"),
+ mr.VolFiles, sdmr.VolFiles, mr.VolumeName);
+ bs->fsend(_("1992 Update Media error. VolFiles=%u, CatFiles=%u\n"),
+ sdmr.VolFiles, mr.VolFiles);
+ db_unlock(jcr->db);
+ return;
+ }
+ }
+ Dmsg2(400, "Update media: BefVolJobs=%u After=%u\n", mr.VolJobs, sdmr.VolJobs);
+
+ /*
+ * Check if the volume has been written by the job,
+ * and update the LastWritten field if needed.
+ */
+ if (mr.VolBlocks != sdmr.VolBlocks && VolLastWritten != 0) {
+ mr.LastWritten = VolLastWritten;
+ }