+static void eliminate_orphaned_job_records()
+{
+ const char *query;
+
+ printf("Checking for orphaned Job entries.\n");
+ /* In English:
+ * Wiffle through Job for every Job
+ * joining with the Client table including every Job even if
+ * there is not a match in Client (left outer join), then
+ * filter out only those where no Client exists
+ * i.e. Client.Name is NULL
+ */
+ query = "SELECT Job.JobId,Job.Name FROM Job "
+ "LEFT OUTER JOIN Client ON (Job.ClientId=Client.ClientId) "
+ "WHERE Client.Name IS NULL";
+ if (verbose > 1) {
+ printf("%s\n", query);
+ }
+ if (!make_id_list(query, &id_list)) {
+ exit(1);
+ }
+ printf("Found %d orphaned Job records.\n", id_list.num_ids);
+ if (id_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
+ for (int i=0; i < id_list.num_ids; i++) {
+ bsnprintf(buf, sizeof(buf), "SELECT JobId,Name,StartTime FROM Job "
+ "WHERE JobId=%u", id_list.Id[i]);
+ if (!db_sql_query(db, buf, print_job_handler, NULL)) {
+ printf("%s\n", db_strerror(db));
+ }
+ }
+ }
+
+ if (fix && id_list.num_ids > 0) {
+ printf("Deleting %d orphaned Job records.\n", id_list.num_ids);
+ delete_id_list("DELETE FROM Job WHERE JobId=%u", &id_list);
+ }
+}
+
+
+static void eliminate_admin_records()
+{
+ const char *query;
+
+ printf("Checking for Admin Job entries.\n");
+ query = "SELECT Job.JobId FROM Job "
+ "WHERE Job.Type='D'";
+ if (verbose > 1) {
+ printf("%s\n", query);
+ }
+ if (!make_id_list(query, &id_list)) {
+ exit(1);
+ }
+ printf("Found %d Admin Job records.\n", id_list.num_ids);
+ if (id_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
+ for (int i=0; i < id_list.num_ids; i++) {
+ bsnprintf(buf, sizeof(buf), "SELECT JobId,Name,StartTime FROM Job "
+ "WHERE JobId=%u", id_list.Id[i]);
+ if (!db_sql_query(db, buf, print_job_handler, NULL)) {
+ printf("%s\n", db_strerror(db));
+ }
+ }
+ }
+
+ if (fix && id_list.num_ids > 0) {
+ printf("Deleting %d Admin Job records.\n", id_list.num_ids);
+ delete_id_list("DELETE FROM Job WHERE JobId=%u", &id_list);
+ }
+}
+
+static void eliminate_restore_records()
+{
+ const char *query;
+
+ printf("Checking for Restore Job entries.\n");
+ query = "SELECT Job.JobId FROM Job "
+ "WHERE Job.Type='R'";
+ if (verbose > 1) {
+ printf("%s\n", query);
+ }
+ if (!make_id_list(query, &id_list)) {
+ exit(1);
+ }
+ printf("Found %d Restore Job records.\n", id_list.num_ids);
+ if (id_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
+ for (int i=0; i < id_list.num_ids; i++) {
+ bsnprintf(buf, sizeof(buf), "SELECT JobId,Name,StartTime FROM Job "
+ "WHERE JobId=%u", id_list.Id[i]);
+ if (!db_sql_query(db, buf, print_job_handler, NULL)) {
+ printf("%s\n", db_strerror(db));
+ }
+ }
+ }
+
+ if (fix && id_list.num_ids > 0) {
+ printf("Deleting %d Restore Job records.\n", id_list.num_ids);
+ delete_id_list("DELETE FROM Job WHERE JobId=%u", &id_list);
+ }
+}
+
+
+