From: Eric Bollengier Date: Mon, 31 Aug 2009 12:33:51 +0000 (+0200) Subject: Merge branch 'master' into basejobv3 X-Git-Tag: Release-5.0.0~325 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=94ed37ea6172925acc34a97105065bb34bfc614d;p=bacula%2Fbacula Merge branch 'master' into basejobv3 Conflicts: bacula/src/cats/protos.h bacula/src/cats/sql_get.c bacula/src/dird/backup.c --- 94ed37ea6172925acc34a97105065bb34bfc614d diff --cc bacula/src/cats/protos.h index efb4abc67a,3c128e20a1..2b063f69c4 --- a/bacula/src/cats/protos.h +++ b/bacula/src/cats/protos.h @@@ -109,10 -110,7 +110,8 @@@ int db_get_client_record(JCR *jcr, B_D int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr); bool db_get_query_dbids(JCR *jcr, B_DB *mdb, POOL_MEM &query, dbid_list &ids); bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids, DB_RESULT_HANDLER *result_handler, void *ctx); +bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid); - bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, JOB_DBR *jr, POOLMEM *jobids); - int db_get_int_handler(void *ctx, int num_fields, char **row); - + bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, JOB_DBR *jr, db_list_ctx *jobids); /* sql_list.c */ enum e_list_type { diff --cc bacula/src/dird/backup.c index 3fa560aa6a,80f11ab108..dd7d1fc59d --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@@ -172,76 -131,39 +172,70 @@@ static int accurate_list_handler(void * bool send_accurate_current_files(JCR *jcr) { POOL_MEM buf; + bool ret=true; + db_list_ctx jobids; + db_list_ctx nb; - if (!jcr->accurate || job_canceled(jcr) || jcr->get_JobLevel()==L_FULL) { + if (!jcr->accurate || job_canceled(jcr)) { + return true; + } + /* In base level, no previous job is used */ + if (jcr->get_JobLevel() == L_BASE) { return true; } - db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, &jobids); - POOLMEM *nb = get_pool_memory(PM_FNAME); - POOLMEM *jobids = get_pool_memory(PM_FNAME); - nb[0] = jobids[0] = '\0'; - - if (jobids.count == 0) { - Jmsg(jcr, M_FATAL, 0, _("Cannot find previous jobids.\n")); - return false; + if (jcr->get_JobLevel() == L_FULL) { + /* On Full mode, if no previous base job, no accurate things */ + if (!get_base_jobids(jcr, jobids)) { + goto bail_out; + } + jcr->HasBase = true; + Jmsg(jcr, M_INFO, 0, _("Using BaseJobId(s): %s\n"), jobids); + + } else { + /* For Incr/Diff level, we search for older jobs */ + db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, jobids); + + /* We are in Incr/Diff, but no Full to build the accurate list... */ + if (*jobids == 0) { + ret=false; + Jmsg(jcr, M_FATAL, 0, _("Cannot find previous jobids.\n")); + goto bail_out; + } } + if (jcr->JobId) { /* display the message only for real jobs */ Jmsg(jcr, M_INFO, 0, _("Sending Accurate information.\n")); } + /* to be able to allocate the right size for htable */ - Mmsg(buf, "SELECT sum(JobFiles) FROM Job WHERE JobId IN (%s)",jobids); - db_sql_query(jcr->db, buf.c_str(), db_get_int_handler, nb); - Dmsg2(0, "jobids=%s nb=%s\n", jobids, nb); - jcr->file_bsock->fsend("accurate files=%s\n", nb); + Mmsg(buf, "SELECT sum(JobFiles) FROM Job WHERE JobId IN (%s)", jobids.list); + db_sql_query(jcr->db, buf.c_str(), db_list_handler, &nb); + Dmsg2(200, "jobids=%s nb=%s\n", jobids.list, nb.list); + jcr->file_bsock->fsend("accurate files=%s\n", nb.list); if (!db_open_batch_connexion(jcr, jcr->db)) { - ret = false; - Jmsg0(jcr, M_FATAL, 0, "Can't get dedicate sql connexion"); - goto bail_out; + Jmsg0(jcr, M_FATAL, 0, "Can't get batch sql connexion"); + return false; } + + if (jcr->HasBase) { + jcr->nb_base_files = str_to_int64(nb); + db_create_base_file_list(jcr, jcr->db, jobids); + db_get_base_file_list(jcr, jcr->db, + accurate_list_handler, (void *)jcr); - db_get_file_list(jcr, jcr->db_batch, jobids.list, accurate_list_handler, (void *)jcr); + } else { + db_get_file_list(jcr, jcr->db_batch, jobids, + accurate_list_handler, (void *)jcr); + } /* TODO: close the batch connexion ? (can be used very soon) */ jcr->file_bsock->signal(BNET_EOD); - return true; +bail_out: - free_pool_memory(jobids); - free_pool_memory(nb); - + return ret; } /*