]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Use DROP TABLE IF EXISTS in cats library to avoid errors with missing tables
authorEric Bollengier <eric@baculasystems.com>
Mon, 20 Jul 2020 11:25:16 +0000 (13:25 +0200)
committerEric Bollengier <eric@baculasystems.com>
Tue, 1 Mar 2022 14:36:17 +0000 (15:36 +0100)
bacula/src/cats/bvfs.c
bacula/src/cats/sql_cmds.c
bacula/src/cats/sql_create.c
bacula/src/cats/sql_get.c

index b04a1c47ba54fb41923d7bbc0c1c019510c6b512..1b01fc06aaf24e63edb196752db8fdd99c2dc327 100644 (file)
@@ -1341,7 +1341,7 @@ bool Bvfs::drop_restore_list(char *output_table)
 {
    POOL_MEM query;
    if (check_temp(output_table)) {
-      Mmsg(query, "DROP TABLE %s", output_table);
+      Mmsg(query, "DROP TABLE IF EXISTS %s", output_table);
       db->bdb_sql_query(query.c_str(), NULL, NULL);
       return true;
    }
@@ -1473,7 +1473,7 @@ bool Bvfs::insert_hardlinks(char *output_table)
       goto bail_out; 
    }
 
-   Mmsg(query, "DROP TABLE h%s", output_table);
+   Mmsg(query, "DROP TABLE IF EXISTS h%s", output_table);
    if (!db->bdb_sql_query(query.c_str(), NULL, NULL)) {
       Dmsg1(dbglevel, "Can't execute query=%s\n", query.c_str());
       goto bail_out; 
@@ -1518,10 +1518,10 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *output_table)
    }
 
    /* Cleanup old tables first */
-   Mmsg(query, "DROP TABLE btemp%s", output_table);
+   Mmsg(query, "DROP TABLE IF EXISTS btemp%s", output_table);
    db->bdb_sql_query(query.c_str());
 
-   Mmsg(query, "DROP TABLE %s", output_table);
+   Mmsg(query, "DROP TABLE IF EXISTS %s", output_table);
    db->bdb_sql_query(query.c_str());
 
    /* Now start the transaction to protect ourself from other commands */
@@ -1713,10 +1713,10 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *output_table)
 
 bail_out:
    if (!ret) {
-      Mmsg(query, "DROP TABLE %s", output_table);
+      Mmsg(query, "DROP TABLE IF EXISTS %s", output_table);
       db->bdb_sql_query(query.c_str());
    }
-   Mmsg(query, "DROP TABLE btemp%s", output_table);
+   Mmsg(query, "DROP TABLE IF EXISTS btemp%s", output_table);
    db->bdb_sql_query(query.c_str());
    db->bdb_end_transaction(jcr); /* the destination table might be visible now */
    db->bdb_unlock();
index 5c541858da5104125b9b0b27ecaa2474ab55d57f..8ad312d2bcc7686d60392b9e5da1ce7499864a96 100644 (file)
@@ -91,7 +91,7 @@ const char *sel_JobMedia =
 
 /* Delete temp tables and indexes  */
 const char *drop_deltabs[] = {
-   "DROP TABLE DelCandidates",
+   "DROP TABLE IF EXISTS DelCandidates",
    NULL};
 
 const char *create_delindex = "CREATE INDEX DelInx1 ON DelCandidates (JobId)";
@@ -122,8 +122,8 @@ const char *uar_sel_files =
      "FROM File JOIN Path USING (PathId) "
     "WHERE File.JobId IN (%s)";
 
-const char *uar_del_temp  = "DROP TABLE temp";
-const char *uar_del_temp1 = "DROP TABLE temp1";
+const char *uar_del_temp  = "DROP TABLE IF EXISTS temp";
+const char *uar_del_temp1 = "DROP TABLE IF EXISTS temp1";
 
 const char *uar_last_full =
    "INSERT INTO temp1 SELECT Job.JobId,JobTdate "
@@ -410,7 +410,7 @@ const char *select_recent_version[] =
     MyISAM 5.0 and 5.1 are unable to run further queries in this mode
  */
 static const char *create_temp_accurate_jobids_default = 
- "CREATE TABLE btemp3%s AS "
+ "CREATE TABLE btemp3%s AS ("
     "SELECT JobId, StartTime, EndTime, JobTDate, PurgedFiles "
       "FROM Job JOIN FileSet USING (FileSetId) "
      "WHERE ClientId = %s "
@@ -418,7 +418,7 @@ static const char *create_temp_accurate_jobids_default =
        "AND StartTime<'%s' "
        "AND FileSet.FileSet=(SELECT FileSet FROM FileSet WHERE FileSetId = %s) "
        " %s "                   /* Any filter */
-     "ORDER BY Job.JobTDate DESC LIMIT 1";
+     "ORDER BY Job.JobTDate DESC LIMIT 1)";
  
 const char *create_temp_accurate_jobids[] =
 {
@@ -435,7 +435,7 @@ const char *create_temp_basefile[] =
    /* MySQL */
    "CREATE TEMPORARY TABLE basefile%lld"
    "(Path BLOB NOT NULL, Name BLOB NOT NULL,"
-   " INDEX (Path(255), Name(255)))",
+   " PRIMARY (Path(255), Name(255)))",
    /* PostgreSQL */
    "CREATE TEMPORARY TABLE basefile%lld"
    "(Path TEXT, Name TEXT)",
@@ -573,6 +573,7 @@ const char *uar_create_temp[] =
 {
    /* MySQL */
    "CREATE TEMPORARY TABLE temp ("
+   "PKEY INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,"
    "JobId INTEGER UNSIGNED NOT NULL,"
    "JobTDate BIGINT UNSIGNED,"
    "ClientId INTEGER UNSIGNED,"
@@ -583,7 +584,7 @@ const char *uar_create_temp[] =
    "VolumeName TEXT,"
    "StartFile INTEGER UNSIGNED,"
    "VolSessionId INTEGER UNSIGNED,"
-   "VolSessionTime INTEGER UNSIGNED)",
+   "VolSessionTime INTEGER UNSIGNED) PRIMARY KEY (PKEY)",
  
    /* PostgreSQL */
    "CREATE TEMPORARY TABLE temp ("
index 30f7783d20e11eeba439bd9ad1fb517a91b882c2..02c7e8a83b9745b149f4cb5274881217021d0c2a 100644 (file)
@@ -895,7 +895,7 @@ bool bdb_write_batch_file_records(JCR *jcr)
    retval = true; 
  
 bail_out: 
-   jcr->db_batch->bdb_sql_query("DROP TABLE batch", NULL,NULL);
+   jcr->db_batch->bdb_sql_query("DROP TABLE IF EXISTS batch", NULL,NULL);
    jcr->batch_started = false;
 
    return retval; 
@@ -1093,10 +1093,10 @@ bool BDB::bdb_create_base_file_attributes_record(JCR *jcr, ATTR_DBR *ar)
 static void db_cleanup_base_file(JCR *jcr, BDB *mdb)
 {
    POOL_MEM buf(PM_MESSAGE);
-   Mmsg(buf, "DROP TABLE new_basefile%lld", (uint64_t) jcr->JobId);
+   Mmsg(buf, "DROP TABLE IF EXISTS new_basefile%lld", (uint64_t) jcr->JobId);
    mdb->bdb_sql_query(buf.c_str(), NULL, NULL);
 
-   Mmsg(buf, "DROP TABLE basefile%lld", (uint64_t) jcr->JobId);
+   Mmsg(buf, "DROP TABLE IF EXISTS basefile%lld", (uint64_t) jcr->JobId);
    mdb->bdb_sql_query(buf.c_str(), NULL, NULL);
 }
 
index 74b6048b3d74261faa6e341a08cb8a2e2bbf8572..22eaeb7e42d9ea9784864cda76c4505dd3ed058f 100644 (file)
@@ -1554,7 +1554,7 @@ bool BDB::bdb_get_accurate_jobids(JCR *jcr,
    ret = true;
 
 bail_out:
-   Mmsg(query, "DROP TABLE btemp3%s", jobid);
+   Mmsg(query, "DROP TABLE IF EXISTS btemp3%s", jobid);
    bdb_sql_query(query.c_str(), NULL, NULL);
 
    return ret;