]> git.sur5r.net Git - bacula/bacula/commitdiff
compile
authorEric Bollengier <eric@eb.homelinux.org>
Wed, 29 Jul 2009 17:51:59 +0000 (19:51 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 3 Aug 2009 14:39:17 +0000 (16:39 +0200)
bacula/src/cats/protos.h
bacula/src/cats/sql_create.c
bacula/src/cats/sql_get.c
bacula/src/dird/backup.c
bacula/src/dird/catreq.c
bacula/src/filed/accurate.c

index 5434960f32b5bfb4d10ce407f3b577f495e9a0a0..cd5943647b0bc777da4ebd3872e5e32ada95b45f 100644 (file)
@@ -106,6 +106,7 @@ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr);
 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);
 
@@ -142,7 +143,7 @@ int db_update_stats(JCR *jcr, B_DB *mdb, utime_t age);
 
 
 
-boot db_init_base_file(JCR *jcr, B_DB *mdb);
+bool db_init_base_file(JCR *jcr, B_DB *mdb);
 bool db_create_base_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
 bool db_commit_base_file_attributes_record(JCR *jcr, B_DB *mdb);
 void db_cleanup_base_file(JCR *jcr, B_DB *mdb);
index e7117ceb2120b436dda5345d3db0b656b4033fa3..5a11bead734d4a0b26a323c069efbb44ddaf6102 100644 (file)
@@ -1132,7 +1132,7 @@ const char *create_temp_basefile[4] = {
    "Name TEXT)"
 };
 
-boot db_init_base_file(JCR *jcr, B_DB *mdb)
+bool db_init_base_file(JCR *jcr, B_DB *mdb)
 {
    POOL_MEM q(PM_MESSAGE);
    Mmsg(q, create_temp_basefile[db_type], (uint64_t) jcr->JobId);
@@ -1145,6 +1145,7 @@ boot db_init_base_file(JCR *jcr, B_DB *mdb)
  */
 bool db_create_base_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
 {
+   bool ret;
    Dmsg1(dbglevel, "Fname=%s\n", ar->fname);
    Dmsg0(dbglevel, "put_file_into_catalog\n");
 
@@ -1160,7 +1161,7 @@ bool db_create_base_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
    }
 
    db_lock(mdb); 
-   split_path_and_file(jcr, bdb, ar->fname);
+   split_path_and_file(jcr, mdb, ar->fname);
    
    mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1);
    db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl);
@@ -1168,10 +1169,10 @@ bool db_create_base_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
    mdb->esc_path = check_pool_memory_size(mdb->esc_path, mdb->pnl*2+1);
    db_escape_string(jcr, mdb, mdb->esc_path, mdb->path, mdb->pnl);
    
-   len = Mmsg(mdb->cmd, "INSERT INTO basefile%lld (Path, Name) VALUES ('%s','%s')",
-              (uint64_t)jcr->JobId, mdb->esc_path, mdb->esc_name);
+   Mmsg(mdb->cmd, "INSERT INTO basefile%lld (Path, Name) VALUES ('%s','%s')",
+        (uint64_t)jcr->JobId, mdb->esc_path, mdb->esc_name);
    
-   boot ret = INSERT_DB(jcr, mdb, mdb->cmd);
+   ret = INSERT_DB(jcr, mdb, mdb->cmd);
    db_unlock(mdb);
 
    return ret;
@@ -1192,7 +1193,7 @@ bool db_commit_base_file_attributes_record(JCR *jcr, B_DB *mdb)
     "WHERE A.Path = B.Path "
       "AND A.Name = B.Name "
     "ORDER BY B.FileId)", 
-        edit_uint64(ed1, jcr->JobId), ed1, ed1);
+        edit_uint64(jcr->JobId, ed1), ed1, ed1);
 
    return db_sql_query(mdb, buf.c_str(), NULL, NULL);
 }
@@ -1202,6 +1203,7 @@ bool db_commit_base_file_attributes_record(JCR *jcr, B_DB *mdb)
  */
 void db_cleanup_base_file(JCR *jcr, B_DB *mdb)
 {
+   POOL_MEM buf(PM_MESSAGE);
    Mmsg(buf, "DROP TABLE new_basefile%lld", (uint64_t) jcr->JobId);
    db_sql_query(mdb, buf.c_str(), NULL, NULL);
 
index d0a885cb4440a0ebd2d00ab3b836189340a9a3a4..0509a8fd6b0d07c05d8a39d590a5f2c755493414 100644 (file)
@@ -1045,7 +1045,8 @@ bool db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 
 /*
  * Find the last "accurate" backup state (that can take deleted files in account)
- * 1) Get all files with jobid in list (F subquery) 
+ * 1) Get all files with jobid in list (F subquery)
+ *    Get all files in BaseFiles with jobid in list
  * 2) Take only the last version of each file (Temp subquery) => accurate list is ok
  * 3) Join the result to file table to get fileindex, jobid and lstat information
  *
@@ -1069,15 +1070,21 @@ bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids,
  "SELECT Path.Path, Filename.Name, File.FileIndex, File.JobId, File.LStat "
  "FROM ( "
   "SELECT max(FileId) as FileId, PathId, FilenameId "
-    "FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (%s)) AS F "
+    "FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (%s) "
+           "UNION "
+          "SELECT File.FileId, PathId, FilenameId "
+            "FROM BaseFiles JOIN File USING (FileId) "
+           "WHERE BaseFiles.JobId IN (%s) "
+          ") AS F "
    "GROUP BY PathId, FilenameId "
   ") AS Temp "
  "JOIN Filename ON (Filename.FilenameId = Temp.FilenameId) "
  "JOIN Path ON (Path.PathId = Temp.PathId) "
  "JOIN File ON (File.FileId = Temp.FileId) "
-"WHERE File.FileIndex > 0 ORDER BY JobId, FileIndex ASC",     /* Return sorted by JobId, */
-                                                              /* FileIndex for restore code */ 
-             jobids);
+"WHERE File.FileIndex > 0 ORDER BY JobId, FileIndex ASC",/* Return sorted by JobId, */
+                                                         /* FileIndex for restore code */ 
+        jobids, jobids);
+   Dmsg1(0, "q=%s\n", buf.c_str());
 #else
    /*  
     * I am not sure that this works the same as the code in ua_restore.c
@@ -1188,6 +1195,47 @@ bail_out:
    return ret;
 }
 
+bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid)
+{
+   char date[MAX_TIME_LENGTH];
+   int64_t id = *jobid = 0;
+   POOL_MEM query(PM_FNAME);
+
+// char clientid[50], filesetid[50];
+
+   utime_t StartTime = (jr->StartTime)?jr->StartTime:time(NULL);
+   bstrutime(date, sizeof(date),  StartTime + 1);
+
+   /* we can take also client name, fileset, etc... */
+
+   Mmsg(query,
+ "SELECT JobId, Job, StartTime, EndTime, JobTDate, PurgedFiles "
+   "FROM Job "
+// "JOIN FileSet USING (FileSetId) JOIN Client USING (ClientId) "
+  "WHERE Job.Name = '%s' "
+    "AND Level='B' AND JobStatus IN ('T','W') AND Type='B' "
+//    "AND FileSet.FileSet= '%s' "
+//    "AND Client.Name = '%s' "
+    "AND StartTime<'%s' "
+  "ORDER BY Job.JobTDate DESC LIMIT 1",
+        jr->Name,
+//      edit_uint64(jr->ClientId, clientid),
+//      edit_uint64(jr->FileSetId, filesetid));
+        date);
+
+   Dmsg1(1, "db_get_base_jobid q=%s\n", query.c_str());
+   if (!db_sql_query(mdb, query.c_str(), db_int64_handler, &id)) {
+      goto bail_out;
+   }
+   *jobid = (JobId_t) id;
+
+   Dmsg1(1, "db_get_base_jobid=%lld\n", id);
+   return true;
+
+bail_out:
+   return false;
+}
+
 /*
  * Use to build a string of int list from a query. "10,20,30"
  */
index 029dfa0c89179ab8bb34bb8068062310be01394b..bdf6fc92d36cd6e764e7e29f81751aff66385b7e 100644 (file)
@@ -103,6 +103,36 @@ bool do_backup_init(JCR *jcr)
    return true;
 }
 
+/* Take all base jobs from job resource and find the
+ * last L_BASE jobid.
+ */
+static void get_base_jobids(JCR *jcr, POOLMEM *jobids)
+{
+   JOB_DBR jr;
+   JOB *job;
+   JobId_t id;
+   char str_jobid[50];
+
+   if (!jcr->job->base) {
+      return;
+   }
+
+   memset(&jr, 0, sizeof(JOB_DBR));
+   jr.StartTime = jcr->jr.StartTime;
+
+   foreach_alist(job, jcr->job->base) {
+      bstrncpy(jr.Name, job->name(), sizeof(jr.Name));
+      db_get_base_jobid(jcr, jcr->db, &jr, &id);
+
+      if (id) {
+         if (jobids[0]) {
+            pm_strcat(jobids, ",");
+         }
+         pm_strcat(jobids, edit_uint64(id, str_jobid));
+      }
+   }
+}
+
 /*
  * Foreach files in currrent list, send "/path/fname\0LStat" to FD
  */
@@ -131,45 +161,65 @@ static int accurate_list_handler(void *ctx, int num_fields, char **row)
 bool send_accurate_current_files(JCR *jcr)
 {
    POOL_MEM buf;
+   bool ret=true;
 
-   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;
+   }
+
+   POOLMEM *nb = get_pool_memory(PM_FNAME);
    POOLMEM *jobids = get_pool_memory(PM_FNAME);
+   nb[0] = jobids[0] = '\0';
 
-   db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, jobids);
+   get_base_jobids(jcr, jobids);
 
-   if (*jobids == 0) {
-      free_pool_memory(jobids);
-      Jmsg(jcr, M_FATAL, 0, _("Cannot find previous jobids.\n"));
-      return false;
+   /* On Full mode, if no previous base job, no accurate things */
+   if (jcr->get_JobLevel() == L_FULL && *jobids == 0) {
+      goto bail_out;
    }
+
+   /* For Incr/Diff level, we search for older jobs */
+   if (jcr->get_JobLevel() != L_FULL) {
+      db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, jobids);
+
+      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 */
-   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)) {
+      ret = false;
       Jmsg0(jcr, M_FATAL, 0, "Can't get dedicate sql connexion");
-      return false;
+      goto bail_out;
    }
 
    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);
+
+bail_out:
    free_pool_memory(jobids);
    free_pool_memory(nb);
 
-   jcr->file_bsock->signal(BNET_EOD);
-
-   return true;
+   return ret;
 }
 
 /*
index c317ad444123ee3036d3e742209413c72a5d05dd..e9a180b75db2d2020f25868f52cec050fc635c59 100644 (file)
@@ -488,7 +488,7 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen)
 
             /* Update BaseFile table */
             if (ar->FileType == FT_BASE) {
-               if (!db_create_base_file_attributes_record(jcr, jcr->mdb, ar)) {
+               if (!db_create_base_file_attributes_record(jcr, jcr->db, ar)) {
                   Jmsg1(jcr, M_FATAL, 0, _("Base attribute create error. %s"),
                         db_strerror(jcr->db));
                }
index c9a69390e664f18d580f94fdc5c9a93c76d7d18c..e7ba84196d6744aa3260e1fc697e6f7ca9156ead 100644 (file)
@@ -98,7 +98,7 @@ static bool accurate_send_base_file_list(JCR *jcr)
    FF_PKT *ff_pkt;
    int stream = STREAM_UNIX_ATTRIBUTES;
 
-   if (!jcr->accurate || jcr->get_JobLevel != L_FULL) {
+   if (!jcr->accurate || jcr->get_JobLevel() != L_FULL) {
       return true;
    }
 
@@ -163,7 +163,7 @@ static bool accurate_send_deleted_list(JCR *jcr)
    return true;
 }
 
-static void accurate_free(JCR *jcr)
+void accurate_free(JCR *jcr)
 {
    if (jcr->file_list) {
       jcr->file_list->destroy();
@@ -177,7 +177,7 @@ bool accurate_finish(JCR *jcr)
 {
    bool ret=true;
    if (jcr->accurate) {
-      if (jcr->get_JobLevel == L_FULL) {
+      if (jcr->get_JobLevel() == L_FULL) {
          ret = accurate_send_base_file_list(jcr);
       } else {
          ret = accurate_send_deleted_list(jcr);