Skip to content

Commit d11e8c3

Browse files
committed
cql: wrap CqlTimeuuid in CqlValue::Timeuuid
1 parent 6b870a3 commit d11e8c3

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

scylla-cql/src/frame/response/cql_to_rust.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::result::{CqlValue, Row};
2-
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp};
2+
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp, CqlTimeuuid};
33
use bigdecimal::BigDecimal;
44
use num_bigint::BigInt;
55
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
@@ -134,6 +134,7 @@ impl_from_cql_value_from_method!(String, into_string); // String::from_cql<CqlVa
134134
impl_from_cql_value_from_method!(Vec<u8>, into_blob); // Vec<u8>::from_cql<CqlValue>
135135
impl_from_cql_value_from_method!(IpAddr, as_inet); // IpAddr::from_cql<CqlValue>
136136
impl_from_cql_value_from_method!(Uuid, as_uuid); // Uuid::from_cql<CqlValue>
137+
impl_from_cql_value_from_method!(CqlTimeuuid, as_timeuuid); // CqlTimeuuid::from_cql<CqlValue>
137138
impl_from_cql_value_from_method!(BigDecimal, into_decimal); // BigDecimal::from_cql<CqlValue>
138139
impl_from_cql_value_from_method!(CqlDuration, as_cql_duration); // CqlDuration::from_cql<CqlValue>
139140
impl_from_cql_value_from_method!(CqlDate, as_cql_date); // CqlDate::from_cql<CqlValue>
@@ -390,7 +391,7 @@ impl_tuple_from_cql!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
390391
mod tests {
391392
use super::{CqlValue, FromCqlVal, FromCqlValError, FromRow, FromRowError, Row};
392393
use crate as scylla;
393-
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp};
394+
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp, CqlTimeuuid};
394395
use crate::macros::FromRow;
395396
use bigdecimal::BigDecimal;
396397
use num_bigint::{BigInt, ToBigInt};
@@ -753,16 +754,18 @@ mod tests {
753754

754755
#[test]
755756
fn uuid_from_cql() {
756-
let test_uuid: Uuid = Uuid::parse_str("8e14e760-7fa8-11eb-bc66-000000000001").unwrap();
757+
let uuid_str = "8e14e760-7fa8-11eb-bc66-000000000001";
758+
let test_uuid: Uuid = Uuid::parse_str(uuid_str).unwrap();
759+
let test_time_uuid = CqlTimeuuid::from_str(uuid_str).unwrap();
757760

758761
assert_eq!(
759762
test_uuid,
760763
Uuid::from_cql(CqlValue::Uuid(test_uuid)).unwrap()
761764
);
762765

763766
assert_eq!(
764-
test_uuid,
765-
Uuid::from_cql(CqlValue::Timeuuid(test_uuid)).unwrap()
767+
test_time_uuid,
768+
CqlTimeuuid::from_cql(CqlValue::Timeuuid(test_time_uuid)).unwrap()
766769
);
767770
}
768771

scylla-cql/src/frame/response/result.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::cql_to_rust::{FromRow, FromRowError};
22
use crate::frame::response::event::SchemaChangeEvent;
33
use crate::frame::types::vint_decode;
4-
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp};
4+
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp, CqlTimeuuid};
55
use crate::frame::{frame_errors::ParseError, types};
66
use bigdecimal::BigDecimal;
77
use byteorder::{BigEndian, ReadBytesExt};
@@ -110,7 +110,7 @@ pub enum CqlValue {
110110
TinyInt(i8),
111111
/// Nanoseconds since midnight
112112
Time(CqlTime),
113-
Timeuuid(Uuid),
113+
Timeuuid(CqlTimeuuid),
114114
Tuple(Vec<Option<CqlValue>>),
115115
Uuid(Uuid),
116116
Varint(BigInt),
@@ -231,7 +231,7 @@ impl CqlValue {
231231
pub fn as_uuid(&self) -> Option<Uuid> {
232232
match self {
233233
Self::Uuid(u) => Some(*u),
234-
Self::Timeuuid(u) => Some(*u),
234+
Self::Timeuuid(u) => Some(*u.as_ref()),
235235
_ => None,
236236
}
237237
}
@@ -285,7 +285,7 @@ impl CqlValue {
285285
}
286286
}
287287

288-
pub fn as_timeuuid(&self) -> Option<Uuid> {
288+
pub fn as_timeuuid(&self) -> Option<CqlTimeuuid> {
289289
match self {
290290
Self::Timeuuid(u) => Some(*u),
291291
_ => None,
@@ -770,7 +770,7 @@ pub fn deser_cql_value(typ: &ColumnType, buf: &mut &[u8]) -> StdResult<CqlValue,
770770
)));
771771
}
772772
let uuid = uuid::Uuid::from_slice(buf).expect("Deserializing Uuid failed.");
773-
CqlValue::Timeuuid(uuid)
773+
CqlValue::Timeuuid(CqlTimeuuid::from(uuid))
774774
}
775775
Duration => {
776776
let months = i32::try_from(vint_decode(buf)?)?;
@@ -966,7 +966,7 @@ pub fn deserialize(buf: &mut &[u8]) -> StdResult<Result, ParseError> {
966966
#[cfg(test)]
967967
mod tests {
968968
use crate as scylla;
969-
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp};
969+
use crate::frame::value::{Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp, CqlTimeuuid};
970970
use bigdecimal::BigDecimal;
971971
use num_bigint::BigInt;
972972
use num_bigint::ToBigInt;
@@ -993,9 +993,10 @@ mod tests {
993993
let uuid_serialize = super::deser_cql_value(&ColumnType::Uuid, uuid_slice).unwrap();
994994
assert_eq!(uuid_serialize, CqlValue::Uuid(my_uuid));
995995

996+
let my_timeuuid = CqlTimeuuid::from_str("00000000000000000000000000000001").unwrap();
996997
let time_uuid_serialize =
997998
super::deser_cql_value(&ColumnType::Timeuuid, uuid_slice).unwrap();
998-
assert_eq!(time_uuid_serialize, CqlValue::Timeuuid(my_uuid));
999+
assert_eq!(time_uuid_serialize, CqlValue::Timeuuid(my_timeuuid));
9991000

10001001
let my_ip = "::1".parse().unwrap();
10011002
let ip_buf: Vec<u8> = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
@@ -1754,7 +1755,7 @@ mod tests {
17541755
match cql_val {
17551756
CqlValue::Timeuuid(uuid) => {
17561757
assert_eq!(uuid.as_bytes(), uuid_bytes);
1757-
assert_eq!(Uuid::parse_str(uuid_str).unwrap(), uuid);
1758+
assert_eq!(CqlTimeuuid::from_str(uuid_str).unwrap(), uuid);
17581759
}
17591760
_ => panic!("Timeuuid parsed as wrong CqlValue"),
17601761
}

scylla-cql/src/frame/value.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,12 @@ impl Value for Uuid {
860860
}
861861
}
862862

863+
impl Value for CqlTimeuuid {
864+
fn serialize(&self, buf: &mut Vec<u8>) -> Result<(), ValueTooBig> {
865+
self.0.serialize(buf)
866+
}
867+
}
868+
863869
impl Value for BigInt {
864870
fn serialize(&self, buf: &mut Vec<u8>) -> Result<(), ValueTooBig> {
865871
let serialized = self.to_signed_bytes_be();

scylla-cql/src/types/serialize/value.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use secrecy::{ExposeSecret, Secret, Zeroize};
2020
use crate::frame::response::result::{ColumnType, CqlValue};
2121
use crate::frame::types::vint_encode;
2222
use crate::frame::value::{
23-
Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp, MaybeUnset, Unset, Value,
23+
Counter, CqlDate, CqlDuration, CqlTime, CqlTimestamp, CqlTimeuuid, MaybeUnset, Unset, Value,
2424
};
2525

2626
#[cfg(feature = "chrono")]
@@ -227,6 +227,12 @@ impl SerializeCql for Uuid {
227227
writer.set_value(me.as_bytes().as_ref()).unwrap()
228228
});
229229
}
230+
impl SerializeCql for CqlTimeuuid {
231+
impl_serialize_via_writer!(|me, typ, writer| {
232+
exact_type_check!(typ, Timeuuid);
233+
writer.set_value(me.as_bytes().as_ref()).unwrap()
234+
});
235+
}
230236
impl SerializeCql for BigInt {
231237
impl_serialize_via_writer!(|me, typ, writer| {
232238
exact_type_check!(typ, Varint);

0 commit comments

Comments
 (0)