#define OSDependentInit() InitWinAPIWrapper()
#undef ENABLE_NLS
+
#if defined(BUILDING_DLL)
# define DLL_IMP_EXP _declspec(dllexport)
#elif defined(USING_DLL)
# define DLL_IMP_EXP
#endif
+#if defined(USING_CATS)
+# define CATS_IMP_EXP _declspec(dllimport)
+#else
+# define CATS_IMP_EXP
+#endif
+
#else
#define DLL_IMP_EXP
+#define CATS_IMP_EXP
#define OSDependentInit()
#define tape_open open
LIBSRCS = mysql.c bdb.c bdb_create.c bdb_get.c bdb_update.c \
bdb_delete.c bdb_find.c bdb_list.c \
- sql.c sql_create.c sql_delete.c sql_find.c \
+ sql.c sql_cmds.c sql_create.c sql_delete.c sql_find.c \
sql_get.c sql_list.c sql_update.c sqlite.c \
postgresql.c
LIBOBJS = mysql.o bdb.o bdb_create.o bdb_get.o bdb_update.o \
bdb_delete.o bdb_find.o bdb_list.o \
- sql.o sql_create.o sql_delete.o sql_find.o \
+ sql.o sql_cmds.o sql_create.o sql_delete.o sql_find.o \
sql_get.o sql_list.o sql_update.o sqlite.o \
postgresql.o
uint32_t bacula_db_version = 0;
-/* Forward referenced functions */
-
-extern const char *working_directory;
-
/* List of open databases */
static BQUEUE db_list = {&db_list, &db_list};
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
#ifdef HAVE_BACULA_DB
-/* Forward referenced functions */
-
/* -----------------------------------------------------------------------
*
* Bacula specific defines and subroutines
return 1;
}
+void db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
+{
+ return;
+}
#endif /* HAVE_BACULA_DB */
#include "protos.h"
#include "jcr.h"
+#include "sql_cmds.h"
/*
* Some functions exported by sql.c for use within the
* cats directory.
*/
-void list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type);
+void list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type);
void list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx);
int get_sql_record_max(JCR *jcr, B_DB *mdb);
bool check_tables_version(JCR *jcr, B_DB *mdb);
void _db_unlock(const char *file, int line, B_DB *mdb);
void _db_lock(const char *file, int line, B_DB *mdb);
+void print_dashes(B_DB *mdb);
+void print_result(B_DB *mdb);
+int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
+int InsertDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
+int DeleteDB(const char *file, int line, JCR *jcr, B_DB *db, char *delete_cmd);
+int UpdateDB(const char *file, int line, JCR *jcr, B_DB *db, char *update_cmd);
+void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname);
#endif /* __SQL_H_ */
--- /dev/null
+/*
+ *
+ * This file contains all the SQL commands issued by the Director
+ *
+ * Kern Sibbald, July MMII
+ *
+ * Version $Id$
+ */
+/*
+ Copyright (C) 2002-2006 Kern Sibbald
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as amended with additional clauses defined in the
+ file LICENSE in the main source directory.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ the file LICENSE for additional details.
+
+ */
+
+#include "bacula.h"
+#include "cats.h"
+
+/* For ua_cmds.c */
+const char *list_pool = "SELECT * FROM Pool WHERE PoolId=%s";
+
+/* For ua_dotcmds.c */
+const char *client_backups =
+ "SELECT DISTINCT Job.JobId,Client.Name as Client,Level,StartTime,"
+ "JobFiles,JobBytes,VolumeName,MediaType,FileSet"
+ " FROM Client,Job,JobMedia,Media,FileSet"
+ " WHERE Client.Name='%s'"
+ " AND FileSet='%s'"
+ " AND Client.ClientId=Job.ClientId"
+ " AND JobStatus='T' AND Type='B'"
+ " AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId"
+ " AND Job.FileSetId=FileSet.FileSetId"
+ " ORDER BY Job.StartTime";
+
+
+/* ====== ua_prune.c */
+
+const char *del_File = "DELETE FROM File WHERE JobId=%s";
+const char *upd_Purged = "UPDATE Job Set PurgedFiles=1 WHERE JobId=%s";
+const char *cnt_DelCand = "SELECT count(*) FROM DelCandidates";
+const char *del_Job = "DELETE FROM Job WHERE JobId=%s";
+const char *del_MAC = "DELETE FROM MAC WHERE JobId=%s";
+const char *del_JobMedia = "DELETE FROM JobMedia WHERE JobId=%s";
+const char *cnt_JobMedia = "SELECT count(*) FROM JobMedia WHERE MediaId=%s";
+const char *sel_JobMedia = "SELECT JobId FROM JobMedia WHERE MediaId=%s";
+
+/* Select JobIds for File deletion. */
+const char *select_job =
+ "SELECT JobId from Job "
+ "WHERE JobTDate<%s "
+ "AND ClientId=%s "
+ "AND PurgedFiles=0";
+
+/* Delete temp tables and indexes */
+const char *drop_deltabs[] = {
+ "DROP TABLE DelCandidates",
+ "DROP INDEX DelInx1",
+ NULL};
+
+
+/* List of SQL commands to create temp table and indicies */
+const char *create_deltabs[] = {
+ "CREATE TEMPORARY TABLE DelCandidates ("
+#if defined(HAVE_MYSQL)
+ "JobId INTEGER UNSIGNED NOT NULL, "
+ "PurgedFiles TINYINT, "
+ "FileSetId INTEGER UNSIGNED, "
+ "JobFiles INTEGER UNSIGNED, "
+ "JobStatus BINARY(1))",
+#elif defined(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
+ "CREATE INDEX DelInx1 ON DelCandidates (JobId)",
+ NULL};
+
+/* Fill candidates table with all Jobs subject to being deleted.
+ * This is used for pruning Jobs (first the files, then the Jobs).
+ */
+const char *insert_delcand =
+ "INSERT INTO DelCandidates "
+ "SELECT JobId,PurgedFiles,FileSetId,JobFiles,JobStatus FROM Job "
+ "WHERE Type='%c' "
+ "AND JobTDate<%s "
+ "AND ClientId=%s";
+
+/* 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.
+ */
+const char *select_backup_del =
+ "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
+ "FROM Job,DelCandidates "
+ "WHERE (Job.JobTDate<%s AND ((DelCandidates.JobFiles=0) OR "
+ "(DelCandidates.JobStatus!='T'))) OR "
+ "(Job.JobTDate>%s "
+ "AND Job.ClientId=%s "
+ "AND Job.Level='F' AND Job.JobStatus='T' AND Job.Type='B' "
+ "AND Job.FileSetId=DelCandidates.FileSetId)";
+
+/* Select Jobs from the DelCandidates table that have a
+ * more recent InitCatalog -- i.e. are not the only InitCatalog
+ * This is the list of Jobs to delete for a Verify Job.
+ */
+const char *select_verify_del =
+ "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
+ "FROM Job,DelCandidates "
+ "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR "
+ "(Job.JobTDate>%s "
+ "AND Job.ClientId=%s "
+ "AND Job.Type='V' AND Job.Level='V' AND Job.JobStatus='T' "
+ "AND Job.FileSetId=DelCandidates.FileSetId)";
+
+
+/* Select Jobs from the DelCandidates table.
+ * This is the list of Jobs to delete for a Restore Job.
+ */
+const char *select_restore_del =
+ "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
+ "FROM Job,DelCandidates "
+ "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR "
+ "(Job.JobTDate>%s "
+ "AND Job.ClientId=%s "
+ "AND Job.Type='R')";
+
+/* Select Jobs from the DelCandidates table.
+ * This is the list of Jobs to delete for an Admin Job.
+ */
+const char *select_admin_del =
+ "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
+ "FROM Job,DelCandidates "
+ "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR "
+ "(Job.JobTDate>%s "
+ "AND Job.ClientId=%s "
+ "AND Job.Type='D')";
+
+
+/* ======= ua_restore.c */
+const char *uar_count_files =
+ "SELECT JobFiles FROM Job WHERE JobId=%s";
+
+/* List last 20 Jobs */
+const 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 DESC LIMIT 20";
+
+#ifdef HAVE_MYSQL
+/* MYSQL IS NOT STANDARD SQL !!!!! */
+/* List Jobs where a particular file is saved */
+const char *uar_file =
+ "SELECT Job.JobId as JobId,"
+ "CONCAT(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 Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
+ "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20";
+#else
+/* List Jobs where a particular file is saved */
+const char *uar_file =
+ "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 Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
+ "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20";
+#endif
+
+
+/*
+ * Find all files for a particular JobId and insert them into
+ * the tree during a restore.
+ */
+const char *uar_sel_files =
+ "SELECT Path.Path,Filename.Name,FileIndex,JobId,LStat "
+ "FROM File,Filename,Path "
+ "WHERE File.JobId=%s AND Filename.FilenameId=File.FilenameId "
+ "AND Path.PathId=File.PathId";
+
+const char *uar_del_temp = "DROP TABLE temp";
+const char *uar_del_temp1 = "DROP TABLE temp1";
+
+const char *uar_create_temp =
+ "CREATE TEMPORARY TABLE temp ("
+#ifdef HAVE_POSTGRESQL
+ "JobId INTEGER NOT NULL,"
+ "JobTDate BIGINT,"
+ "ClientId INTEGER,"
+ "Level CHAR,"
+ "JobFiles INTEGER,"
+ "JobBytes BIGINT,"
+ "StartTime TEXT,"
+ "VolumeName TEXT,"
+ "StartFile INTEGER,"
+ "VolSessionId INTEGER,"
+ "VolSessionTime INTEGER)";
+#else
+ "JobId INTEGER UNSIGNED NOT NULL,"
+ "JobTDate BIGINT UNSIGNED,"
+ "ClientId INTEGER UNSIGNED,"
+ "Level CHAR,"
+ "JobFiles INTEGER UNSIGNED,"
+ "JobBytes BIGINT UNSIGNED,"
+ "StartTime TEXT,"
+ "VolumeName TEXT,"
+ "StartFile INTEGER UNSIGNED,"
+ "VolSessionId INTEGER UNSIGNED,"
+ "VolSessionTime INTEGER UNSIGNED)";
+#endif
+
+const char *uar_create_temp1 =
+ "CREATE TEMPORARY TABLE temp1 ("
+#ifdef HAVE_POSTGRESQL
+ "JobId INTEGER NOT NULL,"
+ "JobTDate BIGINT)";
+#else
+ "JobId INTEGER UNSIGNED NOT NULL,"
+ "JobTDate BIGINT UNSIGNED)";
+#endif
+
+const char *uar_last_full =
+ "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 Level='F' AND JobStatus='T' AND Type='B' "
+ "AND JobMedia.JobId=Job.JobId "
+ "AND JobMedia.MediaId=Media.MediaId "
+ "AND Job.FileSetId=FileSet.FileSetId "
+ "AND FileSet.FileSet='%s' "
+ "%s"
+ "ORDER BY Job.JobTDate DESC LIMIT 1";
+
+const char *uar_full =
+ "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,"
+ "Job.ClientId,Job.Level,Job.JobFiles,Job.JobBytes,"
+ "StartTime,VolumeName,JobMedia.StartFile,VolSessionId,VolSessionTime "
+ "FROM temp1,Job,JobMedia,Media WHERE temp1.JobId=Job.JobId "
+ "AND Level='F' AND JobStatus='T' AND Type='B' "
+ "AND JobMedia.JobId=Job.JobId "
+ "AND JobMedia.MediaId=Media.MediaId";
+
+const char *uar_dif =
+ "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId,"
+ "Job.Level,Job.JobFiles,Job.JobBytes,"
+ "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=%s "
+ "AND JobMedia.JobId=Job.JobId "
+ "AND JobMedia.MediaId=Media.MediaId "
+ "AND Job.Level='D' AND JobStatus='T' AND Type='B' "
+ "AND Job.FileSetId=FileSet.FileSetId "
+ "AND FileSet.FileSet='%s' "
+ "%s"
+ "ORDER BY Job.JobTDate DESC LIMIT 1";
+
+const char *uar_inc =
+ "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId,"
+ "Job.Level,Job.JobFiles,Job.JobBytes,"
+ "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=%s "
+ "AND JobMedia.JobId=Job.JobId "
+ "AND JobMedia.MediaId=Media.MediaId "
+ "AND Job.Level='I' AND JobStatus='T' AND Type='B' "
+ "AND Job.FileSetId=FileSet.FileSetId "
+ "AND FileSet.FileSet='%s' "
+ "%s";
+
+#ifdef HAVE_POSTGRESQL
+/* Note, the PostgreSQL will have a much uglier looking
+ * list since it cannot do GROUP BY of different values.
+ */
+const char *uar_list_temp =
+ "SELECT JobId,Level,JobFiles,JobBytes,StartTime,VolumeName,StartFile"
+ " FROM temp"
+ " ORDER BY StartTime,StartFile ASC";
+#else
+const char *uar_list_temp =
+ "SELECT JobId,Level,JobFiles,JobBytes,StartTime,VolumeName,StartFile"
+ " FROM temp"
+ " GROUP BY JobId ORDER BY StartTime,StartFile ASC";
+#endif
+
+
+const char *uar_sel_jobid_temp = "SELECT JobId FROM temp ORDER BY StartTime ASC";
+
+const char *uar_sel_all_temp1 = "SELECT * FROM temp1";
+
+const char *uar_sel_all_temp = "SELECT * FROM temp";
+
+
+
+/* Select FileSet names for this Client */
+const char *uar_sel_fileset =
+ "SELECT DISTINCT FileSet.FileSet FROM Job,"
+ "Client,FileSet WHERE Job.FileSetId=FileSet.FileSetId "
+ "AND Job.ClientId=%s AND Client.ClientId=%s "
+ "ORDER BY FileSet.FileSet";
+
+/* Find MediaType used by this Job */
+const char *uar_mediatype =
+ "SELECT MediaType FROM JobMedia,Media WHERE JobMedia.JobId=%s "
+ "AND JobMedia.MediaId=Media.MediaId";
+
+/*
+ * Find JobId, FileIndex for a given path/file and date
+ * for use when inserting individual files into the tree.
+ */
+const 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 Job.ClientId=Client.ClientId "
+ "AND Path.PathId=File.PathId "
+ "AND Filename.FilenameId=File.FilenameId "
+ "ORDER BY Job.StartTime DESC LIMIT 1";
+
+const char *uar_jobids_fileindex =
+ "SELECT Job.JobId, File.FileIndex FROM Job,File,Path,Filename,Client "
+ "WHERE Job.JobId IN (%s) "
+ "AND Job.JobId=File.JobId "
+ "AND Job.StartTime<'%s' "
+ "AND Path.Path='%s' "
+ "AND Filename.Name='%s' "
+ "AND Client.Name='%s' "
+ "AND Job.ClientId=Client.ClientId "
+ "AND Path.PathId=File.PathId "
+ "AND Filename.FilenameId=File.FilenameId "
+ "ORDER BY Job.StartTime DESC LIMIT 1";
+
+/* Query to get all files in a directory -- no recursing
+ * Note, for PostgreSQL since it respects the "Single Value
+ * rule", the results of the SELECT will be unoptimized.
+ * I.e. the same file will be restored multiple times, once
+ * for each time it was backed up.
+ */
+
+#ifdef HAVE_POSTGRESQL
+const char *uar_jobid_fileindex_from_dir =
+ "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";
+#else
+const char *uar_jobid_fileindex_from_dir =
+ "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 "
+ "GROUP BY File.FileIndex ";
+#endif
+
+/* Query to get list of files from table -- presuably built by an external program */
+const char *uar_jobid_fileindex_from_table =
+ "SELECT JobId, FileIndex from %s";
--- /dev/null
+/*
+ Copyright (C) 2000-2006 Kern Sibbald
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as amended with additional clauses defined in the
+ file LICENSE in the main source directory.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ the file LICENSE for additional details.
+
+ */
+
+extern const char CATS_IMP_EXP *client_backups;
+extern const char CATS_IMP_EXP *list_pool;
+extern const char CATS_IMP_EXP *drop_deltabs[];
+extern const char CATS_IMP_EXP *create_deltabs[];
+extern const char CATS_IMP_EXP *insert_delcand;
+extern const char CATS_IMP_EXP *select_backup_del;
+extern const char CATS_IMP_EXP *select_verify_del;
+extern const char CATS_IMP_EXP *select_restore_del;
+extern const char CATS_IMP_EXP *select_admin_del;
+extern const char CATS_IMP_EXP *select_job;
+extern const char CATS_IMP_EXP *del_File;
+extern const char CATS_IMP_EXP *cnt_File;
+extern const char CATS_IMP_EXP *cnt_DelCand;
+extern const char CATS_IMP_EXP *del_Job;
+extern const char CATS_IMP_EXP *del_MAC;
+extern const char CATS_IMP_EXP *del_JobMedia;
+extern const char CATS_IMP_EXP *cnt_JobMedia;
+extern const char CATS_IMP_EXP *sel_JobMedia;
+extern const char CATS_IMP_EXP *upd_Purged;
+
+extern const char CATS_IMP_EXP *uar_list_jobs;
+extern const char CATS_IMP_EXP *uar_file;
+extern const char CATS_IMP_EXP *uar_count_files;
+extern const char CATS_IMP_EXP *uar_sel_files;
+extern const char CATS_IMP_EXP *uar_del_temp;
+extern const char CATS_IMP_EXP *uar_del_temp1;
+extern const char CATS_IMP_EXP *uar_create_temp;
+extern const char CATS_IMP_EXP *uar_create_temp1;
+extern const char CATS_IMP_EXP *uar_last_full;
+extern const char CATS_IMP_EXP *uar_full;
+extern const char CATS_IMP_EXP *uar_inc;
+extern const char CATS_IMP_EXP *uar_list_temp;
+extern const char CATS_IMP_EXP *uar_sel_all_temp1;
+extern const char CATS_IMP_EXP *uar_sel_fileset;
+extern const char CATS_IMP_EXP *uar_mediatype;
+extern const char CATS_IMP_EXP *uar_jobid_fileindex;
+extern const char CATS_IMP_EXP *uar_dif;
+extern const char CATS_IMP_EXP *uar_sel_all_temp;
+extern const char CATS_IMP_EXP *uar_count_files;
+extern const char CATS_IMP_EXP *uar_jobids_fileindex;
+extern const char CATS_IMP_EXP *uar_jobid_fileindex_from_dir;
+extern const char CATS_IMP_EXP *uar_jobid_fileindex_from_table;
+extern const char CATS_IMP_EXP *uar_sel_jobid_temp;
static int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
-/* Imported subroutines */
-extern void print_dashes(B_DB *mdb);
-extern void print_result(B_DB *mdb);
-extern int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
-extern int InsertDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
-extern int UpdateDB(const char *file, int line, JCR *jcr, B_DB *db, char *update_cmd);
-extern void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname);
-
-
/* Create a new record for the Job
* Returns: false on failure
* true on success
* -----------------------------------------------------------------------
*/
-/* Imported subroutines */
-extern void print_dashes(B_DB *mdb);
-extern void print_result(B_DB *mdb);
-extern int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
-extern int DeleteDB(const char *file, int line, JCR *jcr, B_DB *db, char *delete_cmd);
-
/*
* Delete Pool record, must also delete all associated
* Media records.
* -----------------------------------------------------------------------
*/
-/* Imported subroutines */
-extern void print_result(B_DB *mdb);
-extern int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
-
/*
* Find job start time if JobId specified, otherwise
* find last full save for Incremental and Differential saves.
static int db_get_path_record(JCR *jcr, B_DB *mdb);
-/* Imported subroutines */
-extern void print_result(B_DB *mdb);
-extern int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
-extern void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname);
-
-
-
/*
* Given a full filename (with path), look up the File record
* (with attributes) in the database.
* -----------------------------------------------------------------------
*/
-/* Imported subroutines */
-extern void list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
-extern int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
-
-
/*
* Submit general SQL query
*/
* -----------------------------------------------------------------------
*/
-/* Imported subroutines */
-extern void print_result(B_DB *mdb);
-extern int UpdateDB(const char *file, int line, JCR *jcr, B_DB *db, char *update_cmd);
-
/* -----------------------------------------------------------------------
*
* Generic Routines (or almost generic)
}
}
-#else
-
-void
-db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
-{
- /* DUMMY func for Bacula_DB */
- return;
-}
-
#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/
* -----------------------------------------------------------------------
*/
-extern const char *working_directory;
-
/* List of open databases */
static BQUEUE db_list = {&db_list, &db_list};
mountreq.c msgchan.c next_vol.c newvol.c \
pythondir.c \
recycle.c restore.c run_conf.c \
- scheduler.c sql_cmds.c \
+ scheduler.c \
ua_acl.c ua_cmds.c ua_dotcmds.c \
ua_query.c \
ua_input.c ua_label.c ua_output.c ua_prune.c \
mountreq.o msgchan.o next_vol.o newvol.o \
pythondir.o \
recycle.o restore.o run_conf.o \
- scheduler.o sql_cmds.o \
+ scheduler.o \
ua_acl.o ua_cmds.o ua_dotcmds.o \
ua_query.o \
ua_input.o ua_label.o ua_output.o ua_prune.o \
+++ /dev/null
-/*
- *
- * This file contains all the SQL commands issued by the Director
- *
- * Kern Sibbald, July MMII
- *
- * Version $Id$
- */
-/*
- Copyright (C) 2002-2006 Kern Sibbald
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as amended with additional clauses defined in the
- file LICENSE in the main source directory.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- the file LICENSE for additional details.
-
- */
-
-#include "bacula.h"
-#include "dird.h"
-
-/* For ua_cmds.c */
-const char *list_pool = "SELECT * FROM Pool WHERE PoolId=%s";
-
-/* For ua_dotcmds.c */
-const char *client_backups =
- "SELECT DISTINCT Job.JobId,Client.Name as Client,Level,StartTime,"
- "JobFiles,JobBytes,VolumeName,MediaType,FileSet"
- " FROM Client,Job,JobMedia,Media,FileSet"
- " WHERE Client.Name='%s'"
- " AND FileSet='%s'"
- " AND Client.ClientId=Job.ClientId"
- " AND JobStatus='T' AND Type='B'"
- " AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId"
- " AND Job.FileSetId=FileSet.FileSetId"
- " ORDER BY Job.StartTime";
-
-
-/* ====== ua_prune.c */
-
-const char *del_File = "DELETE FROM File WHERE JobId=%s";
-const char *upd_Purged = "UPDATE Job Set PurgedFiles=1 WHERE JobId=%s";
-const char *cnt_DelCand = "SELECT count(*) FROM DelCandidates";
-const char *del_Job = "DELETE FROM Job WHERE JobId=%s";
-const char *del_MAC = "DELETE FROM MAC WHERE JobId=%s";
-const char *del_JobMedia = "DELETE FROM JobMedia WHERE JobId=%s";
-const char *cnt_JobMedia = "SELECT count(*) FROM JobMedia WHERE MediaId=%s";
-const char *sel_JobMedia = "SELECT JobId FROM JobMedia WHERE MediaId=%s";
-
-/* Select JobIds for File deletion. */
-const char *select_job =
- "SELECT JobId from Job "
- "WHERE JobTDate<%s "
- "AND ClientId=%s "
- "AND PurgedFiles=0";
-
-/* Delete temp tables and indexes */
-const char *drop_deltabs[] = {
- "DROP TABLE DelCandidates",
- "DROP INDEX DelInx1",
- NULL};
-
-
-/* List of SQL commands to create temp table and indicies */
-const char *create_deltabs[] = {
- "CREATE TEMPORARY TABLE DelCandidates ("
-#if defined(HAVE_MYSQL)
- "JobId INTEGER UNSIGNED NOT NULL, "
- "PurgedFiles TINYINT, "
- "FileSetId INTEGER UNSIGNED, "
- "JobFiles INTEGER UNSIGNED, "
- "JobStatus BINARY(1))",
-#elif defined(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
- "CREATE INDEX DelInx1 ON DelCandidates (JobId)",
- NULL};
-
-/* Fill candidates table with all Jobs subject to being deleted.
- * This is used for pruning Jobs (first the files, then the Jobs).
- */
-const char *insert_delcand =
- "INSERT INTO DelCandidates "
- "SELECT JobId,PurgedFiles,FileSetId,JobFiles,JobStatus FROM Job "
- "WHERE Type='%c' "
- "AND JobTDate<%s "
- "AND ClientId=%s";
-
-/* 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.
- */
-const char *select_backup_del =
- "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
- "FROM Job,DelCandidates "
- "WHERE (Job.JobTDate<%s AND ((DelCandidates.JobFiles=0) OR "
- "(DelCandidates.JobStatus!='T'))) OR "
- "(Job.JobTDate>%s "
- "AND Job.ClientId=%s "
- "AND Job.Level='F' AND Job.JobStatus='T' AND Job.Type='B' "
- "AND Job.FileSetId=DelCandidates.FileSetId)";
-
-/* Select Jobs from the DelCandidates table that have a
- * more recent InitCatalog -- i.e. are not the only InitCatalog
- * This is the list of Jobs to delete for a Verify Job.
- */
-const char *select_verify_del =
- "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
- "FROM Job,DelCandidates "
- "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR "
- "(Job.JobTDate>%s "
- "AND Job.ClientId=%s "
- "AND Job.Type='V' AND Job.Level='V' AND Job.JobStatus='T' "
- "AND Job.FileSetId=DelCandidates.FileSetId)";
-
-
-/* Select Jobs from the DelCandidates table.
- * This is the list of Jobs to delete for a Restore Job.
- */
-const char *select_restore_del =
- "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
- "FROM Job,DelCandidates "
- "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR "
- "(Job.JobTDate>%s "
- "AND Job.ClientId=%s "
- "AND Job.Type='R')";
-
-/* Select Jobs from the DelCandidates table.
- * This is the list of Jobs to delete for an Admin Job.
- */
-const char *select_admin_del =
- "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles "
- "FROM Job,DelCandidates "
- "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR "
- "(Job.JobTDate>%s "
- "AND Job.ClientId=%s "
- "AND Job.Type='D')";
-
-
-/* ======= ua_restore.c */
-const char *uar_count_files =
- "SELECT JobFiles FROM Job WHERE JobId=%s";
-
-/* List last 20 Jobs */
-const 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 DESC LIMIT 20";
-
-#ifdef HAVE_MYSQL
-/* MYSQL IS NOT STANDARD SQL !!!!! */
-/* List Jobs where a particular file is saved */
-const char *uar_file =
- "SELECT Job.JobId as JobId,"
- "CONCAT(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 Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
- "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20";
-#else
-/* List Jobs where a particular file is saved */
-const char *uar_file =
- "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 Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
- "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20";
-#endif
-
-
-/*
- * Find all files for a particular JobId and insert them into
- * the tree during a restore.
- */
-const char *uar_sel_files =
- "SELECT Path.Path,Filename.Name,FileIndex,JobId,LStat "
- "FROM File,Filename,Path "
- "WHERE File.JobId=%s AND Filename.FilenameId=File.FilenameId "
- "AND Path.PathId=File.PathId";
-
-const char *uar_del_temp = "DROP TABLE temp";
-const char *uar_del_temp1 = "DROP TABLE temp1";
-
-const char *uar_create_temp =
- "CREATE TEMPORARY TABLE temp ("
-#ifdef HAVE_POSTGRESQL
- "JobId INTEGER NOT NULL,"
- "JobTDate BIGINT,"
- "ClientId INTEGER,"
- "Level CHAR,"
- "JobFiles INTEGER,"
- "JobBytes BIGINT,"
- "StartTime TEXT,"
- "VolumeName TEXT,"
- "StartFile INTEGER,"
- "VolSessionId INTEGER,"
- "VolSessionTime INTEGER)";
-#else
- "JobId INTEGER UNSIGNED NOT NULL,"
- "JobTDate BIGINT UNSIGNED,"
- "ClientId INTEGER UNSIGNED,"
- "Level CHAR,"
- "JobFiles INTEGER UNSIGNED,"
- "JobBytes BIGINT UNSIGNED,"
- "StartTime TEXT,"
- "VolumeName TEXT,"
- "StartFile INTEGER UNSIGNED,"
- "VolSessionId INTEGER UNSIGNED,"
- "VolSessionTime INTEGER UNSIGNED)";
-#endif
-
-const char *uar_create_temp1 =
- "CREATE TEMPORARY TABLE temp1 ("
-#ifdef HAVE_POSTGRESQL
- "JobId INTEGER NOT NULL,"
- "JobTDate BIGINT)";
-#else
- "JobId INTEGER UNSIGNED NOT NULL,"
- "JobTDate BIGINT UNSIGNED)";
-#endif
-
-const char *uar_last_full =
- "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 Level='F' AND JobStatus='T' AND Type='B' "
- "AND JobMedia.JobId=Job.JobId "
- "AND JobMedia.MediaId=Media.MediaId "
- "AND Job.FileSetId=FileSet.FileSetId "
- "AND FileSet.FileSet='%s' "
- "%s"
- "ORDER BY Job.JobTDate DESC LIMIT 1";
-
-const char *uar_full =
- "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,"
- "Job.ClientId,Job.Level,Job.JobFiles,Job.JobBytes,"
- "StartTime,VolumeName,JobMedia.StartFile,VolSessionId,VolSessionTime "
- "FROM temp1,Job,JobMedia,Media WHERE temp1.JobId=Job.JobId "
- "AND Level='F' AND JobStatus='T' AND Type='B' "
- "AND JobMedia.JobId=Job.JobId "
- "AND JobMedia.MediaId=Media.MediaId";
-
-const char *uar_dif =
- "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId,"
- "Job.Level,Job.JobFiles,Job.JobBytes,"
- "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=%s "
- "AND JobMedia.JobId=Job.JobId "
- "AND JobMedia.MediaId=Media.MediaId "
- "AND Job.Level='D' AND JobStatus='T' AND Type='B' "
- "AND Job.FileSetId=FileSet.FileSetId "
- "AND FileSet.FileSet='%s' "
- "%s"
- "ORDER BY Job.JobTDate DESC LIMIT 1";
-
-const char *uar_inc =
- "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId,"
- "Job.Level,Job.JobFiles,Job.JobBytes,"
- "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=%s "
- "AND JobMedia.JobId=Job.JobId "
- "AND JobMedia.MediaId=Media.MediaId "
- "AND Job.Level='I' AND JobStatus='T' AND Type='B' "
- "AND Job.FileSetId=FileSet.FileSetId "
- "AND FileSet.FileSet='%s' "
- "%s";
-
-#ifdef HAVE_POSTGRESQL
-/* Note, the PostgreSQL will have a much uglier looking
- * list since it cannot do GROUP BY of different values.
- */
-const char *uar_list_temp =
- "SELECT JobId,Level,JobFiles,JobBytes,StartTime,VolumeName,StartFile"
- " FROM temp"
- " ORDER BY StartTime,StartFile ASC";
-#else
-const char *uar_list_temp =
- "SELECT JobId,Level,JobFiles,JobBytes,StartTime,VolumeName,StartFile"
- " FROM temp"
- " GROUP BY JobId ORDER BY StartTime,StartFile ASC";
-#endif
-
-
-const char *uar_sel_jobid_temp = "SELECT JobId FROM temp ORDER BY StartTime ASC";
-
-const char *uar_sel_all_temp1 = "SELECT * FROM temp1";
-
-const char *uar_sel_all_temp = "SELECT * FROM temp";
-
-
-
-/* Select FileSet names for this Client */
-const char *uar_sel_fileset =
- "SELECT DISTINCT FileSet.FileSet FROM Job,"
- "Client,FileSet WHERE Job.FileSetId=FileSet.FileSetId "
- "AND Job.ClientId=%s AND Client.ClientId=%s "
- "ORDER BY FileSet.FileSet";
-
-/* Find MediaType used by this Job */
-const char *uar_mediatype =
- "SELECT MediaType FROM JobMedia,Media WHERE JobMedia.JobId=%s "
- "AND JobMedia.MediaId=Media.MediaId";
-
-/*
- * Find JobId, FileIndex for a given path/file and date
- * for use when inserting individual files into the tree.
- */
-const 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 Job.ClientId=Client.ClientId "
- "AND Path.PathId=File.PathId "
- "AND Filename.FilenameId=File.FilenameId "
- "ORDER BY Job.StartTime DESC LIMIT 1";
-
-const char *uar_jobids_fileindex =
- "SELECT Job.JobId, File.FileIndex FROM Job,File,Path,Filename,Client "
- "WHERE Job.JobId IN (%s) "
- "AND Job.JobId=File.JobId "
- "AND Job.StartTime<'%s' "
- "AND Path.Path='%s' "
- "AND Filename.Name='%s' "
- "AND Client.Name='%s' "
- "AND Job.ClientId=Client.ClientId "
- "AND Path.PathId=File.PathId "
- "AND Filename.FilenameId=File.FilenameId "
- "ORDER BY Job.StartTime DESC LIMIT 1";
-
-/* Query to get all files in a directory -- no recursing
- * Note, for PostgreSQL since it respects the "Single Value
- * rule", the results of the SELECT will be unoptimized.
- * I.e. the same file will be restored multiple times, once
- * for each time it was backed up.
- */
-
-#ifdef HAVE_POSTGRESQL
-const char *uar_jobid_fileindex_from_dir =
- "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";
-#else
-const char *uar_jobid_fileindex_from_dir =
- "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 "
- "GROUP BY File.FileIndex ";
-#endif
-
-/* Query to get list of files from table -- presuably built by an external program */
-const char *uar_jobid_fileindex_from_table =
- "SELECT JobId, FileIndex from %s";
extern int r_first;
extern int r_last;
extern struct s_res resources[];
-extern const char *client_backups;
/* Imported functions */
extern void do_messages(UAContext *ua, const char *cmd);
#define MAX_DEL_LIST_LEN 2000000
-/* Imported variables */
-extern const char *select_job;
-extern const char *drop_deltabs[];
-extern const char *create_deltabs[];
-extern const char *insert_delcand;
-extern const char *select_backup_del;
-extern const char *select_verify_del;
-extern const char *select_restore_del;
-extern const char *select_admin_del;
-extern const char *cnt_File;
-extern const char *cnt_DelCand;
-extern const char *del_Job;
-extern const char *del_MAC;
-extern const char *del_JobMedia;
-extern const char *cnt_JobMedia;
-extern const char *sel_JobMedia;
-
-
/* In memory list of JobIds */
struct s_file_del_ctx {
JobId_t *JobId;
#include "bacula.h"
#include "dird.h"
-extern const char *del_File;
-extern const char *upd_Purged;
-
/* Forward referenced functions */
static int purge_files_from_client(UAContext *ua, CLIENT *client);
static int purge_jobs_from_client(UAContext *ua, CLIENT *client);
/* Imported functions */
extern void print_bsr(UAContext *ua, RBSR *bsr);
-/* Imported variables */
-extern const char *uar_list_jobs, *uar_file, *uar_sel_files;
-extern const char *uar_del_temp, *uar_del_temp1, *uar_create_temp;
-extern const char *uar_create_temp1, *uar_last_full, *uar_full;
-extern const char *uar_inc, *uar_list_temp, *uar_sel_jobid_temp;
-extern const char *uar_sel_all_temp1, *uar_sel_fileset, *uar_mediatype;
-extern const char *uar_jobid_fileindex, *uar_dif, *uar_sel_all_temp;
-extern const char *uar_count_files, *uar_jobids_fileindex;
-extern const char *uar_jobid_fileindex_from_dir;
-extern const char *uar_jobid_fileindex_from_table;
-
/* Forward referenced functions */
#include "bacula.h"
#include "dird.h"
-/* External variables */
-extern const char *list_pool; /* in sql_cmds.c */
-
/* Imported functions */
void update_slots(UAContext *ua);