"SchedTime, StartTime, EndTime, RealEndTime, JobTDate, "
"VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes, "
"JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, "
- "PurgedFiles, HasBase ) "
+ "PurgedFiles, HasBase, Reviewed, Comment ) "
"SELECT "
"JobId, Job, Name, Type, Level, ClientId, JobStatus, "
"SchedTime, StartTime, EndTime, RealEndTime, JobTDate, "
"VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes, "
"JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, "
- "PurgedFiles, HasBase "
+ "PurgedFiles, HasBase, Reviewed, Comment "
"FROM Job "
"WHERE JobStatus IN ('T','W','f','A','E') "
"AND JobId NOT IN (SELECT JobId FROM JobHisto) "
"INSERT INTO temp1 SELECT Job.JobId,JobTdate "
"FROM Client,Job,JobMedia,Media,FileSet WHERE Client.ClientId=%s "
"AND Job.ClientId=%s "
- "AND Job.StartTime<'%s' "
+ "AND Job.StartTime < '%s' "
"AND Level='F' AND JobStatus IN ('T','W') AND Type='B' "
"AND JobMedia.JobId=Job.JobId "
"AND Media.Enabled=1 "
* With PostgreSQL, we can use DISTINCT ON(), but with Mysql or Sqlite,
* we need an extra join using JobTDate.
*/
-const char *select_recent_version_with_basejob[4] = {
+const char *select_recent_version_with_basejob[5] = {
/* MySQL */
"SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, "
"File.FilenameId AS FilenameId, LStat, MD5 "
"FROM Job, File, ( "
"SELECT MAX(JobTDate) AS JobTDate, PathId, FilenameId "
"FROM ( "
- "SELECT JobTDate, PathId, FilenameId "
- "FROM File JOIN Job USING (JobId) "
- "WHERE JobId IN (%s) "
+ "SELECT JobTDate, PathId, FilenameId " /* Get all normal files */
+ "FROM File JOIN Job USING (JobId) " /* from selected backup */
+ "WHERE File.JobId IN (%s) "
"UNION ALL "
- "SELECT JobTDate, PathId, FilenameId "
- "FROM BaseFiles "
+ "SELECT JobTDate, PathId, FilenameId " /* Get all files from */
+ "FROM BaseFiles " /* BaseJob */
"JOIN File USING (FileId) "
"JOIN Job ON (BaseJobId = Job.JobId) "
- "WHERE BaseFiles.JobId IN (%s) "
- ") AS tmp GROUP BY PathId, FilenameId "
+ "WHERE BaseFiles.JobId IN (%s) " /* Use Max(JobTDate) to find */
+ ") AS tmp GROUP BY PathId, FilenameId " /* the latest file version */
") AS T1 "
-"WHERE (Job.JobId IN (
- SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s))
- OR Job.JobId IN (%s)) "
- "AND Job.JobId = File.JobId "
- "AND Job.JobTDate = T1.JobTDate "
- "AND File.PathId = T1.PathId "
- "AND File.FilenameId = T1.PathId "
+"WHERE (Job.JobId IN ( " /* Security, we force JobId to be valid */
+ "SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s)) "
+ "OR Job.JobId IN (%s)) "
+ "AND T1.JobTDate = Job.JobTDate " /* Join on JobTDate to get the orginal */
+ "AND Job.JobId = File.JobId " /* Job/File record */
+ "AND T1.PathId = File.PathId "
+ "AND T1.FilenameId = File.FilenameId",
/* Postgresql */ /* The DISTINCT ON () permits to avoid extra join */
"SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
"FROM ( "
"SELECT JobTDate, PathId, FilenameId "
"FROM File JOIN Job USING (JobId) "
- "WHERE JobId IN (%s) "
+ "WHERE File.JobId IN (%s) "
"UNION ALL "
"SELECT JobTDate, PathId, FilenameId "
"FROM BaseFiles "
"WHERE BaseFiles.JobId IN (%s) "
") AS tmp GROUP BY PathId, FilenameId "
") AS T1 "
-"WHERE (Job.JobId IN (
- SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s))
- OR Job.JobId IN (%s)) "
+"WHERE (Job.JobId IN ( "
+ "SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s)) "
+ "OR Job.JobId IN (%s)) "
+ "AND T1.JobTDate = Job.JobTDate "
"AND Job.JobId = File.JobId "
- "AND Job.JobTDate = T1.JobTDate "
- "AND File.PathId = T1.PathId "
- "AND File.FilenameId = T1.PathId ",
+ "AND T1.PathId = File.PathId "
+ "AND T1.FilenameId = File.FilenameId",
/* SQLite3 */ /* See Mysql section for doc */
"SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, "
"FROM ( "
"SELECT JobTDate, PathId, FilenameId "
"FROM File JOIN Job USING (JobId) "
- "WHERE JobId IN (%s) "
+ "WHERE File.JobId IN (%s) "
"UNION ALL "
"SELECT JobTDate, PathId, FilenameId "
"FROM BaseFiles "
"WHERE BaseFiles.JobId IN (%s) "
") AS tmp GROUP BY PathId, FilenameId "
") AS T1 "
-"WHERE (Job.JobId IN (
- SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s))
- OR Job.JobId IN (%s)) "
+"WHERE (Job.JobId IN ( "
+ "SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (%s)) "
+ "OR Job.JobId IN (%s)) "
+ "AND T1.JobTDate = Job.JobTDate "
"AND Job.JobId = File.JobId "
- "AND Job.JobTDate = T1.JobTDate "
- "AND File.PathId = T1.PathId "
- "AND File.FilenameId = T1.PathId "
+ "AND T1.PathId = File.PathId "
+ "AND T1.FilenameId = File.FilenameId",
+
+ /* Ingres (works?) */ /* The DISTINCT ON () permits to avoid extra join */
+ "SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
+ "FileIndex, PathId, FilenameId, LStat, MD5 "
+ "FROM "
+ "(SELECT FileId, JobId, PathId, FilenameId, FileIndex, LStat, MD5 "
+ "FROM File WHERE JobId IN (%s) "
+ "UNION ALL "
+ "SELECT File.FileId, File.JobId, PathId, FilenameId, "
+ "File.FileIndex, LStat, MD5 "
+ "FROM BaseFiles JOIN File USING (FileId) "
+ "WHERE BaseFiles.JobId IN (%s) "
+ ") AS T JOIN Job USING (JobId) "
+ "ORDER BY FilenameId, PathId, StartTime DESC "
+
};
/* Get the list of the last recent version with a given BaseJob jobid list */
-const char *select_recent_version[4] = {
+const char *select_recent_version[5] = {
/* MySQL */
"SELECT j1.JobId AS JobId, f1.FileId AS FileId, f1.FileIndex AS FileIndex, "
"f1.PathId AS PathId, f1.FilenameId AS FilenameId, "
"FROM ( " /* Choose the last version for each Path/Filename */
"SELECT max(JobTDate) AS JobTDate, PathId, FilenameId "
"FROM File JOIN Job USING (JobId) "
- "WHERE JobId IN (%s) "
+ "WHERE File.JobId IN (%s) "
"GROUP BY PathId, FilenameId "
") AS t1, Job AS j1, File AS f1 "
"WHERE t1.JobTDate = j1.JobTDate "
/* Postgresql */
"SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
- "FileIndex, PathId, FilenameId, LStat "
+ "FileIndex, PathId, FilenameId, LStat, MD5 "
"FROM File JOIN Job USING (JobId) "
"WHERE JobId IN (%s) "
"ORDER BY FilenameId, PathId, StartTime DESC ",
"FROM ( "
"SELECT max(JobTDate) AS JobTDate, PathId, FilenameId "
"FROM File JOIN Job USING (JobId) "
- "WHERE JobId IN (%s) "
+ "WHERE File.JobId IN (%s) "
"GROUP BY PathId, FilenameId "
") AS t1, Job AS j1, File AS f1 "
"WHERE t1.JobTDate = j1.JobTDate "
"FROM ( "
"SELECT max(JobTDate) AS JobTDate, PathId, FilenameId "
"FROM File JOIN Job USING (JobId) "
- "WHERE JobId IN (%s) "
+ "WHERE File.JobId IN (%s) "
"GROUP BY PathId, FilenameId "
") AS t1, Job AS j1, File AS f1 "
"WHERE t1.JobTDate = j1.JobTDate "
"AND j1.JobId IN (%s) "
"AND t1.FilenameId = f1.FilenameId "
"AND t1.PathId = f1.PathId "
- "AND j1.JobId = f1.JobId"
+ "AND j1.JobId = f1.JobId",
+
+ /* Ingres */
+ "SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
+ "FileIndex, PathId, FilenameId, LStat, MD5 "
+ "FROM File JOIN Job USING (JobId) "
+ "WHERE JobId IN (%s) "
+ "ORDER BY FilenameId, PathId, StartTime DESC "
+
};
/* ====== ua_prune.c */
/* List of SQL commands to create temp table and indicies */
-const char *create_deltabs[4] = {
+const char *create_deltabs[5] = {
/* MySQL */
"CREATE TEMPORARY TABLE DelCandidates ("
"JobId INTEGER UNSIGNED NOT NULL, "
"PurgedFiles TINYINT, "
"FileSetId INTEGER UNSIGNED, "
"JobFiles INTEGER UNSIGNED, "
- "JobStatus CHAR)"};
+ "JobStatus CHAR)",
+ /* Ingres */
+ "DECLARE GLOBAL TEMPORARY TABLE DelCandidates ("
+ "JobId INTEGER NOT NULL, "
+ "PurgedFiles SMALLINT, "
+ "FileSetId INTEGER, "
+ "JobFiles INTEGER, "
+ "JobStatus char(1))"
+ "ON COMMIT PERSERVE ROWS WITH NORECOVERY"
+};
/* ======= ua_restore.c */
/* List Jobs where a particular file is saved */
-const char *uar_file[4] = {
+const char *uar_file[5] = {
/* Mysql */
"SELECT Job.JobId as JobId,"
"CONCAT(Path.Path,Filename.Name) as Name, "
"AND Client.ClientId=Job.ClientId "
"AND Job.JobId=File.JobId AND File.FileIndex > 0 "
"AND Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
- "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20"};
+ "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20",
+ /* Ingres */
+ "SELECT Job.JobId as JobId,"
+ "Path.Path||Filename.Name as Name, "
+ "StartTime,Type as JobType,JobStatus,JobFiles,JobBytes "
+ "FROM Client,Job,File,Filename,Path WHERE Client.Name='%s' "
+ "AND Client.ClientId=Job.ClientId "
+ "AND Job.JobId=File.JobId AND File.FileIndex > 0 "
+ "AND Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
+ "AND Filename.Name='%s' ORDER BY StartTime DESC FETCH FIRST 20 ROWS ONLY"
+ };
-const char *uar_create_temp[4] = {
+const char *uar_create_temp[5] = {
/* Mysql */
"CREATE TEMPORARY TABLE temp ("
"JobId INTEGER UNSIGNED NOT NULL,"
"VolumeName TEXT,"
"StartFile INTEGER UNSIGNED,"
"VolSessionId INTEGER UNSIGNED,"
- "VolSessionTime INTEGER UNSIGNED)"};
+ "VolSessionTime INTEGER UNSIGNED)",
+ /* Ingres */
+ "DECLARE GLOBAL TEMPORARY TABLE temp ("
+ "JobId INTEGER NOT NULL,"
+ "JobTDate BIGINT,"
+ "ClientId INTEGER,"
+ "Level CHAR,"
+ "JobFiles INTEGER,"
+ "JobBytes BIGINT,"
+ "StartTime VARCHAR(256),"
+ "VolumeName VARCHAR(256),"
+ "StartFile INTEGER,"
+ "VolSessionId INTEGER,"
+ "VolSessionTime INTEGER)"
+ "ON COMMIT PRESERVE ROWS WITH NORECOVERY"
+ };
-const char *uar_create_temp1[4] = {
+const char *uar_create_temp1[5] = {
/* Mysql */
"CREATE TEMPORARY TABLE temp1 ("
"JobId INTEGER UNSIGNED NOT NULL,"
/* SQLite3 */
"CREATE TEMPORARY TABLE temp1 ("
"JobId INTEGER UNSIGNED NOT NULL,"
- "JobTDate BIGINT UNSIGNED)"};
+ "JobTDate BIGINT UNSIGNED)",
+ /* Ingres */
+ "DECLARE GLOBAL TEMPORARY TABLE temp1 ("
+ "JobId INTEGER NOT NULL,"
+ "JobTDate BIGINT)"
+ "ON COMMIT PRESERVE ROWS WITH NORECOVERY"
+ };
/* Query to get all files in a directory -- no recursing
* Note, for PostgreSQL since it respects the "Single Value
* for each time it was backed up.
*/
-const char *uar_jobid_fileindex_from_dir[4] = {
+const char *uar_jobid_fileindex_from_dir[5] = {
/* Mysql */
"SELECT Job.JobId,File.FileIndex FROM Job,File,Path,Filename,Client "
"WHERE Job.JobId IN (%s) "
"AND Job.ClientId=Client.ClientId "
"AND Path.PathId=File.Pathid "
"AND Filename.FilenameId=File.FilenameId "
- "GROUP BY File.FileIndex "};
+ "GROUP BY File.FileIndex ",
+ /* Ingres */
+ "SELECT Job.JobId,File.FileIndex FROM Job,File,Path,Filename,Client "
+ "WHERE Job.JobId IN (%s) "
+ "AND Job.JobId=File.JobId "
+ "AND Path.Path='%s' "
+ "AND Client.Name='%s' "
+ "AND Job.ClientId=Client.ClientId "
+ "AND Path.PathId=File.Pathid "
+ "AND Filename.FilenameId=File.FilenameId"
+ };
+
+const char *sql_get_max_connections[5] = {
+ /* Mysql */
+ "SHOW VARIABLES LIKE 'max_connections'",
+ /* Postgresql */
+ "SHOW max_connections",
+ /* SQLite */
+ "SELECT 0",
+ /* SQLite3 */
+ "SELECT 0",
+ /* Ingres (TODO) */
+ "SELECT 0"
+};
+
+/* Row number of the max_connections setting */
+const uint32_t sql_get_max_connections_index[5] = {
+ /* Mysql */
+ 1,
+ /* Postgresql */
+ 0,
+ /* SQLite */
+ 0,
+ /* SQLite3 */
+ 0,
+ /* Ingres (TODO) */
+ 0
+};