]> git.sur5r.net Git - bacula/bacula/commitdiff
- Add eliminate orphaned job records; eliminate admin records,
authorKern Sibbald <kern@sibbald.com>
Thu, 2 Sep 2004 08:34:44 +0000 (08:34 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 2 Sep 2004 08:34:44 +0000 (08:34 +0000)
  and eliminate restore records to dbcheck.
- replace sprintf by bsnprintf() in dbcheck.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1577 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/projects
bacula/src/tools/dbcheck.c
bacula/src/version.h

index 9a635e8814607ba07dc6f71b92d26ade4aea887a..b2c19e1b352603a56216e0dddf19be4a585ad619 100644 (file)
@@ -185,6 +185,6 @@ Item 9:   Add SSL to daemon communications (For now, implement with
 Item 10:  Define definitive tape format (done)
 Item 3:   GUI for interactive restore. Partially Implemented in 1.34
           Note, there is now a complete Webmin plugin, a partial
 Item 10:  Define definitive tape format (done)
 Item 3:   GUI for interactive restore. Partially Implemented in 1.34
           Note, there is now a complete Webmin plugin, a partial
-          GNOME console, and a partial wxWidgets console.
+          GNOME console, and an excellent wx-console GUI.
 Item 4:   GUI for interactive backup
 Item 2:   Job Data Spooling.
 Item 4:   GUI for interactive backup
 Item 2:   Job Data Spooling.
index a692853dd9dd7559a97555c3a54b48dd32adb197..0553ee4a2c727b9b8e213c21d80e98b741a382ac 100644 (file)
@@ -9,7 +9,7 @@
  *
  */
 /*
  *
  */
 /*
-   Copyright (C) 2000-2004 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
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -75,6 +75,9 @@ static void eliminate_orphaned_path_records();
 static void eliminate_orphaned_filename_records();
 static void eliminate_orphaned_fileset_records();
 static void eliminate_orphaned_client_records();
 static void eliminate_orphaned_filename_records();
 static void eliminate_orphaned_fileset_records();
 static void eliminate_orphaned_client_records();
+static void eliminate_orphaned_job_records();
+static void eliminate_admin_records();
+static void eliminate_restore_records();
 static void repair_bad_paths();
 static void repair_bad_filenames();
 static void do_interactive_mode();
 static void repair_bad_paths();
 static void repair_bad_filenames();
 static void do_interactive_mode();
@@ -242,6 +245,9 @@ int main (int argc, char *argv[])
       eliminate_orphaned_filename_records();
       eliminate_orphaned_fileset_records();
       eliminate_orphaned_client_records();
       eliminate_orphaned_filename_records();
       eliminate_orphaned_fileset_records();
       eliminate_orphaned_client_records();
+      eliminate_orphaned_job_records();
+      eliminate_admin_records();
+      eliminate_restore_records();
    } else {
       do_interactive_mode();
    }
    } else {
       do_interactive_mode();
    }
@@ -277,8 +283,11 @@ Please select the fuction you want to perform.\n",
     10) Eliminate orphaned Filename records\n\
     11) Eliminate orphaned FileSet records\n\
     12) Eliminate orphaned Client records\n\
     10) Eliminate orphaned Filename records\n\
     11) Eliminate orphaned FileSet records\n\
     12) Eliminate orphaned Client records\n\
-    13) All (3-12)\n\
-    14) Quit\n"));
+    13) Eliminate orphaned Job records\n\
+    14) Eliminate all Admin records\n\
+    15) Eliminate all Restore records\n\
+    16) All (3-15)\n\
+    17) Quit\n"));
        } else {
          printf(_("\n\
      1) Toggle modify database flag\n\
        } else {
          printf(_("\n\
      1) Toggle modify database flag\n\
@@ -292,9 +301,12 @@ Please select the fuction you want to perform.\n",
      9) Check for orphaned Path records\n\
     10) Check for orphaned Filename records\n\
     11) Check for orphaned FileSet records\n\
      9) Check for orphaned Path records\n\
     10) Check for orphaned Filename records\n\
     11) Check for orphaned FileSet records\n\
-    12) Check for orphaned FileSet records\n\
-    13) All (3-12)\n\
-    14) Quit\n"));
+    12) Check for orphaned Client records\n\
+    13) Check for orphaned Job records\n\
+    14) Check for all Admin records\n\
+    15) Check for all Restore records\n\
+    16) All (3-15)\n\
+    17) Quit\n"));
        }
 
       cmd = get_cmd(_("Select function number: "));
        }
 
       cmd = get_cmd(_("Select function number: "));
@@ -340,6 +352,15 @@ Please select the fuction you want to perform.\n",
            eliminate_orphaned_client_records();
            break;
         case 13:
            eliminate_orphaned_client_records();
            break;
         case 13:
+           eliminate_orphaned_job_records();
+           break;
+        case 14:
+           eliminate_admin_records();
+           break;
+        case 15:
+           eliminate_restore_records();
+           break;
+        case 16:
            repair_bad_filenames();
            repair_bad_paths();
            eliminate_duplicate_filenames();
            repair_bad_filenames();
            repair_bad_paths();
            eliminate_duplicate_filenames();
@@ -350,8 +371,11 @@ Please select the fuction you want to perform.\n",
            eliminate_orphaned_filename_records();
            eliminate_orphaned_fileset_records();
            eliminate_orphaned_client_records();
            eliminate_orphaned_filename_records();
            eliminate_orphaned_fileset_records();
            eliminate_orphaned_client_records();
+           eliminate_orphaned_job_records();
+           eliminate_admin_records();
+           eliminate_restore_records();
            break;
            break;
-        case 14:
+        case 17:
            quit = true;
            break;
         }
            quit = true;
            break;
         }
@@ -376,6 +400,13 @@ static int get_name_handler(void *ctx, int num_fields, char **row)
    return 0;
 }
 
    return 0;
 }
 
+static int print_job_handler(void *ctx, int num_fields, char **row)
+{
+   printf(_("JobId=%s Name=\"%s\" StartTime=%s\n"), 
+             NPRT(row[0]), NPRT(row[1]), NPRT(row[2]));
+   return 0;
+}
+
 
 static int print_jobmedia_handler(void *ctx, int num_fields, char **row)
 {
 
 static int print_jobmedia_handler(void *ctx, int num_fields, char **row)
 {
@@ -405,7 +436,6 @@ static int print_client_handler(void *ctx, int num_fields, char **row)
    return 0;
 }
 
    return 0;
 }
 
-
   
 /*
  * Called here with each id to be added to the list
   
 /*
  * Called here with each id to be added to the list
@@ -452,7 +482,7 @@ static int make_id_list(const char *query, ID_LIST *id_list)
 static int delete_id_list(const char *query, ID_LIST *id_list)
 { 
    for (int i=0; i < id_list->num_ids; i++) {
 static int delete_id_list(const char *query, ID_LIST *id_list)
 { 
    for (int i=0; i < id_list->num_ids; i++) {
-      sprintf(buf, query, id_list->Id[i]);
+      bsnprintf(buf, sizeof(buf), query, id_list->Id[i]);
       if (verbose) {
          printf("Deleting: %s\n", buf);
       }
       if (verbose) {
          printf("Deleting: %s\n", buf);
       }
@@ -546,7 +576,7 @@ static void eliminate_duplicate_filenames()
       for (int i=0; i<name_list.num_ids; i++) {
         /* Get all the Ids of each name */
         db_escape_string(esc_name, name_list.name[i], strlen(name_list.name[i]));
       for (int i=0; i<name_list.num_ids; i++) {
         /* Get all the Ids of each name */
         db_escape_string(esc_name, name_list.name[i], strlen(name_list.name[i]));
-         sprintf(buf, "SELECT FilenameId FROM Filename WHERE Name='%s'", esc_name);
+         bsnprintf(buf, sizeof(buf), "SELECT FilenameId FROM Filename WHERE Name='%s'", esc_name);
         if (verbose > 1) {
             printf("%s\n", buf);
         }
         if (verbose > 1) {
             printf("%s\n", buf);
         }
@@ -558,13 +588,13 @@ static void eliminate_duplicate_filenames()
         }
         /* Force all records to use the first id then delete the other ids */
         for (int j=1; j<id_list.num_ids; j++) {
         }
         /* Force all records to use the first id then delete the other ids */
         for (int j=1; j<id_list.num_ids; j++) {
-            sprintf(buf, "UPDATE File SET FilenameId=%u WHERE FilenameId=%u", 
+            bsnprintf(buf, sizeof(buf), "UPDATE File SET FilenameId=%u WHERE FilenameId=%u", 
               id_list.Id[0], id_list.Id[j]);
            if (verbose > 1) {
                printf("%s\n", buf);
            }
            db_sql_query(db, buf, NULL, NULL);
               id_list.Id[0], id_list.Id[j]);
            if (verbose > 1) {
                printf("%s\n", buf);
            }
            db_sql_query(db, buf, NULL, NULL);
-            sprintf(buf, "DELETE FROM Filename WHERE FilenameId=%u", 
+            bsnprintf(buf, sizeof(buf), "DELETE FROM Filename WHERE FilenameId=%u", 
               id_list.Id[j]);
            if (verbose > 2) {
                printf("%s\n", buf);
               id_list.Id[j]);
            if (verbose > 2) {
                printf("%s\n", buf);
@@ -600,7 +630,7 @@ static void eliminate_duplicate_paths()
       for (int i=0; i<name_list.num_ids; i++) {
         /* Get all the Ids of each name */
         db_escape_string(esc_name, name_list.name[i], strlen(name_list.name[i]));
       for (int i=0; i<name_list.num_ids; i++) {
         /* Get all the Ids of each name */
         db_escape_string(esc_name, name_list.name[i], strlen(name_list.name[i]));
-         sprintf(buf, "SELECT PathId FROM Path WHERE Path='%s'", esc_name);
+         bsnprintf(buf, sizeof(buf), "SELECT PathId FROM Path WHERE Path='%s'", esc_name);
         if (verbose > 1) {
             printf("%s\n", buf);
         }
         if (verbose > 1) {
             printf("%s\n", buf);
         }
@@ -612,13 +642,13 @@ static void eliminate_duplicate_paths()
         }
         /* Force all records to use the first id then delete the other ids */
         for (int j=1; j<id_list.num_ids; j++) {
         }
         /* Force all records to use the first id then delete the other ids */
         for (int j=1; j<id_list.num_ids; j++) {
-            sprintf(buf, "UPDATE File SET PathId=%u WHERE PathId=%u", 
+            bsnprintf(buf, sizeof(buf), "UPDATE File SET PathId=%u WHERE PathId=%u", 
               id_list.Id[0], id_list.Id[j]);
            if (verbose > 1) {
                printf("%s\n", buf);
            }
            db_sql_query(db, buf, NULL, NULL);
               id_list.Id[0], id_list.Id[j]);
            if (verbose > 1) {
                printf("%s\n", buf);
            }
            db_sql_query(db, buf, NULL, NULL);
-            sprintf(buf, "DELETE FROM Path WHERE PathId=%u", 
+            bsnprintf(buf, sizeof(buf), "DELETE FROM Path WHERE PathId=%u", 
               id_list.Id[j]);
            if (verbose > 2) {
                printf("%s\n", buf);
               id_list.Id[j]);
            if (verbose > 2) {
                printf("%s\n", buf);
@@ -644,7 +674,7 @@ static void eliminate_orphaned_jobmedia_records()
    printf("Found %d orphaned JobMedia 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++) {
    printf("Found %d orphaned JobMedia 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++) {
-        sprintf(buf, 
+        bsnprintf(buf, sizeof(buf),  
 "SELECT JobMedia.JobMediaId,JobMedia.JobId,Media.VolumeName FROM JobMedia,Media "
 "WHERE JobMedia.JobMediaId=%u AND Media.MediaId=JobMedia.MediaId", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_jobmedia_handler, NULL)) {
 "SELECT JobMedia.JobMediaId,JobMedia.JobId,Media.VolumeName FROM JobMedia,Media "
 "WHERE JobMedia.JobMediaId=%u AND Media.MediaId=JobMedia.MediaId", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_jobmedia_handler, NULL)) {
@@ -676,7 +706,7 @@ static void eliminate_orphaned_file_records()
    printf("Found %d orphaned File records.\n", id_list.num_ids);
    if (name_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
       for (int i=0; i < id_list.num_ids; i++) {
    printf("Found %d orphaned File records.\n", id_list.num_ids);
    if (name_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
       for (int i=0; i < id_list.num_ids; i++) {
-        sprintf(buf, 
+        bsnprintf(buf, sizeof(buf),
 "SELECT File.FileId,File.JobId,Filename.Name FROM File,Filename "
 "WHERE File.FileId=%u AND File.FilenameId=Filename.FilenameId", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_file_handler, NULL)) {
 "SELECT File.FileId,File.JobId,Filename.Name FROM File,Filename "
 "WHERE File.FileId=%u AND File.FilenameId=Filename.FilenameId", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_file_handler, NULL)) {
@@ -698,7 +728,7 @@ static void eliminate_orphaned_path_records()
    printf("Checking for orphaned Path entries. This may take some time!\n");
    query = "SELECT DISTINCT Path.PathId,File.PathId FROM Path "
            "LEFT OUTER JOIN File ON (Path.PathId=File.PathId) "
    printf("Checking for orphaned Path entries. This may take some time!\n");
    query = "SELECT DISTINCT Path.PathId,File.PathId FROM Path "
            "LEFT OUTER JOIN File ON (Path.PathId=File.PathId) "
-           "HAVING File.PathId IS NULL";
+           "WHERE File.PathId IS NULL";
    if (verbose > 1) {
       printf("%s\n", query);
    }
    if (verbose > 1) {
       printf("%s\n", query);
    }
@@ -708,7 +738,7 @@ static void eliminate_orphaned_path_records()
    printf("Found %d orphaned Path 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++) {
    printf("Found %d orphaned Path 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++) {
-         sprintf(buf, "SELECT Path FROM Path WHERE PathId=%u", id_list.Id[i]);
+         bsnprintf(buf, sizeof(buf), "SELECT Path FROM Path WHERE PathId=%u", id_list.Id[i]);
         db_sql_query(db, buf, print_name_handler, NULL);
       }
    }
         db_sql_query(db, buf, print_name_handler, NULL);
       }
    }
@@ -736,7 +766,7 @@ static void eliminate_orphaned_filename_records()
    printf("Found %d orphaned Filename 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++) {
    printf("Found %d orphaned Filename 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++) {
-         sprintf(buf, "SELECT Name FROM Filename WHERE FilenameId=%u", id_list.Id[i]);
+         bsnprintf(buf, sizeof(buf), "SELECT Name FROM Filename WHERE FilenameId=%u", id_list.Id[i]);
         db_sql_query(db, buf, print_name_handler, NULL);
       }
    }
         db_sql_query(db, buf, print_name_handler, NULL);
       }
    }
@@ -764,7 +794,7 @@ static void eliminate_orphaned_fileset_records()
    printf("Found %d orphaned FileSet 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++) {
    printf("Found %d orphaned FileSet 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++) {
-         sprintf(buf, "SELECT FileSetId,FileSet,MD5 FROM FileSet "
+         bsnprintf(buf, sizeof(buf), "SELECT FileSetId,FileSet,MD5 FROM FileSet "
                       "WHERE FileSetId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_fileset_handler, NULL)) {
             printf("%s\n", db_strerror(db));
                       "WHERE FileSetId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_fileset_handler, NULL)) {
             printf("%s\n", db_strerror(db));
@@ -802,7 +832,7 @@ static void eliminate_orphaned_client_records()
    printf("Found %d orphaned Client 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++) {
    printf("Found %d orphaned Client 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++) {
-         sprintf(buf, "SELECT ClientId,Name FROM Client "
+         bsnprintf(buf, sizeof(buf), "SELECT ClientId,Name FROM Client "
                       "WHERE ClientId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_client_handler, NULL)) {
             printf("%s\n", db_strerror(db));
                       "WHERE ClientId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_client_handler, NULL)) {
             printf("%s\n", db_strerror(db));
@@ -816,6 +846,107 @@ static void eliminate_orphaned_client_records()
    }
 }
 
    }
 }
 
+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);
+   }
+}
+
+
+
 
 static void repair_bad_filenames()
 {
 
 static void repair_bad_filenames()
 {
@@ -834,7 +965,7 @@ static void repair_bad_filenames()
    printf("Found %d bad Filename records.\n", id_list.num_ids);
    if (id_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
       for (i=0; i < id_list.num_ids; i++) {
    printf("Found %d bad Filename records.\n", id_list.num_ids);
    if (id_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
       for (i=0; i < id_list.num_ids; i++) {
-        sprintf(buf
+        bsnprintf(buf, sizeof(buf)
             "SELECT Name FROM Filename WHERE FilenameId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_name_handler, NULL)) {
             printf("%s\n", db_strerror(db));
             "SELECT Name FROM Filename WHERE FilenameId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_name_handler, NULL)) {
             printf("%s\n", db_strerror(db));
@@ -848,7 +979,7 @@ static void repair_bad_filenames()
       printf("Reparing %d bad Filename records.\n", id_list.num_ids);
       for (i=0; i < id_list.num_ids; i++) {
         int len;
       printf("Reparing %d bad Filename records.\n", id_list.num_ids);
       for (i=0; i < id_list.num_ids; i++) {
         int len;
-        sprintf(buf
+        bsnprintf(buf, sizeof(buf)
             "SELECT Name FROM Filename WHERE FilenameId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, get_name_handler, name)) {
             printf("%s\n", db_strerror(db));
             "SELECT Name FROM Filename WHERE FilenameId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, get_name_handler, name)) {
             printf("%s\n", db_strerror(db));
@@ -892,7 +1023,7 @@ static void repair_bad_paths()
    printf("Found %d bad Path records.\n", id_list.num_ids);
    if (id_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
       for (i=0; i < id_list.num_ids; i++) {
    printf("Found %d bad Path records.\n", id_list.num_ids);
    if (id_list.num_ids && verbose && yes_no("Print them? (yes/no): ")) {
       for (i=0; i < id_list.num_ids; i++) {
-        sprintf(buf
+        bsnprintf(buf, sizeof(buf)
             "SELECT Path FROM Path WHERE PathId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_name_handler, NULL)) {
             printf("%s\n", db_strerror(db));
             "SELECT Path FROM Path WHERE PathId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, print_name_handler, NULL)) {
             printf("%s\n", db_strerror(db));
@@ -906,7 +1037,7 @@ static void repair_bad_paths()
       printf("Reparing %d bad Filename records.\n", id_list.num_ids);
       for (i=0; i < id_list.num_ids; i++) {
         int len;
       printf("Reparing %d bad Filename records.\n", id_list.num_ids);
       for (i=0; i < id_list.num_ids; i++) {
         int len;
-        sprintf(buf
+        bsnprintf(buf, sizeof(buf)
             "SELECT Path FROM Path WHERE PathId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, get_name_handler, name)) {
             printf("%s\n", db_strerror(db));
             "SELECT Path FROM Path WHERE PathId=%u", id_list.Id[i]);
         if (!db_sql_query(db, buf, get_name_handler, name)) {
             printf("%s\n", db_strerror(db));
index 35ed0c67d447e7ec36ffba2b61092e98eeb88b46..d14993f0c198bf29628a221d44bda004db4ec0c9 100644 (file)
@@ -1,8 +1,8 @@
 /* */
 #undef  VERSION
 #define VERSION "1.35.3"
 /* */
 #undef  VERSION
 #define VERSION "1.35.3"
-#define BDATE   "01 September 2004"
-#define LSMDATE "01Sep04"
+#define BDATE   "02 September 2004"
+#define LSMDATE "02Sep04"
 
 /* Debug flags */
 #undef  DEBUG
 
 /* Debug flags */
 #undef  DEBUG