X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fsql_cmds.c;h=b3d3aa74a2444aba84b03dbcda2917aed505b976;hb=3a0d7d1ee99ae3750af1f9fa63c3b7e5cadd879d;hp=6f78624a1358142b7a1ab715087724254a60bcc1;hpb=a4823181e719aa0b5e2609e9cceb28762da77bd7;p=bacula%2Fbacula diff --git a/bacula/src/dird/sql_cmds.c b/bacula/src/dird/sql_cmds.c index 6f78624a13..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,12 +98,14 @@ 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' " @@ -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"; +