]> git.sur5r.net Git - bacula/bacula/commitdiff
InChanger Flag patches from Jason Conroy
authorKern Sibbald <kern@sibbald.com>
Sun, 7 Mar 2004 20:15:09 +0000 (20:15 +0000)
committerKern Sibbald <kern@sibbald.com>
Sun, 7 Mar 2004 20:15:09 +0000 (20:15 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1114 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/cats/sql_create.c
bacula/src/cats/sql_find.c
bacula/src/cats/sql_get.c
bacula/src/cats/sql_update.c
bacula/src/stored/acquire.c

index d595a189094bb20a02b006e2dcf5bd42b6eec742..0b81c7b9aff550bc7f6e217fff09eea07b545d4a 100644 (file)
@@ -250,11 +250,6 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
       sql_free_result(mdb);
    }
 
-   /* Make sure that if InChanger is non-zero any other identical slot
-    *  has InChanger zero.
-    */
-   db_make_inchanger_unique(jcr, mdb, mr);
-
    /* Must create it */
    Mmsg(&mdb->cmd, 
 "INSERT INTO Media (VolumeName,MediaType,PoolId,MaxVolBytes,VolCapacityBytes," 
@@ -295,6 +290,13 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
         stat = UPDATE_DB(jcr, mdb, mdb->cmd);
       }
    }
+
+   /*
+    * Make sure that if InChanger is non-zero any other identical slot
+    *  has InChanger zero.
+    */
+   db_make_inchanger_unique(jcr, mdb, mr);
+
    db_unlock(mdb);
    return stat;
 }
index 8a9371bccbd57be5d56293ef1935a203f7ba0dc8..925b063edce7e1c416bd960862c1a3b9658f509d 100644 (file)
@@ -226,7 +226,7 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr
       Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
           "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
           "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
-          "FirstWritten,LastWritten,VolStatus "
+          "FirstWritten,LastWritten,VolStatus,InChanger "
           "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus IN ('Full',"
           "'Recycle','Purged','Used','Append') "
           "ORDER BY LastWritten LIMIT 1", mr->PoolId, mr->MediaType); 
@@ -247,7 +247,7 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr
       Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
           "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
           "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
-          "FirstWritten,LastWritten,VolStatus "
+          "FirstWritten,LastWritten,VolStatus,InChanger "
           "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus='%s' "
           "%s " 
           "%s LIMIT 1",
@@ -301,6 +301,7 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr
    bstrncpy(mr->cLastWritten, row[18]!=NULL?row[18]:"", sizeof(mr->cLastWritten));
    mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten);
    bstrncpy(mr->VolStatus, row[19], sizeof(mr->VolStatus));
+   mr->InChanger = str_to_int64(row[20]);
    sql_free_result(mdb);
 
    db_unlock(mdb);
index 6d9cad59fc4daa7ce861c139b80a80f8c627c7e8..d2d462489268d6a6d3b2d993c7e82424213eca1a 100644 (file)
@@ -790,17 +790,17 @@ int db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
       return 1;
    }
    if (mr->MediaId != 0) {              /* find by id */
-      Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\
-VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,\
-MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,\
-Recycle,Slot,FirstWritten,LastWritten \
-FROM Media WHERE MediaId=%d", mr->MediaId);
+      Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
+         "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
+         "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,"
+         "Recycle,Slot,FirstWritten,LastWritten,InChanger "
+         "FROM Media WHERE MediaId=%d", mr->MediaId);
    } else {                          /* find by name */
-      Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\
-VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,\
-MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,\
-Recycle,Slot,FirstWritten,LastWritten \
-FROM Media WHERE VolumeName='%s'", mr->VolumeName);
+      Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
+         "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
+         "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,"
+         "Recycle,Slot,FirstWritten,LastWritten "
+         "FROM Media WHERE VolumeName='%s'", mr->VolumeName);
    }  
 
    if (QUERY_DB(jcr, mdb, mdb->cmd)) {
@@ -840,6 +840,7 @@ FROM Media WHERE VolumeName='%s'", mr->VolumeName);
            mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten);
             bstrncpy(mr->cLastWritten, row[21]!=NULL?row[21]:"", sizeof(mr->cLastWritten));
            mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten);
+           mr->InChanger = str_to_uint64(row[22]);
            stat = mr->MediaId;
         }
       } else {
index 3c428742e805186dfa9f4286f2abcdb6a1ea7114..98e5dd1e0317ffbe43e8d6f3adca9428dda0f6a2 100644 (file)
@@ -289,11 +289,7 @@ db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
       stat = UPDATE_DB(jcr, mdb, mdb->cmd);
    }
    
-   /* Make sure InChanger is 0 for any record having the same Slot */
-   db_make_inchanger_unique(jcr, mdb, mr);
-
    if (mr->LastWritten != 0) {
-
       ttime = mr->LastWritten;
       localtime_r(&ttime, &tm);
       strftime(dt, sizeof(dt), "%Y-%m-%d %T", &tm);
@@ -328,6 +324,10 @@ db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
    Dmsg1(400, "%s\n", mdb->cmd);
 
    stat = UPDATE_DB(jcr, mdb, mdb->cmd);
+
+   /* Make sure InChanger is 0 for any record having the same Slot */
+   db_make_inchanger_unique(jcr, mdb, mr);
+
    db_unlock(mdb);
    return stat;
 }
@@ -343,7 +343,7 @@ db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 {
    if (mr->InChanger != 0 && mr->Slot != 0) {
       Mmsg(&mdb->cmd, "UPDATE Media SET InChanger=0 WHERE PoolId=%u "
-           "AND Slot=%d\n", mr->PoolId, mr->Slot);
+           "AND Slot=%d AND MediaId!=%u", mr->PoolId, mr->Slot, mr->MediaId);
       Dmsg1(400, "%s\n", mdb->cmd);
       UPDATE_DB(jcr, mdb, mdb->cmd);
    }
index c44fd8e3bf802768d31263ccd318cb1365d4cef1..ad192e0175d87899761c0fddab685be59d746417 100644 (file)
@@ -88,6 +88,7 @@ DCR *acquire_device_for_read(JCR *jcr)
    block_device(dev, BST_DOING_ACQUIRE);
    unlock_device(dev);
 
+   init_dev_wait_timers(dev);
    if (dev_state(dev, ST_READ) || dev->num_writers > 0) {
       Jmsg2(jcr, M_FATAL, 0, _("Device %s is busy. Job %d canceled.\n"), 
            dev_name(dev), jcr->JobId);