X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fcats%2Fsql_get.c;h=6da66a75bdfc184e81b91290029e62cc285daca3;hb=c6b2ff4c5c9a0d52923129bdd74a96c40e9cf072;hp=7e5901c8a7ea52b48e81976ab2fec315967adb7e;hpb=83d32d30375f7dae0e999dcaf3f06393a5c70ff6;p=bacula%2Fbacula diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index 7e5901c8a7..6da66a75bd 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -1044,10 +1044,12 @@ 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) + * Find the last "accurate" backup state (that can take deleted files in + * account) * 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 + * 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 * * TODO: See if we can do the SORT only if needed (as an argument) @@ -1065,28 +1067,23 @@ bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids, #define new_db_get_file_list #ifdef new_db_get_file_list + POOL_MEM buf2(PM_MESSAGE); + Mmsg(buf2, select_recent_version_with_basejob[db_type], + jobids, jobids, jobids); Mmsg(buf, - "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) " - "UNION ALL " /* we already sort after */ - "SELECT File.FileId, PathId, FilenameId " - "FROM BaseFiles JOIN File USING (FileId) " - "WHERE BaseFiles.JobId IN (%s) " - ") AS F " - "GROUP BY PathId, FilenameId " - ") AS Temp " + "SELECT Path.Path, Filename.Name, FileIndex, JobId, " + "LStat, MD5 " + "FROM ( %s ) 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, jobids); +"WHERE FileIndex > 0 ORDER BY JobId, FileIndex ASC",/* Return sorted by JobId, */ + /* FileIndex for restore code */ + buf2.c_str()); + Dmsg1(0, "sql=%s\n", buf.c_str()); #else /* - * I am not sure that this works the same as the code in ua_restore.c - * but it is very similar. The accurate-test fails in a restore. Bad file count. + * I am not sure that this works the same as the code in ua_restore.c but it + * is very similar. The accurate-test fails in a restore. Bad file count. */ Mmsg(buf, uar_sel_files, jobids); #endif @@ -1096,9 +1093,9 @@ bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids, /* * This procedure gets the base jobid list used by jobids, - * You can specify jobids == result to concat base jobids to current jobids */ -bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, POOLMEM *jobids, POOLMEM *result) +bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, + POOLMEM *jobids, db_list_ctx *result) { POOL_MEM buf; Mmsg(buf, @@ -1106,7 +1103,7 @@ bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, POOLMEM *jobids, POOLMEM *resu " FROM Job JOIN BaseFiles USING (JobId) " " WHERE Job.HasBase = 1 " " AND JobId IN (%s) ", jobids); - return db_sql_query(mdb, buf.c_str(), db_get_int_handler, result); + return db_sql_query(mdb, buf.c_str(), db_list_handler, result); } /* The decision do change an incr/diff was done before @@ -1120,7 +1117,7 @@ bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, POOLMEM *jobids, POOLMEM *resu * TODO: look and merge from ua_restore.c */ bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, - JOB_DBR *jr, POOLMEM *jobids) + JOB_DBR *jr, db_list_ctx *jobids) { bool ret=false; char clientid[50], jobid[50], filesetid[50]; @@ -1131,7 +1128,8 @@ bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, utime_t StartTime = (jr->StartTime)?jr->StartTime:time(NULL); bstrutime(date, sizeof(date), StartTime + 1); - jobids[0]='\0'; + jobids->list[0] = 0; + jobids->count = 0; /* First, find the last good Full backup for this job/client/fileset */ Mmsg(query, @@ -1197,8 +1195,8 @@ bool db_accurate_get_jobids(JCR *jcr, B_DB *mdb, /* build a jobid list ie: 1,2,3,4 */ Mmsg(query, "SELECT JobId FROM btemp3%s ORDER by JobTDate", jobid); - db_sql_query(mdb, query.c_str(), db_get_int_handler, jobids); - Dmsg1(10, "db_accurate_get_jobids=%s\n", jobids); + db_sql_query(mdb, query.c_str(), db_list_handler, jobids); + Dmsg1(1, "db_accurate_get_jobids=%s\n", jobids->list); ret = true; bail_out: @@ -1214,12 +1212,13 @@ bool db_get_base_file_list(JCR *jcr, B_DB *mdb, POOL_MEM buf(PM_MESSAGE); Mmsg(buf, - "SELECT Path, Name, FileIndex, JobId, LStat " + "SELECT Path, Name, FileIndex, JobId, LStat, MD5 " "FROM new_basefile%lld ORDER BY JobId, FileIndex ASC", (uint64_t) jcr->JobId); return db_sql_query(mdb, buf.c_str(), result_handler, ctx); } + bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid) { char date[MAX_TIME_LENGTH];