@@ -163,6 +163,10 @@ where
163163
164164impl Query for WriteQuery {
165165 fn build ( & self ) -> Result < ValidQuery , Error > {
166+ self . build_with_opts ( false )
167+ }
168+
169+ fn build_with_opts ( & self , use_v2 : bool ) -> Result < ValidQuery , Error > {
166170 if self . fields . is_empty ( ) {
167171 return Err ( Error :: InvalidQueryError {
168172 error : "fields cannot be empty" . to_string ( ) ,
@@ -173,10 +177,20 @@ impl Query for WriteQuery {
173177 . tags
174178 . iter ( )
175179 . map ( |( tag, value) | {
180+ let escaped_tag_key = if use_v2 {
181+ LineProtoTerm :: TagKey ( tag) . escape_v2 ( )
182+ } else {
183+ LineProtoTerm :: TagKey ( tag) . escape ( )
184+ } ;
185+ let escaped_tag_value = if use_v2 {
186+ LineProtoTerm :: TagValue ( value) . escape_v2 ( )
187+ } else {
188+ LineProtoTerm :: TagValue ( value) . escape ( )
189+ } ;
176190 format ! (
177191 "{tag}={value}" ,
178- tag = LineProtoTerm :: TagKey ( tag ) . escape ( ) ,
179- value = LineProtoTerm :: TagValue ( value ) . escape ( ) ,
192+ tag = escaped_tag_key ,
193+ value = escaped_tag_value ,
180194 )
181195 } )
182196 . collect :: < Vec < String > > ( )
@@ -189,18 +203,34 @@ impl Query for WriteQuery {
189203 . fields
190204 . iter ( )
191205 . map ( |( field, value) | {
206+ let escaped_field_key = if use_v2 {
207+ LineProtoTerm :: FieldKey ( field) . escape_v2 ( )
208+ } else {
209+ LineProtoTerm :: FieldKey ( field) . escape ( )
210+ } ;
211+ let escaped_field_value = if use_v2 {
212+ LineProtoTerm :: FieldValue ( value) . escape_v2 ( )
213+ } else {
214+ LineProtoTerm :: FieldValue ( value) . escape ( )
215+ } ;
192216 format ! (
193217 "{field}={value}" ,
194- field = LineProtoTerm :: FieldKey ( field ) . escape ( ) ,
195- value = LineProtoTerm :: FieldValue ( value ) . escape ( ) ,
218+ field = escaped_field_key ,
219+ value = escaped_field_value ,
196220 )
197221 } )
198222 . collect :: < Vec < String > > ( )
199223 . join ( "," ) ;
200224
225+ let escaped_measurement = if use_v2 {
226+ LineProtoTerm :: Measurement ( & self . measurement ) . escape_v2 ( )
227+ } else {
228+ LineProtoTerm :: Measurement ( & self . measurement ) . escape ( )
229+ } ;
230+
201231 Ok ( ValidQuery ( format ! (
202232 "{measurement}{tags} {fields} {time}" ,
203- measurement = LineProtoTerm :: Measurement ( & self . measurement ) . escape ( ) ,
233+ measurement = escaped_measurement ,
204234 tags = tags,
205235 fields = fields,
206236 time = self . timestamp
@@ -224,6 +254,17 @@ impl Query for Vec<WriteQuery> {
224254 Ok ( ValidQuery ( qlines. join ( "\n " ) ) )
225255 }
226256
257+ fn build_with_opts ( & self , use_v2 : bool ) -> Result < ValidQuery , Error > {
258+ let mut qlines = Vec :: new ( ) ;
259+
260+ for q in self {
261+ let valid_query = q. build_with_opts ( use_v2) ?;
262+ qlines. push ( valid_query. 0 ) ;
263+ }
264+
265+ Ok ( ValidQuery ( qlines. join ( "\n " ) ) )
266+ }
267+
227268 fn get_type ( & self ) -> QueryType {
228269 QueryType :: WriteQuery (
229270 self . get ( 0 )
@@ -267,6 +308,22 @@ mod tests {
267308 . add_field ( "temperature_unsigned" , 82u64 )
268309 . build ( ) ;
269310
311+ assert ! ( query. is_ok( ) , "Query was empty" ) ;
312+ assert_eq ! (
313+ query. unwrap( ) ,
314+ "weather temperature=82i,wind_strength=3.7,temperature_unsigned=82i 11"
315+ ) ;
316+ }
317+
318+ #[ test]
319+ fn test_write_builder_multiple_fields_with_v2 ( ) {
320+ let query = Timestamp :: Hours ( 11 )
321+ . into_query ( "weather" . to_string ( ) )
322+ . add_field ( "temperature" , 82 )
323+ . add_field ( "wind_strength" , 3.7 )
324+ . add_field ( "temperature_unsigned" , 82u64 )
325+ . build_with_opts ( true ) ;
326+
270327 assert ! ( query. is_ok( ) , "Query was empty" ) ;
271328 assert_eq ! (
272329 query. unwrap( ) ,
@@ -282,6 +339,18 @@ mod tests {
282339 . add_tag ( "wind_strength" , <Option < u64 > >:: None )
283340 . build ( ) ;
284341
342+ assert ! ( query. is_ok( ) , "Query was empty" ) ;
343+ assert_eq ! ( query. unwrap( ) , "weather temperature=82i 11" ) ;
344+ }
345+
346+ #[ test]
347+ fn test_write_builder_optional_fields_with_v2 ( ) {
348+ let query = Timestamp :: Hours ( 11 )
349+ . into_query ( "weather" . to_string ( ) )
350+ . add_field ( "temperature" , 82u64 )
351+ . add_tag ( "wind_strength" , <Option < u64 > >:: None )
352+ . build_with_opts ( true ) ;
353+
285354 assert ! ( query. is_ok( ) , "Query was empty" ) ;
286355 assert_eq ! ( query. unwrap( ) , "weather temperature=82u 11" ) ;
287356 }
0 commit comments