]> git.proxmox.com Git - proxmox-backup.git/blob - src/tape/media_set.rs
fix #5229: tape: remove max sequence number limit
[proxmox-backup.git] / src / tape / media_set.rs
1 use anyhow::{bail, Error};
2 use serde::{Deserialize, Serialize};
3
4 use proxmox_uuid::Uuid;
5
6 /// MediaSet - Ordered group of media
7 #[derive(Debug, Serialize, Deserialize)]
8 pub struct MediaSet {
9 /// Unique media set ID
10 uuid: Uuid,
11 /// List of member media IDs
12 media_list: Vec<Option<Uuid>>,
13 }
14
15 impl MediaSet {
16 #[allow(clippy::new_without_default)]
17 pub fn new() -> Self {
18 let uuid = Uuid::generate();
19 Self {
20 uuid,
21 media_list: Vec::new(),
22 }
23 }
24
25 pub fn with_data(uuid: Uuid, media_list: Vec<Option<Uuid>>) -> Self {
26 Self { uuid, media_list }
27 }
28
29 pub fn uuid(&self) -> &Uuid {
30 &self.uuid
31 }
32
33 pub fn media_list(&self) -> &[Option<Uuid>] {
34 &self.media_list
35 }
36
37 pub fn add_media(&mut self, uuid: Uuid) {
38 self.media_list.push(Some(uuid));
39 }
40
41 pub fn insert_media(&mut self, uuid: Uuid, seq_nr: u64) -> Result<(), Error> {
42 let seq_nr = seq_nr as usize;
43 if self.media_list.len() > seq_nr {
44 if self.media_list[seq_nr].is_some() {
45 bail!(
46 "found duplicate sequence number in media set '{}/{}'",
47 self.uuid.to_string(),
48 seq_nr
49 );
50 }
51 } else {
52 self.media_list.resize(seq_nr + 1, None);
53 }
54 self.media_list[seq_nr] = Some(uuid);
55 Ok(())
56 }
57
58 pub fn last_media_uuid(&self) -> Option<&Uuid> {
59 match self.media_list.last() {
60 None => None,
61 Some(None) => None,
62 Some(Some(ref last_uuid)) => Some(last_uuid),
63 }
64 }
65
66 pub fn is_last_media(&self, uuid: &Uuid) -> bool {
67 match self.media_list.last() {
68 None => false,
69 Some(None) => false,
70 Some(Some(last_uuid)) => uuid == last_uuid,
71 }
72 }
73 }