]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/sql_delete.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / cats / sql_delete.c
index d8c7fdfbd7a81adab323e7f7f1ae947d35f7eafd..5a0790804eac4300af2942b081d00a9ee4a4e011 100644 (file)
@@ -2,6 +2,8 @@
  * Bacula Catalog Database Delete record interface routines
  * 
  *    Kern Sibbald, December 2000
+ *
+ *    Version $Id$
  */
 
 /*
@@ -46,8 +48,8 @@
 /* Imported subroutines */
 extern void print_dashes(B_DB *mdb);
 extern void print_result(B_DB *mdb);
-extern int QueryDB(char *file, int line, B_DB *db, char *select_cmd);
-extern int DeleteDB(char *file, int line, B_DB *db, char *delete_cmd);
+extern int QueryDB(char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
+extern int DeleteDB(char *file, int line, JCR *jcr, B_DB *db, char *delete_cmd);
        
 /*
  * Delete Pool record, must also delete all associated
@@ -59,34 +61,35 @@ extern int DeleteDB(char *file, int line, B_DB *db, char *delete_cmd);
  *          NumVols = number of Media records deleted
  */
 int
-db_delete_pool_record(B_DB *mdb, POOL_DBR *pr)
+db_delete_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr)
 {
    SQL_ROW row;
 
-   P(mdb->mutex);
-   Mmsg(&mdb->cmd, "SELECT PoolId FROM Pool WHERE Name=\"%s\"", pr->Name);
+   db_lock(mdb);
+   Mmsg(&mdb->cmd, "SELECT PoolId FROM Pool WHERE Name='%s'", pr->Name);
    Dmsg1(10, "selectpool: %s\n", mdb->cmd);
 
    pr->PoolId = pr->NumVols = 0;
 
-   if (QUERY_DB(mdb, mdb->cmd)) {
+   if (QUERY_DB(jcr, mdb, mdb->cmd)) {
 
       mdb->num_rows = sql_num_rows(mdb);
    
       if (mdb->num_rows == 0) {
          Mmsg(&mdb->errmsg, _("No pool record %s exists\n"), pr->Name);
         sql_free_result(mdb);
-        V(mdb->mutex);
+        db_unlock(mdb);
         return 0;
       } else if (mdb->num_rows != 1) {
          Mmsg(&mdb->errmsg, _("Expecting one pool record, got %d\n"), mdb->num_rows);
         sql_free_result(mdb);
-        V(mdb->mutex);
+        db_unlock(mdb);
         return 0;
       }
       if ((row = sql_fetch_row(mdb)) == NULL) {
-        V(mdb->mutex);
-         Emsg1(M_ABORT, 0, _("Error fetching row %s\n"), sql_strerror(mdb));
+         Mmsg1(&mdb->errmsg, _("Error fetching row %s\n"), sql_strerror(mdb));
+        db_unlock(mdb);
+        return 0;
       }
       pr->PoolId = atoi(row[0]);
       sql_free_result(mdb);
@@ -96,23 +99,23 @@ db_delete_pool_record(B_DB *mdb, POOL_DBR *pr)
    Mmsg(&mdb->cmd,
 "DELETE FROM Media WHERE Media.PoolId = %d", pr->PoolId);
 
-   pr->NumVols = DELETE_DB(mdb, mdb->cmd);
+   pr->NumVols = DELETE_DB(jcr, mdb, mdb->cmd);
    Dmsg1(200, "Deleted %d Media records\n", pr->NumVols);
 
    /* Delete Pool */
    Mmsg(&mdb->cmd,
 "DELETE FROM Pool WHERE Pool.PoolId = %d", pr->PoolId);
-   pr->PoolId = DELETE_DB(mdb, mdb->cmd);
+   pr->PoolId = DELETE_DB(jcr, mdb, mdb->cmd);
    Dmsg1(200, "Deleted %d Pool records\n", pr->PoolId);
 
-   V(mdb->mutex);
+   db_unlock(mdb);
    return 1;
 }
 
 #define MAX_DEL_LIST_LEN 1000000
 
 struct s_del_ctx {
-   uint32_t *JobId; 
+   JobId_t *JobId; 
    int num_ids;                      /* ids stored */
    int max_ids;                      /* size of array */
    int num_del;                      /* number deleted */
@@ -135,10 +138,10 @@ static int delete_handler(void *ctx, int num_fields, char **row)
    }
    if (del->num_ids == del->max_ids) {
       del->max_ids = (del->max_ids * 3) / 2;
-      del->JobId = (uint32_t *)brealloc(del->JobId, sizeof(uint32_t) *
+      del->JobId = (JobId_t *)brealloc(del->JobId, sizeof(JobId_t) *
         del->max_ids);
    }
-   del->JobId[del->num_ids++] = (uint32_t)strtod(row[0], NULL);
+   del->JobId[del->num_ids++] = (JobId_t)str_to_int64(row[0]);
    return 0;
 }
 
@@ -150,7 +153,7 @@ static int delete_handler(void *ctx, int num_fields, char **row)
  */
 static int do_media_purge(B_DB *mdb, MEDIA_DBR *mr)
 {
-   char *query = (char *)get_pool_memory(PM_MESSAGE);
+   POOLMEM *query = get_pool_memory(PM_MESSAGE);
    struct s_del_ctx del;
    int i;
 
@@ -165,16 +168,16 @@ static int do_media_purge(B_DB *mdb, MEDIA_DBR *mr)
    } else if (del.max_ids > MAX_DEL_LIST_LEN) {
       del.max_ids = MAX_DEL_LIST_LEN;
    }
-   del.JobId = (uint32_t *)malloc(sizeof(uint32_t) * del.max_ids);
+   del.JobId = (JobId_t *)malloc(sizeof(JobId_t) * del.max_ids);
    db_sql_query(mdb, mdb->cmd, delete_handler, (void *)&del);
 
    for (i=0; i < del.num_ids; i++) {
       Dmsg1(400, "Delete JobId=%d\n", del.JobId[i]);
-      Mmsg(&query, "DELETE FROM Job WHERE JobId=%d", del.JobId[i]);
+      Mmsg(&query, "DELETE FROM Job WHERE JobId=%u", del.JobId[i]);
       db_sql_query(mdb, query, NULL, (void *)NULL);
-      Mmsg(&query, "DELETE FROM File WHERE JobId=%d", del.JobId[i]);
+      Mmsg(&query, "DELETE FROM File WHERE JobId=%u", del.JobId[i]);
       db_sql_query(mdb, query, NULL, (void *)NULL);
-      Mmsg(&query, "DELETE FROM JobMedia WHERE JobId=%d", del.JobId[i]);
+      Mmsg(&query, "DELETE FROM JobMedia WHERE JobId=%u", del.JobId[i]);
       db_sql_query(mdb, query, NULL, (void *)NULL);
    }
    free(del.JobId);
@@ -185,16 +188,22 @@ static int do_media_purge(B_DB *mdb, MEDIA_DBR *mr)
 /* Delete Media record and all records that
  * are associated with it.
  */
-int db_delete_media_record(B_DB *mdb, MEDIA_DBR *mr)
+int db_delete_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 {
-   if (mr->MediaId == 0 && !db_get_media_record(mdb, mr)) {
+   db_lock(mdb);
+   if (mr->MediaId == 0 && !db_get_media_record(jcr, mdb, mr)) {
+      db_unlock(mdb);
       return 0;
    } 
-   /* Delete associated records */
-   do_media_purge(mdb, mr);
+   /* Do purge if not already purged */
+   if (strcmp(mr->VolStatus, "Purged") != 0) {
+      /* Delete associated records */
+      do_media_purge(mdb, mr);
+   }
 
    Mmsg(&mdb->cmd, "DELETE FROM Media WHERE MediaId=%d", mr->MediaId);
    db_sql_query(mdb, mdb->cmd, NULL, (void *)NULL);
+   db_unlock(mdb);
    return 1;
 }
 
@@ -204,20 +213,24 @@ int db_delete_media_record(B_DB *mdb, MEDIA_DBR *mr)
  * media record itself. But the media status
  * is changed to "Purged".
  */
-int db_purge_media_record(B_DB *mdb, MEDIA_DBR *mr)
+int db_purge_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 {
-   if (mr->MediaId == 0 && !db_get_media_record(mdb, mr)) {
+   db_lock(mdb);
+   if (mr->MediaId == 0 && !db_get_media_record(jcr, mdb, mr)) {
+      db_unlock(mdb);
       return 0;
    } 
    /* Delete associated records */
-   do_media_purge(mdb, mr);
+   do_media_purge(mdb, mr);          /* Note, always purge */
 
    /* Mark Volume as purged */
    strcpy(mr->VolStatus, "Purged");
-   if (!db_update_media_record(mdb, mr)) {
+   if (!db_update_media_record(jcr, mdb, mr)) {
+      db_unlock(mdb);
       return 0;
    }
 
+   db_unlock(mdb);
    return 1;
 }