+/*
+ * Foreach files in currrent list, send "/path/fname\0LStat" to FD
+ */
+static int accurate_list_handler(void *ctx, int num_fields, char **row)
+{
+ JCR *jcr = (JCR *)ctx;
+
+ if (job_canceled(jcr)) {
+ return 1;
+ }
+
+ if (row[2] > 0) { /* discard when file_index == 0 */
+ jcr->file_bsock->fsend("%s%s%c%s", row[0], row[1], 0, row[4]);
+ }
+ return 0;
+}
+
+/*
+ * Send current file list to FD
+ * DIR -> FD : accurate files=xxxx
+ * DIR -> FD : /path/to/file\0Lstat
+ * DIR -> FD : /path/to/dir/\0Lstat
+ * ...
+ * DIR -> FD : EOD
+ */
+bool send_accurate_current_files(JCR *jcr)
+{
+ POOL_MEM buf;
+
+ if (!jcr->accurate || job_canceled(jcr) || jcr->get_JobLevel()==L_FULL) {
+ return true;
+ }
+ POOLMEM *jobids = get_pool_memory(PM_FNAME);
+
+ db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, jobids);
+
+ if (*jobids == 0) {
+ free_pool_memory(jobids);
+ Jmsg(jcr, M_FATAL, 0, _("Cannot find previous jobids.\n"));
+ return false;
+ }
+ 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 */
+ POOLMEM *nb = get_pool_memory(PM_FNAME);
+ *nb = 0; /* clear buffer */
+ 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(200, "jobids=%s nb=%s\n", jobids, nb);
+ jcr->file_bsock->fsend("accurate files=%s\n", nb);
+
+ if (!db_open_batch_connexion(jcr, jcr->db)) {
+ Jmsg0(jcr, M_FATAL, 0, "Can't get dedicate sql connexion");
+ return false;
+ }
+
+ db_get_file_list(jcr, jcr->db_batch, jobids, accurate_list_handler, (void *)jcr);
+
+ /* TODO: close the batch connexion ? (can be used very soon) */
+
+ free_pool_memory(jobids);
+ free_pool_memory(nb);
+
+ jcr->file_bsock->signal(BNET_EOD);
+
+ return true;
+}
+