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_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_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, db_list_ctx *jobids);
/* sql_list.c */
enum e_list_type {
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;
}
/*