<commit_before>Index: src/dird/backup.c
===================================================================
--- src/dird/backup.c	(revision 7339)
+++ src/dird/backup.c	(working copy)
@@ -133,6 +133,7 @@
       return true;
    }
    POOLMEM *jobids = get_pool_memory(PM_FNAME);
+
    db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, jobids);
 
    if (*jobids == 0) {
@@ -150,8 +151,14 @@
    Dmsg2(200, "jobids=%s nb=%s\n", jobids, nb);
    jcr->file_bsock->fsend("accurate files=%s\n", nb); 
 
-   db_get_file_list(jcr, jcr->db, jobids, accurate_list_handler, (void *)jcr);
+   if (!db_open_batch_connexion(jcr, jcr->db)) {
+      Mmsg1(&jcr->db->errmsg, "Can't start accurate mode");
+      Jmsg1(jcr, M_FATAL, 0, "%s", jcr->db->errmsg);
+      return false;
+   }
 
+   db_get_file_list(jcr, jcr->db_batch, jobids, accurate_list_handler, (void *)jcr);
+
    free_pool_memory(jobids);
    free_pool_memory(nb);
 
Index: src/cats/sql_create.c
===================================================================
--- src/cats/sql_create.c	(revision 7339)
+++ src/cats/sql_create.c	(working copy)
@@ -758,7 +758,7 @@
 {
    int JobStatus = jcr->JobStatus;
 
-   if (!jcr->db_batch) {         /* no files to backup ? */
+   if (!jcr->batch_started) {         /* no files to backup ? */
       Dmsg0(50,"db_create_file_record : no files\n");
       return true;
    }
@@ -831,20 +831,8 @@
    return true;
 }
 
-/*
- * Create File record in B_DB
- *
- *  In order to reduce database size, we store the File attributes,
- *  the FileName, and the Path separately.  In principle, there
- *  is a single FileName record and a single Path record, no matter
- *  how many times it occurs.  This is this subroutine, we separate
- *  the file and the path and fill temporary tables with this three records.
- */
-bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
+bool db_open_batch_connexion(JCR *jcr, B_DB *mdb)
 {
-   Dmsg1(dbglevel, "Fname=%s\n", ar->fname);
-   Dmsg0(dbglevel, "put_file_into_catalog\n");
-
    if (!jcr->db_batch) {
       Dmsg2(100, "Opendb attr. Stream=%d fname=%s\n", ar->Stream, ar->fname);
       jcr->db_batch = db_init_database(jcr, 
@@ -868,15 +856,42 @@
          Jmsg1(jcr, M_FATAL, 0, "%s", mdb->errmsg);
          return false;
       }      
-      
+      Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", jcr->db_batch->ref_count,
+            jcr->db_batch->connected, jcr->db_batch->db);
+
+   }
+   return true;
+}
+
+/*
+ * Create File record in B_DB
+ *
+ *  In order to reduce database size, we store the File attributes,
+ *  the FileName, and the Path separately.  In principle, there
+ *  is a single FileName record and a single Path record, no matter
+ *  how many times it occurs.  This is this subroutine, we separate
+ *  the file and the path and fill temporary tables with this three records.
+ */
+bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
+{
+   Dmsg1(dbglevel, "Fname=%s\n", ar->fname);
+   Dmsg0(dbglevel, "put_file_into_catalog\n");
+
+   if (!jcr->batch_started) {
+
+      if (!db_open_batch_connexion(jcr, mdb)) {
+         Mmsg1(&mdb->errmsg, 
+              "Can't start batch mode: ERR=%s", db_strerror(jcr->db_batch));
+         Jmsg1(jcr, M_FATAL, 0, "%s", mdb->errmsg);
+         return false;
+      }
       if (!sql_batch_start(jcr, jcr->db_batch)) {
          Mmsg1(&mdb->errmsg, 
               "Can't start batch mode: ERR=%s", db_strerror(jcr->db_batch));
          Jmsg1(jcr, M_FATAL, 0, "%s", mdb->errmsg);
          return false;
       }
-      Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", jcr->db_batch->ref_count,
-            jcr->db_batch->connected, jcr->db_batch->db);
+      jcr->batch_started = true;
    }
    B_DB *bdb = jcr->db_batch;
 <commit_msg>ebl  Update to use a separate db connexion to compute and      send accurate file list.<commit_after>Index: src/cats/sql.c
===================================================================
--- src/cats/sql.c	(rvision 7344)
+++ src/cats/sql.c	(copie de travail)
@@ -635,5 +635,43 @@
    return;
 }
 
+/* 
+ * Open a new connexion to mdb catalog. This function is used
+ * by batch and accurate mode.
+ */
+bool db_open_batch_connexion(JCR *jcr, B_DB *mdb)
+{
+   int multi_db=false;
 
+#ifdef HAVE_BATCH_FILE_INSERT
+   multi_db=true;		/* we force a new connexion only if batch insert is enabled */
+#endif
+
+   if (!jcr->db_batch) {
+      jcr->db_batch = db_init_database(jcr, 
+                                      mdb->db_name, 
+                                      mdb->db_user,
+                                      mdb->db_password, 
+                                      mdb->db_address,
+                                      mdb->db_port,
+                                      mdb->db_socket,
+                                      multi_db /* multi_db = true when using batch mode */);
+      if (!jcr->db_batch) {
+         Jmsg0(jcr, M_FATAL, 0, "Could not init batch connexion");
+         return false;
+      }
+
+      if (!db_open_database(jcr, jcr->db_batch)) {
+         Mmsg2(&jcr->db_batch->errmsg,  _("Could not open database \"%s\": ERR=%s\n"),
+              jcr->db_batch->db_name, db_strerror(jcr->db_batch));
+         Jmsg1(jcr, M_FATAL, 0, "%s", jcr->db_batch->errmsg);
+         return false;
+      }      
+      Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", jcr->db_batch->ref_count,
+            jcr->db_batch->connected, jcr->db_batch->db);
+
+   }
+   return true;
+}
+
 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/
Index: src/cats/protos.h
===================================================================
--- src/cats/protos.h	(rvision 7344)
+++ src/cats/protos.h	(copie de travail)
@@ -49,6 +49,7 @@
                        int mult_db_connections);
 int  db_open_database(JCR *jcr, B_DB *db);
 void db_close_database(JCR *jcr, B_DB *db);
+bool db_open_batch_connexion(JCR *jcr, B_DB *mdb);
 void db_escape_string(JCR *jcr, B_DB *db, char *snew, char *old, int len);
 char *db_strerror(B_DB *mdb);
 int  db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index);
Index: src/cats/sql_create.c
===================================================================
--- src/cats/sql_create.c	(rvision 7344)
+++ src/cats/sql_create.c	(copie de travail)
@@ -758,7 +758,7 @@
 {
    int JobStatus = jcr->JobStatus;
 
-   if (!jcr->db_batch) {         /* no files to backup ? */
+   if (!jcr->batch_started) {         /* no files to backup ? */
       Dmsg0(50,"db_create_file_record : no files\n");
       return true;
    }
@@ -845,38 +845,19 @@
    Dmsg1(dbglevel, "Fname=%s\n", ar->fname);
    Dmsg0(dbglevel, "put_file_into_catalog\n");
 
-   if (!jcr->db_batch) {
-      Dmsg2(100, "Opendb attr. Stream=%d fname=%s\n", ar->Stream, ar->fname);
-      jcr->db_batch = db_init_database(jcr, 
-                                      mdb->db_name, 
-                                      mdb->db_user,
-                                      mdb->db_password, 
-                                      mdb->db_address,
-                                      mdb->db_port,
-                                      mdb->db_socket,
-                                      1 /* multi_db = true */);
-      if (!jcr->db_batch) {
-         Mmsg1(&mdb->errmsg, _("Could not init batch database: \"%s\".\n"),
-                        jcr->db->db_name);
-         Jmsg1(jcr, M_FATAL, 0, "%s", mdb->errmsg);
-         return false;
-      }
+   /* Open the dedicated connexion */
+   if (!jcr->batch_started) {
 
-      if (!db_open_database(jcr, jcr->db_batch)) {
-         Mmsg2(&mdb->errmsg,  _("Could not open database \"%s\": ERR=%s\n"),
-              jcr->db->db_name, db_strerror(jcr->db_batch));
-         Jmsg1(jcr, M_FATAL, 0, "%s", mdb->errmsg);
+      if (!db_open_batch_connexion(jcr, mdb)) {
          return false;
-      }      
-      
+      }
       if (!sql_batch_start(jcr, jcr->db_batch)) {
          Mmsg1(&mdb->errmsg, 
               "Can't start batch mode: ERR=%s", db_strerror(jcr->db_batch));
          Jmsg1(jcr, M_FATAL, 0, "%s", mdb->errmsg);
          return false;
       }
-      Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", jcr->db_batch->ref_count,
-            jcr->db_batch->connected, jcr->db_batch->db);
+      jcr->batch_started = true;
    }
    B_DB *bdb = jcr->db_batch;
 
@@ -895,12 +876,12 @@
 
 
 /*
-   if (bdb->changes > 100000) {
-      db_write_batch_file_records(jcr);
-      bdb->changes = 0;
-      sql_batch_start(jcr, bdb);
-   }
-*/
+ * if (bdb->changes > 100000) {
+ *    db_write_batch_file_records(jcr);
+ *    bdb->changes = 0;
+ *     sql_batch_start(jcr, bdb);
+ * }
+ */
 
    return sql_batch_insert(jcr, bdb, ar);
 }
Index: src/jcr.h
===================================================================
--- src/jcr.h	(rvision 7344)
+++ src/jcr.h	(copie de travail)
@@ -226,7 +226,8 @@
    bool cached_attribute;             /* set if attribute is cached */
    POOLMEM *attr;                     /* Attribute string from SD */
    B_DB *db;                          /* database pointer */
-   B_DB *db_batch;                    /* database pointer for batch insert */
+   B_DB *db_batch;                    /* database pointer for batch and accurate */
+   bool batch_started;                /* is batch mode already started ? */
    ATTR_DBR *ar;                      /* DB attribute record */
    guid_list *id_list;                /* User/group id to name list */
    bool accurate;                     /* true if job is accurate */
 
Index: src/dird/backup.c
===================================================================
--- src/dird/backup.c	(rvision 7344)
+++ src/dird/backup.c	(copie de travail)
@@ -133,6 +133,7 @@
       return true;
    }
    POOLMEM *jobids = get_pool_memory(PM_FNAME);
+
    db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, jobids);
 
    if (*jobids == 0) {
@@ -150,13 +151,19 @@
    Dmsg2(200, "jobids=%s nb=%s\n", jobids, nb);
    jcr->file_bsock->fsend("accurate files=%s\n", nb); 
 
-   db_get_file_list(jcr, jcr->db, jobids, accurate_list_handler, (void *)jcr);
+   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);
-   /* TODO: use response() ? */
 
    return true;
 }
Index: src/dird/job.c
===================================================================
--- src/dird/job.c	(rvision 7344)
+++ src/dird/job.c	(copie de travail)
@@ -960,10 +960,10 @@
       pthread_cond_destroy(&jcr->term_wait);
       jcr->term_wait_inited = false;
    }
-   if (jcr->db_batch && jcr->db_batch != jcr->db) {
+   if (jcr->db_batch) {
       db_close_database(jcr, jcr->db_batch);
+      jcr->db_batch = NULL;
    }
-   jcr->db_batch = NULL;
    if (jcr->db) {
       db_close_database(jcr, jcr->db);
       jcr->db = NULL;
{'fraction_non_alphanumeric': 0.20165646380986677, 'fraction_numerical': 0.0219661505221462, 'mean_word_length': 2.3724954462659382, 'pattern_counts': {'":': 2, '<': 3, '<?xml version=': 0, '>': 134, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 15, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5703613', 'n_tokens_mistral': 4274, 'n_tokens_neox': 4025, 'n_words': 835}