use bytes::Bytes;
use fdb::tuple::Versionstamp;
#[derive(Debug, Clone, PartialEq, Eq, Ord, PartialOrd)]
pub struct RecordVersion {
incarnation_version: Option<u64>,
global_version: Bytes,
local_version: u16,
complete: bool,
}
impl RecordVersion {
pub fn get_incarnation_version(&self) -> Option<u64> {
self.incarnation_version
}
pub fn get_versionstamp(&self) -> Versionstamp {
if self.complete {
Versionstamp::complete(self.global_version.clone(), self.local_version)
} else {
Versionstamp::incomplete(self.local_version)
}
}
pub(crate) fn into_parts(self) -> (Option<u64>, Bytes, u16, bool) {
let RecordVersion {
incarnation_version,
global_version,
local_version,
complete,
} = self;
(incarnation_version, global_version, local_version, complete)
}
}
impl From<(u64, Versionstamp)> for RecordVersion {
fn from((i, vs): (u64, Versionstamp)) -> RecordVersion {
let incarnation_version = Some(i);
let (global_version, local_version, complete) = vs.into_parts();
RecordVersion {
incarnation_version,
global_version,
local_version,
complete,
}
}
}
impl From<Versionstamp> for RecordVersion {
fn from(value: Versionstamp) -> RecordVersion {
let (global_version, local_version, complete) = value.into_parts();
RecordVersion {
incarnation_version: None,
global_version,
local_version,
complete,
}
}
}
#[cfg(test)]
mod tests {
use bytes::{BufMut, Bytes, BytesMut};
use fdb::tuple::Versionstamp;
use super::RecordVersion;
#[test]
fn get_incarnation_version() {
let rv = RecordVersion::from(Versionstamp::incomplete(10));
assert_eq!(rv.get_incarnation_version(), None);
let rv = RecordVersion::from((0, Versionstamp::incomplete(10)));
assert_eq!(rv.get_incarnation_version(), Some(0));
}
#[test]
fn get_versionstamp() {
let tr_version = {
let mut b = BytesMut::new();
b.put_u64(1066);
b.put_u16(1);
Bytes::from(b)
};
let rv = RecordVersion::from(Versionstamp::incomplete(10));
assert_eq!(rv.get_versionstamp(), Versionstamp::incomplete(10));
let rv = RecordVersion::from(Versionstamp::complete(tr_version.clone(), 10));
assert_eq!(
rv.get_versionstamp(),
Versionstamp::complete(tr_version, 10)
);
}
#[test]
fn comparisons() {
let version_bytes_one = {
let mut b = BytesMut::new();
b.put_u64(1066);
b.put_u16(1);
Bytes::from(b)
};
let version_bytes_two = {
let mut b = BytesMut::new();
b.put_u64(1066);
b.put_u16(2);
Bytes::from(b)
};
let version_bytes_three = {
let mut b = BytesMut::new();
b.put_u64(1766);
b.put_u16(1);
Bytes::from(b)
};
let version_bytes_four = {
let mut b = BytesMut::new();
b.put_u64(1766);
b.put_u16(2);
Bytes::from(b)
};
{
assert_eq!(
RecordVersion::from(Versionstamp::incomplete(5)),
RecordVersion::from(Versionstamp::incomplete(5))
);
}
{
assert_ne!(
RecordVersion::from(Versionstamp::incomplete(5)),
RecordVersion::from(Versionstamp::incomplete(6))
);
assert!(
RecordVersion::from(Versionstamp::incomplete(5))
< RecordVersion::from(Versionstamp::incomplete(6))
);
assert!(
RecordVersion::from(Versionstamp::incomplete(5))
> RecordVersion::from(Versionstamp::incomplete(0))
);
}
{
assert_eq!(
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10)),
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10)),
);
}
{
assert_ne!(
RecordVersion::from(Versionstamp::complete(version_bytes_three.clone(), 10)),
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10)),
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_three.clone(), 10))
> RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10))
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10))
< RecordVersion::from(Versionstamp::complete(version_bytes_three.clone(), 10))
);
}
{
assert_ne!(
RecordVersion::from(Versionstamp::complete(version_bytes_one.clone(), 10)),
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10)),
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_one.clone(), 10))
< RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10))
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10))
> RecordVersion::from(Versionstamp::complete(version_bytes_one.clone(), 10))
);
}
{
assert_ne!(
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 15)),
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10)),
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 15))
> RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10))
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 10))
< RecordVersion::from(Versionstamp::complete(version_bytes_two.clone(), 15))
);
}
{
assert_ne!(
RecordVersion::from(Versionstamp::incomplete(10)),
RecordVersion::from(Versionstamp::complete(version_bytes_one.clone(), 10)),
);
assert!(
RecordVersion::from(Versionstamp::incomplete(10))
> RecordVersion::from(Versionstamp::complete(version_bytes_one.clone(), 10)),
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_one.clone(), 10))
< RecordVersion::from(Versionstamp::incomplete(10))
);
}
{
assert_ne!(
RecordVersion::from(Versionstamp::complete(version_bytes_four.clone(), 11)),
RecordVersion::from((0, Versionstamp::complete(version_bytes_one.clone(), 10)))
);
assert!(
RecordVersion::from(Versionstamp::complete(version_bytes_four.clone(), 11))
< RecordVersion::from((
0,
Versionstamp::complete(version_bytes_one.clone(), 10)
))
);
assert!(
RecordVersion::from((0, Versionstamp::complete(version_bytes_one.clone(), 10)))
> RecordVersion::from(Versionstamp::complete(version_bytes_four.clone(), 11))
);
assert!(
RecordVersion::from((0, Versionstamp::complete(version_bytes_four.clone(), 11)))
< RecordVersion::from((
1,
Versionstamp::complete(version_bytes_one.clone(), 10)
))
);
assert!(
RecordVersion::from((1, Versionstamp::complete(version_bytes_one.clone(), 10)))
> RecordVersion::from((
0,
Versionstamp::complete(version_bytes_four.clone(), 11)
))
);
}
}
}