+ int JobLevel;
+ bool have_full;
+ bool do_full = false;
+ bool do_diff = false;
+ time_t now;
+ utime_t full_time;
+ utime_t diff_time;
+
+ since[0] = 0;
+ /* If job cloned and a since time already given, use it */
+ if (jcr->cloned && jcr->stime && jcr->stime[0]) {
+ bstrncpy(since, _(", since="), since_len);
+ bstrncat(since, jcr->stime, since_len);
+ return;
+ }
+ /* Make sure stime buffer is allocated */
+ if (!jcr->stime) {
+ jcr->stime = get_pool_memory(PM_MESSAGE);
+ }
+ jcr->stime[0] = 0;
+ /*
+ * Lookup the last FULL backup job to get the time/date for a
+ * differential or incremental save.
+ */
+ switch (jcr->JobLevel) {
+ case L_DIFFERENTIAL:
+ case L_INCREMENTAL:
+ POOLMEM *stime = get_pool_memory(PM_MESSAGE);
+ /* Look up start time of last Full job */
+ now = time(NULL);
+ jcr->jr.JobId = 0; /* flag to return since time */
+ have_full = db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime);
+ /* If there was a successful job, make sure it is recent enough */
+ if (jcr->JobLevel == L_INCREMENTAL && have_full && jcr->job->MaxDiffInterval > 0) {
+ /* Lookup last diff job */
+ if (db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_DIFFERENTIAL)) {
+ diff_time = str_to_utime(stime);
+ do_diff = ((now - diff_time) <= jcr->job->MaxDiffInterval);
+ }
+ }
+ if (have_full && jcr->job->MaxFullInterval > 0 &&
+ db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL)) {
+ full_time = str_to_utime(stime);
+ do_full = ((now - full_time) <= jcr->job->MaxFullInterval);
+ }
+ free_pool_memory(stime);
+
+ if (!have_full || do_full) {
+ /* No recent Full job found, so upgrade this one to Full */
+ Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db));
+ Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found in catalog. Doing FULL backup.\n"));
+ bsnprintf(since, since_len, _(" (upgraded from %s)"),
+ level_to_str(jcr->JobLevel));
+ jcr->JobLevel = jcr->jr.JobLevel = L_FULL;
+ } else if (do_diff) {
+ /* No recent diff job found, so upgrade this one to Full */
+ Jmsg(jcr, M_INFO, 0, _("No prior or suitable Differential backup found in catalog. Doing Differential backup.\n"));
+ bsnprintf(since, since_len, _(" (upgraded from %s)"),
+ level_to_str(jcr->JobLevel));
+ jcr->JobLevel = jcr->jr.JobLevel = L_DIFFERENTIAL;
+ } else {
+ if (jcr->job->rerun_failed_levels) {
+ if (db_find_failed_job_since(jcr, jcr->db, &jcr->jr, jcr->stime, JobLevel)) {
+ Jmsg(jcr, M_INFO, 0, _("Prior failed job found in catalog. Upgrading to %s.\n"),
+ level_to_str(JobLevel));
+ bsnprintf(since, since_len, _(" (upgraded from %s)"),
+ level_to_str(jcr->JobLevel));
+ jcr->JobLevel = jcr->jr.JobLevel = JobLevel;
+ jcr->jr.JobId = jcr->JobId;
+ break;
+ }
+ }
+ bstrncpy(since, _(", since="), since_len);
+ bstrncat(since, jcr->stime, since_len);
+ }
+ jcr->jr.JobId = jcr->JobId;
+ break;
+ }
+ Dmsg2(100, "Level=%c last start time=%s\n", jcr->JobLevel, jcr->stime);
+}