@@ -16,6 +16,7 @@ use bytes::Bytes;
1616
1717pub use auth_response:: AuthResponse ;
1818pub use batch:: Batch ;
19+ pub use batch:: BatchV2 ;
1920pub use execute:: Execute ;
2021pub use options:: Options ;
2122pub use prepare:: Prepare ;
@@ -138,6 +139,7 @@ pub enum Request<'r> {
138139 Query ( Query < ' r > ) ,
139140 Execute ( Execute < ' r > ) ,
140141 Batch ( Batch < ' r , BatchStatement < ' r > , Vec < SerializedValues > > ) ,
142+ BatchV2 ( BatchV2 < ' r > ) ,
141143}
142144
143145impl Request < ' _ > {
@@ -148,7 +150,7 @@ impl Request<'_> {
148150 match opcode {
149151 RequestOpcode :: Query => Query :: deserialize ( buf) . map ( Self :: Query ) ,
150152 RequestOpcode :: Execute => Execute :: deserialize ( buf) . map ( Self :: Execute ) ,
151- RequestOpcode :: Batch => Batch :: deserialize ( buf) . map ( Self :: Batch ) ,
153+ RequestOpcode :: Batch => BatchV2 :: deserialize ( buf) . map ( Self :: BatchV2 ) ,
152154 _ => unimplemented ! (
153155 "Deserialization of opcode {:?} is not yet supported" ,
154156 opcode
@@ -162,6 +164,7 @@ impl Request<'_> {
162164 Request :: Query ( q) => Some ( q. parameters . consistency ) ,
163165 Request :: Execute ( e) => Some ( e. parameters . consistency ) ,
164166 Request :: Batch ( b) => Some ( b. consistency ) ,
167+ Request :: BatchV2 ( b) => Some ( b. consistency ) ,
165168 #[ expect( unreachable_patterns) ] // until other opcodes are supported
166169 _ => None ,
167170 }
@@ -173,6 +176,7 @@ impl Request<'_> {
173176 Request :: Query ( q) => Some ( q. parameters . serial_consistency ) ,
174177 Request :: Execute ( e) => Some ( e. parameters . serial_consistency ) ,
175178 Request :: Batch ( b) => Some ( b. serial_consistency ) ,
179+ Request :: BatchV2 ( b) => Some ( b. serial_consistency ) ,
176180 #[ expect( unreachable_patterns) ] // until other opcodes are supported
177181 _ => None ,
178182 }
@@ -181,15 +185,15 @@ impl Request<'_> {
181185
182186#[ cfg( test) ]
183187mod tests {
184- use std:: { borrow:: Cow , ops :: Deref } ;
188+ use std:: borrow:: Cow ;
185189
186190 use bytes:: Bytes ;
187191
188192 use crate :: serialize:: row:: SerializedValues ;
189193 use crate :: {
190194 frame:: {
191195 request:: {
192- batch:: { Batch , BatchStatement , BatchType } ,
196+ batch:: { BatchStatement , BatchType , BatchV2 } ,
193197 execute:: Execute ,
194198 query:: { Query , QueryParameters } ,
195199 DeserializableRequest , SerializableRequest ,
@@ -261,32 +265,39 @@ mod tests {
261265 }
262266
263267 // Batch
264- let statements = vec ! [
265- BatchStatement :: Query {
266- text: query. contents,
267- } ,
268- BatchStatement :: Prepared {
269- id: Cow :: Borrowed ( & execute. id) ,
270- } ,
271- ] ;
272- let batch = Batch {
273- statements : Cow :: Owned ( statements) ,
268+ // Not execute's values, because named values are not supported in batches.
269+ let mut statements_and_values = vec ! [ ] ;
270+ BatchStatement :: Query {
271+ text : query. contents ,
272+ }
273+ . serialize ( & mut statements_and_values)
274+ . unwrap ( ) ;
275+ statements_and_values
276+ . extend_from_slice ( & query. parameters . values . element_count ( ) . to_be_bytes ( ) ) ;
277+ statements_and_values. extend_from_slice ( query. parameters . values . get_contents ( ) ) ;
278+
279+ BatchStatement :: Prepared {
280+ id : Cow :: Borrowed ( & execute. id ) ,
281+ }
282+ . serialize ( & mut statements_and_values)
283+ . unwrap ( ) ;
284+ statements_and_values
285+ . extend_from_slice ( & query. parameters . values . element_count ( ) . to_be_bytes ( ) ) ;
286+ statements_and_values. extend_from_slice ( query. parameters . values . get_contents ( ) ) ;
287+
288+ let batch = BatchV2 {
289+ statements_and_values : Cow :: Owned ( statements_and_values) ,
274290 batch_type : BatchType :: Logged ,
275291 consistency : Consistency :: EachQuorum ,
276292 serial_consistency : Some ( SerialConsistency :: LocalSerial ) ,
277293 timestamp : Some ( 32432 ) ,
278-
279- // Not execute's values, because named values are not supported in batches.
280- values : vec ! [
281- query. parameters. values. deref( ) . clone( ) ,
282- query. parameters. values. deref( ) . clone( ) ,
283- ] ,
294+ statements_len : 2 ,
284295 } ;
285296 {
286297 let mut buf = Vec :: new ( ) ;
287298 batch. serialize ( & mut buf) . unwrap ( ) ;
288299
289- let batch_deserialized = Batch :: deserialize ( & mut & buf[ ..] ) . unwrap ( ) ;
300+ let batch_deserialized = BatchV2 :: deserialize ( & mut & buf[ ..] ) . unwrap ( ) ;
290301 assert_eq ! ( & batch_deserialized, & batch) ;
291302 }
292303 }
@@ -341,24 +352,30 @@ mod tests {
341352 }
342353
343354 // Batch
344- let statements = vec ! [ BatchStatement :: Query {
355+ let mut statements_and_values = vec ! [ ] ;
356+ BatchStatement :: Query {
345357 text : query. contents ,
346- } ] ;
347- let batch = Batch {
348- statements : Cow :: Owned ( statements) ,
358+ }
359+ . serialize ( & mut statements_and_values)
360+ . unwrap ( ) ;
361+ statements_and_values
362+ . extend_from_slice ( & query. parameters . values . element_count ( ) . to_be_bytes ( ) ) ;
363+ statements_and_values. extend_from_slice ( query. parameters . values . get_contents ( ) ) ;
364+
365+ let batch = BatchV2 {
349366 batch_type : BatchType :: Logged ,
350367 consistency : Consistency :: EachQuorum ,
351368 serial_consistency : None ,
352369 timestamp : None ,
353-
354- values : vec ! [ query . parameters . values . deref ( ) . clone ( ) ] ,
370+ statements_and_values : Cow :: Owned ( statements_and_values ) ,
371+ statements_len : 1 ,
355372 } ;
356373 {
357374 let mut buf = Vec :: new ( ) ;
358375 batch. serialize ( & mut buf) . unwrap ( ) ;
359376
360377 // Sanity check: batch deserializes to the equivalent.
361- let batch_deserialized = Batch :: deserialize ( & mut & buf[ ..] ) . unwrap ( ) ;
378+ let batch_deserialized = BatchV2 :: deserialize ( & mut & buf[ ..] ) . unwrap ( ) ;
362379 assert_eq ! ( batch, batch_deserialized) ;
363380
364381 // Now modify flags by adding an unknown one.
@@ -370,7 +387,7 @@ mod tests {
370387
371388 // Unknown flag should lead to frame rejection, as unknown flags can be new protocol extensions
372389 // leading to different semantics.
373- let _parse_error = Batch :: deserialize ( & mut & buf[ ..] ) . unwrap_err ( ) ;
390+ let _parse_error = BatchV2 :: deserialize ( & mut & buf[ ..] ) . unwrap_err ( ) ;
374391 }
375392 }
376393}
0 commit comments