Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ Bacula® is a registered trademark of Kern Sibbald.
The licensor of Bacula is the Free Software Foundation Europe
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
bool have_full;
bool do_full = false;
bool do_diff = false;
- time_t now;
- utime_t full_time, diff_time;
+ utime_t now;
+ utime_t last_full_time;
+ utime_t last_diff_time;
since[0] = 0;
/* If job cloned and a since time already given, use it */
* Lookup the last FULL backup job to get the time/date for a
* differential or incremental save.
*/
- switch (jcr->JobLevel) {
+ switch (jcr->get_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 for db_find_job_start time */
+ now = (utime_t)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);
-#ifdef xxx
/* If there was a successful job, make sure it is recent enough */
- if (jcr->JobLevel == L_INCREMENTAL && have_full && jcr->job->MaxDiffInterval > 0) {
+ if (jcr->get_JobLevel() == L_INCREMENTAL && have_full && jcr->job->MaxDiffInterval > 0) {
/* Lookup last diff job */
- jcr->jr.JobId = 0;
- /* ***FIXME*** must find diff start time and not destroy jcr->stime */
- if (db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime)) {
- diff_time = str_to_utime(jcr->stime);
- do_diff = ((now - diff_time) <= jcr->job->MaxDiffInterval);
+ if (db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_DIFFERENTIAL)) {
+ last_diff_time = str_to_utime(stime);
+ do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval);
}
}
-#endif
- if (have_full && jcr->job->MaxFullInterval > 0) {
- full_time = str_to_utime(jcr->stime);
- do_full = ((now - full_time) <= jcr->job->MaxFullInterval);
+ if (have_full && jcr->job->MaxFullInterval > 0 &&
+ db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL)) {
+ last_full_time = str_to_utime(stime);
+ do_full = ((now - last_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;
+ level_to_str(jcr->get_JobLevel()));
+ jcr->set_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;
+ level_to_str(jcr->get_JobLevel()));
+ jcr->set_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;
+ level_to_str(jcr->get_JobLevel()));
+ jcr->set_JobLevel(jcr->jr.JobLevel = JobLevel);
jcr->jr.JobId = jcr->JobId;
break;
}
jcr->jr.JobId = jcr->JobId;
break;
}
- Dmsg2(100, "Level=%c last start time=%s\n", jcr->JobLevel, jcr->stime);
+ Dmsg2(100, "Level=%c last start time=%s\n", jcr->get_JobLevel(), jcr->stime);
}
static void send_since_time(JCR *jcr)
bool send_level_command(JCR *jcr)
{
BSOCK *fd = jcr->file_bsock;
- const char *accurate=jcr->job->accurate?"accurate_":"";
- const char *not_accurate="";
+ const char *accurate = jcr->job->accurate?"accurate_":"";
+ const char *not_accurate = "";
/*
* Send Level command to File daemon
*/
- switch (jcr->JobLevel) {
+ switch (jcr->get_JobLevel()) {
case L_BASE:
fd->fsend(levelcmd, not_accurate, "base", " ", 0);
break;
case L_SINCE:
default:
Jmsg2(jcr, M_FATAL, 0, _("Unimplemented backup level %d %c\n"),
- jcr->JobLevel, jcr->JobLevel);
+ jcr->get_JobLevel(), jcr->get_JobLevel());
return 0;
}
Dmsg1(120, ">filed: %s", fd->msg);
if (fo->plugin) {
fd->fsend("G %s\n", fo->plugin);
}
+ if (fo->ignoredir) {
+ bnet_fsend(fd, "Z %s\n", fo->ignoredir);
+ }
if (fo->reader) {
fd->fsend("D %s\n", fo->reader);
}
Dmsg0(120, "bdird: sending runscripts to fd\n");
foreach_alist(cmd, jcr->job->RunScripts) {
- if (cmd->can_run_at_level(jcr->JobLevel) && cmd->target) {
+ if (cmd->can_run_at_level(jcr->get_JobLevel()) && cmd->target) {
ehost = edit_job_codes(jcr, ehost, cmd->target, "");
Dmsg2(200, "bdird: runscript %s -> %s\n", cmd->target, ehost);
char *p, *fn;
char Digest[MAXSTRING]; /* either Verify opts or MD5/SHA1 digest */
- jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
if ((len = sscanf(fd->msg, "%ld %d %s", &file_index, &stream, Digest)) != 3) {
Jmsg(jcr, M_FATAL, 0, _("<filed: bad attributes, expected 3 fields got %d\n"
"msglen=%d msg=%s\n"), len, fd->msglen, fd->msg);
}
}
/* Any cached attr is flushed so we can reuse jcr->attr and jcr->ar */
- fn = jcr->fname;
+ fn = jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
while (*p != 0) {
*fn++ = *p++; /* copy filename */
}