X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fsql_cmds.c;h=b3d3aa74a2444aba84b03dbcda2917aed505b976;hb=3a0d7d1ee99ae3750af1f9fa63c3b7e5cadd879d;hp=1a9ae7a25eed9e651153d42e552bacc27da9d22b;hpb=ddebcd1b6a948127038cb9076ba091d30e8b1776;p=bacula%2Fbacula diff --git a/bacula/src/dird/sql_cmds.c b/bacula/src/dird/sql_cmds.c index 1a9ae7a25e..b3d3aa74a2 100644 --- a/bacula/src/dird/sql_cmds.c +++ b/bacula/src/dird/sql_cmds.c @@ -8,7 +8,7 @@ */ /* - Copyright (C) 2002-2003 Kern Sibbald and John Walker + Copyright (C) 2002-2004 Kern Sibbald and John Walker This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -57,17 +57,30 @@ char *drop_deltabs[] = { "DROP INDEX DelInx1", NULL}; + /* List of SQL commands to create temp table and indicies */ char *create_deltabs[] = { "CREATE TABLE DelCandidates (" +#ifdef HAVE_MYSQL "JobId INTEGER UNSIGNED NOT NULL, " "PurgedFiles TINYINT, " "FileSetId INTEGER UNSIGNED, " "JobFiles INTEGER UNSIGNED, " -#ifdef HAVE_MYSQL "JobStatus BINARY(1))", #else +#ifdef HAVE_POSTGRESQL + "JobId INTEGER NOT NULL, " + "PurgedFiles SMALLINT, " + "FileSetId INTEGER, " + "JobFiles INTEGER, " + "JobStatus char(1))", +#else + "JobId INTEGER UNSIGNED NOT NULL, " + "PurgedFiles TINYINT, " + "FileSetId INTEGER UNSIGNED, " + "JobFiles INTEGER UNSIGNED, " "JobStatus CHAR)", +#endif #endif "CREATE INDEX DelInx1 ON DelCandidates (JobId)", NULL}; @@ -85,19 +98,21 @@ char *insert_delcand = /* Select Jobs from the DelCandidates table that have a * more recent backup -- i.e. are not the only backup. * This is the list of Jobs to delete for a Backup Job. + * At the same time, we select "orphanned" jobs + * (i.e. no files, ...) for deletion. */ char *select_backup_del = "SELECT DelCandidates.JobId " "FROM Job,DelCandidates " - "WHERE (DelCandidates.JobFiles=0) OR " - "(DelCandidates.JobStatus!='T') OR " + "WHERE (JobTDate<%s AND ((DelCandidates.JobFiles=0) OR " + "(DelCandidates.JobStatus!='T'))) OR " "(Job.JobTDate>%s " "AND Job.ClientId=%u " "AND Job.Type='B' " "AND Job.Level='F' " "AND Job.JobStatus='T' " "AND Job.FileSetId=DelCandidates.FileSetId) " - "GROUP BY JobId"; + "GROUP BY DelCandidates.JobId"; /* Select Jobs from the DelCandidates table that have a * more recent InitCatalog -- i.e. are not the only InitCatalog @@ -112,7 +127,7 @@ char *select_verify_del = "AND Job.Level='V' " "AND Job.JobStatus='T' " "AND Job.FileSetId=DelCandidates.FileSetId " - "GROUP BY JobId"; + "GROUP BY DelCandidates.JobId"; /* Select Jobs from the DelCandidates table. @@ -124,7 +139,7 @@ char *select_restore_del = "WHERE Job.JobTDate>%s " "AND Job.ClientId=%u " "AND Job.Type='R' " - "GROUP BY JobId"; + "GROUP BY DelCandidates.JobId"; @@ -135,7 +150,7 @@ char *uar_list_jobs = "SELECT JobId,Client.Name as Client,StartTime,Level as " "JobLevel,JobFiles,JobBytes " "FROM Client,Job WHERE Client.ClientId=Job.ClientId AND JobStatus='T' " - "AND Type='B' ORDER BY StartTime LIMIT 20"; + "AND Type='B' ORDER BY StartTime DESC LIMIT 20"; #ifdef HAVE_MYSQL /* MYSQL IS NOT STANDARD SQL !!!!! */ @@ -161,17 +176,34 @@ char *uar_file = #endif +/* + * Find all files for a particular JobId and insert them into + * the tree during a restore. + */ char *uar_sel_files = - "SELECT Path.Path,Filename.Name,FileIndex,JobId " + "SELECT Path.Path,Filename.Name,FileIndex,JobId,LStat " "FROM File,Filename,Path " - "WHERE File.JobId=%d AND Filename.FilenameId=File.FilenameId " + "WHERE File.JobId=%u AND Filename.FilenameId=File.FilenameId " "AND Path.PathId=File.PathId"; char *uar_del_temp = "DROP TABLE temp"; char *uar_del_temp1 = "DROP TABLE temp1"; char *uar_create_temp = - "CREATE TABLE temp (JobId INTEGER UNSIGNED NOT NULL," + "CREATE TABLE temp (" +#ifdef HAVE_POSTGRESQL + "JobId INTEGER NOT NULL," + "JobTDate BIGINT," + "ClientId INTEGER," + "Level CHAR," + "JobFiles INTEGER," + "StartTime TEXT," + "VolumeName TEXT," + "StartFile INTEGER," + "VolSessionId INTEGER," + "VolSessionTime INTEGER)"; +#else + "JobId INTEGER UNSIGNED NOT NULL," "JobTDate BIGINT UNSIGNED," "ClientId INTEGER UNSIGNED," "Level CHAR," @@ -181,20 +213,29 @@ char *uar_create_temp = "StartFile INTEGER UNSIGNED," "VolSessionId INTEGER UNSIGNED," "VolSessionTime INTEGER UNSIGNED)"; +#endif char *uar_create_temp1 = - "CREATE TABLE temp1 (JobId INTEGER UNSIGNED NOT NULL," + "CREATE TABLE temp1 (" +#ifdef HAVE_POSTGRESQL + "JobId INTEGER NOT NULL," + "JobTDate BIGINT)"; +#else + "JobId INTEGER UNSIGNED NOT NULL," "JobTDate BIGINT UNSIGNED)"; +#endif char *uar_last_full = "INSERT INTO temp1 SELECT Job.JobId,JobTdate " - "FROM Client,Job,JobMedia,Media WHERE Client.ClientId=%u " + "FROM Client,Job,JobMedia,Media,FileSet WHERE Client.ClientId=%u " "AND Job.ClientId=%u " "AND Job.StartTime<'%s' " "AND Level='F' AND JobStatus='T' " "AND JobMedia.JobId=Job.JobId " "AND JobMedia.MediaId=Media.MediaId " - "AND Job.FileSetId=%u " + "AND Job.FileSetId=FileSet.FileSetId " + "AND FileSet.FileSet='%s' " + "%s" "ORDER BY Job.JobTDate DESC LIMIT 1"; char *uar_full = @@ -206,35 +247,73 @@ char *uar_full = "AND JobMedia.JobId=Job.JobId " "AND JobMedia.MediaId=Media.MediaId"; -char *uar_inc_dec = +char *uar_dif = + "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId," + "Job.Level,Job.JobFiles,Job.StartTime,Media.VolumeName,JobMedia.StartFile," + "Job.VolSessionId,Job.VolSessionTime " + "FROM Job,JobMedia,Media,FileSet " + "WHERE Job.JobTDate>%s AND Job.StartTime<'%s' " + "AND Job.ClientId=%u " + "AND JobMedia.JobId=Job.JobId " + "AND JobMedia.MediaId=Media.MediaId " + "AND Job.Level='D' AND JobStatus='T' " + "AND Job.FileSetId=FileSet.FileSetId " + "AND FileSet.FileSet='%s' " + "%s" + "ORDER BY Job.JobTDate DESC LIMIT 1"; + +char *uar_inc = "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId," "Job.Level,Job.JobFiles,Job.StartTime,Media.VolumeName,JobMedia.StartFile," "Job.VolSessionId,Job.VolSessionTime " - "FROM Job,JobMedia,Media " - "WHERE Job.JobTDate>%s AND Job.StartTime < '%s' " + "FROM Job,JobMedia,Media,FileSet " + "WHERE Job.JobTDate>%s AND Job.StartTime<'%s' " "AND Job.ClientId=%u " "AND JobMedia.JobId=Job.JobId " "AND JobMedia.MediaId=Media.MediaId " - "AND Job.Level IN ('I', 'D') AND JobStatus='T' " - "AND Job.FileSetId=%u " - "GROUP BY Job.JobId"; + "AND Job.Level='I' AND JobStatus='T' " + "AND Job.FileSetId=FileSet.FileSetId " + "AND FileSet.FileSet='%s' " + "%s"; char *uar_list_temp = "SELECT JobId,Level,JobFiles,StartTime,VolumeName,StartFile," - "VolSessionId,VolSessionTime FROM temp"; + "VolSessionId,VolSessionTime FROM temp " + "ORDER BY StartTime ASC"; + char *uar_sel_jobid_temp = "SELECT JobId FROM temp"; char *uar_sel_all_temp1 = "SELECT * FROM temp1"; -/* Select filesets for this Client */ +char *uar_sel_all_temp = "SELECT * FROM temp"; + + + +/* Select FileSet names for this Client */ char *uar_sel_fileset = - "SELECT FileSet.FileSetId,FileSet.FileSet,FileSet.CreateTime FROM Job," + "SELECT DISTINCT FileSet.FileSet FROM Job," "Client,FileSet WHERE Job.FileSetId=FileSet.FileSetId " "AND Job.ClientId=%u AND Client.ClientId=%u " - "GROUP BY FileSet.FileSetId ORDER BY FileSet.FileSetId"; + "ORDER BY FileSet.FileSet"; /* Find MediaType used by this Job */ char *uar_mediatype = "SELECT MediaType FROM JobMedia,Media WHERE JobMedia.JobId=%u " "AND JobMedia.MediaId=Media.MediaId"; + +/* + * Find JobId, FileIndex for a given path/file and date + * for use when inserting individual files into the tree. + */ +char *uar_jobid_fileindex = + "SELECT Job.JobId, File.FileIndex FROM Job,File,Path,Filename,Client " + "WHERE Job.JobId=File.JobId " + "AND Job.StartTime<'%s' " + "AND Path.Path='%s' " + "AND Filename.Name='%s' " + "AND Client.Name='%s' " + "AND Path.PathId=File.PathId " + "AND Filename.FilenameId=File.FilenameId " + "ORDER BY Job.StartTime DESC LIMIT 1"; +