]>
git.proxmox.com Git - proxmox-backup.git/blob - src/tape/media_set.rs
1 use anyhow
::{bail, Error}
;
2 use serde
::{Serialize, Deserialize}
;
4 use proxmox
::tools
::Uuid
;
6 /// MediaSet - Ordered group of media
7 #[derive(Debug, Serialize, Deserialize)]
9 /// Unique media set ID
11 /// List of member media IDs
12 media_list
: Vec
<Option
<Uuid
>>,
17 pub const MEDIA_SET_MAX_SEQ_NR
: u64 = 100;
19 pub fn new() -> Self {
20 let uuid
= Uuid
::generate();
23 media_list
: Vec
::new(),
27 pub fn with_data(uuid
: Uuid
, media_list
: Vec
<Option
<Uuid
>>) -> Self {
28 Self { uuid, media_list }
31 pub fn uuid(&self) -> &Uuid
{
35 pub fn media_list(&self) -> &[Option
<Uuid
>] {
39 pub fn add_media(&mut self, uuid
: Uuid
) {
40 self.media_list
.push(Some(uuid
));
43 pub fn insert_media(&mut self, uuid
: Uuid
, seq_nr
: u64) -> Result
<(), Error
> {
44 if seq_nr
> Self::MEDIA_SET_MAX_SEQ_NR
{
45 bail
!("media set sequence number to large in media set {} ({} > {})",
46 self.uuid
.to_string(), seq_nr
, Self::MEDIA_SET_MAX_SEQ_NR
);
48 let seq_nr
= seq_nr
as usize;
49 if self.media_list
.len() > seq_nr
{
50 if self.media_list
[seq_nr
].is_some() {
51 bail
!("found duplicate sequence number in media set '{}/{}'",
52 self.uuid
.to_string(), seq_nr
);
55 self.media_list
.resize(seq_nr
+ 1, None
);
57 self.media_list
[seq_nr
] = Some(uuid
);
61 pub fn last_media_uuid(&self) -> Option
<&Uuid
> {
62 match self.media_list
.last() {
65 Some(Some(ref last_uuid
)) => Some(last_uuid
),
69 pub fn is_last_media(&self, uuid
: &Uuid
) -> bool
{
70 match self.media_list
.last() {
73 Some(Some(last_uuid
)) => uuid
== last_uuid
,