Skip to content

Commit d26720c

Browse files
authored
Merge pull request #421 from taosdata/fix/ws-get-client-info
fix(taos-ws-sys): fix ws_get_client_info error
2 parents b408a2a + 0551e28 commit d26720c

File tree

3 files changed

+298
-45
lines changed

3 files changed

+298
-45
lines changed

taos-query/src/de/mod.rs

Lines changed: 291 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@ use crate::Field;
1212
/// 'b: field lifetime may go across the whole query.
1313
pub struct RecordDeserializer<'b, R>
1414
where
15-
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
15+
R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
1616
{
17-
inner: <R as IntoIterator>::IntoIter,
17+
inner: R,
1818
value: Option<BorrowedValue<'b>>,
1919
_marker: PhantomData<&'b u8>,
2020
}
2121

22-
impl<'b, R> From<R> for RecordDeserializer<'b, R>
22+
impl<'b, R, T> From<T> for RecordDeserializer<'b, R>
2323
where
24-
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
24+
R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
25+
T: IntoIterator<Item = (&'b Field, BorrowedValue<'b>), IntoIter = R>,
2526
{
26-
fn from(input: R) -> Self {
27+
fn from(input: T) -> Self {
2728
Self {
2829
inner: input.into_iter(),
2930
value: None,
@@ -34,16 +35,24 @@ where
3435

3536
impl<'b, R> RecordDeserializer<'b, R>
3637
where
37-
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
38+
R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
3839
{
3940
fn next_value(&mut self) -> Option<BorrowedValue<'b>> {
4041
self.inner.next().map(|(_, v)| v)
4142
}
4243
}
4344

45+
// impl<'b, R> RecordDeserializer<'b, R>
46+
// where
47+
// R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
48+
// {
49+
// fn cloned(&self) -> RecordDeserializer<'b, std::iter::Cloned<R>> {
50+
// RecordDeserializer::from(self.inner.ier().cloned())
51+
// }
52+
// }
4453
impl<'de, 'b: 'de, R> MapAccess<'de> for RecordDeserializer<'b, R>
4554
where
46-
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
55+
R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
4756
{
4857
type Error = Error;
4958

@@ -73,7 +82,7 @@ where
7382

7483
impl<'de, 'b: 'de, R> SeqAccess<'de> for RecordDeserializer<'b, R>
7584
where
76-
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
85+
R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
7786
{
7887
type Error = Error;
7988

@@ -93,25 +102,26 @@ where
93102

94103
impl<'de, 'b: 'de, R> Deserializer<'de> for RecordDeserializer<'b, R>
95104
where
96-
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
105+
R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
97106
{
98107
type Error = Error;
99108

100109
// Look at the input data to decide what Serde data model type to
101110
// deserialize as. Not all data formats are able to support this operation.
102111
// Formats that support `deserialize_any` are known as self-describing.
103-
fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
112+
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
104113
where
105114
V: Visitor<'de>,
106115
{
107-
match self.next_value() {
108-
Some(v) => v
109-
.deserialize_any(visitor)
110-
.map_err(<Self::Error as serde::de::Error>::custom),
111-
None => Err(<Self::Error as serde::de::Error>::custom(
112-
"expect value, not none",
113-
)),
114-
}
116+
visitor.visit_map(self)
117+
// match self.next_value() {
118+
// Some(v) => v
119+
// .deserialize_any(visitor)
120+
// .map_err(<Self::Error as serde::de::Error>::custom),
121+
// None => Err(<Self::Error as serde::de::Error>::custom(
122+
// "expect value, not none",
123+
// )),
124+
// }
115125
}
116126

117127
serde::forward_to_deserialize_any! {
@@ -263,3 +273,266 @@ where
263273
self.deserialize_map(visitor)
264274
}
265275
}
276+
277+
#[cfg(test)]
278+
mod tests {
279+
use serde::Deserialize;
280+
281+
use crate::common::Ty;
282+
283+
use super::*;
284+
285+
#[test]
286+
fn test_empty_deserializer() {
287+
let fields = vec![];
288+
let values = vec![];
289+
290+
{
291+
let iter = fields.iter().zip(values.iter().cloned());
292+
293+
let deserializer = RecordDeserializer::from(iter);
294+
295+
#[derive(Deserialize, PartialEq, Eq, Debug)]
296+
struct Record {}
297+
let record = Record::deserialize(deserializer).unwrap();
298+
assert_eq!(record, Record {});
299+
}
300+
{
301+
let iter = fields.iter().zip(values.iter().cloned());
302+
303+
let deserializer = RecordDeserializer::from(iter);
304+
305+
#[derive(Deserialize, PartialEq, Eq, Debug)]
306+
struct Record {
307+
a: Option<i32>,
308+
}
309+
let record = Record::deserialize(deserializer).unwrap();
310+
assert_eq!(record, Record { a: None });
311+
}
312+
}
313+
#[test]
314+
fn test_borrowed_values_deserializer() {
315+
let fields = vec![
316+
Field::new("a", Ty::Int, 4),
317+
Field::new("b", Ty::VarChar, 128),
318+
Field::new("c", Ty::NChar, 128),
319+
];
320+
let values = vec![
321+
BorrowedValue::Null(Ty::Int),
322+
BorrowedValue::Null(Ty::VarChar),
323+
BorrowedValue::Null(Ty::NChar),
324+
];
325+
326+
{
327+
let iter = fields.iter().zip(values.iter().cloned());
328+
329+
let deserializer = RecordDeserializer::from(iter);
330+
331+
#[derive(Deserialize, PartialEq, Eq, Debug)]
332+
struct Record {
333+
a: i32,
334+
b: i32,
335+
c: i32,
336+
}
337+
let record = Record::deserialize(deserializer);
338+
assert!(record.is_err());
339+
}
340+
{
341+
let iter = fields.iter().zip(values.iter().cloned());
342+
343+
let deserializer = RecordDeserializer::from(iter);
344+
345+
#[derive(Deserialize, PartialEq, Eq, Debug)]
346+
struct Record<'a> {
347+
a: i32,
348+
b: Option<&'a str>,
349+
c: Option<&'a str>,
350+
}
351+
let record = Record::deserialize(deserializer);
352+
assert_eq!(
353+
record.unwrap_err().to_string(),
354+
"invalid type: Option value, expected i32"
355+
);
356+
}
357+
{
358+
let iter = fields.iter().zip(values.iter().cloned());
359+
360+
let deserializer = RecordDeserializer::from(iter);
361+
362+
#[derive(Deserialize, PartialEq, Eq, Debug)]
363+
struct Record<'a> {
364+
a: Option<i32>,
365+
b: &'a str,
366+
c: Option<&'a str>,
367+
}
368+
let record = Record::deserialize(deserializer).unwrap();
369+
assert_eq!(
370+
record,
371+
Record {
372+
a: None,
373+
b: "",
374+
c: None
375+
}
376+
);
377+
}
378+
{
379+
let iter = fields.iter().zip(values.iter().cloned());
380+
381+
let deserializer = RecordDeserializer::from(iter);
382+
383+
#[derive(Deserialize, PartialEq, Eq, Debug)]
384+
struct Record<'a> {
385+
a: Option<i32>,
386+
b: Option<&'a str>,
387+
c: Option<&'a str>,
388+
}
389+
let record = Record::deserialize(deserializer).unwrap();
390+
assert_eq!(
391+
record,
392+
Record {
393+
a: None,
394+
b: None,
395+
c: None
396+
}
397+
);
398+
}
399+
}
400+
#[test]
401+
fn test_record_deserializer() {
402+
let fields = vec![
403+
Field::new("a", Ty::Int, 4),
404+
Field::new("b", Ty::Int, 4),
405+
Field::new("c", Ty::Int, 4),
406+
];
407+
let values = vec![
408+
BorrowedValue::Int(1),
409+
BorrowedValue::Int(2),
410+
BorrowedValue::Int(3),
411+
];
412+
413+
{
414+
let iter = fields.iter().zip(values.iter().cloned());
415+
416+
let deserializer = RecordDeserializer::from(iter);
417+
418+
#[derive(Deserialize, PartialEq, Eq, Debug)]
419+
struct Record {
420+
a: i32,
421+
b: i32,
422+
c: i32,
423+
} // New type struct
424+
let record = Record::deserialize(deserializer).unwrap();
425+
assert_eq!(record, Record { a: 1, b: 2, c: 3 });
426+
}
427+
{
428+
let iter = fields.iter().zip(values.iter().cloned());
429+
430+
let deserializer = RecordDeserializer::from(iter);
431+
432+
#[derive(Deserialize, PartialEq, Eq, Debug)]
433+
struct Record; // Unit struct
434+
let record = Record::deserialize(deserializer).unwrap();
435+
assert_eq!(record, Record);
436+
}
437+
{
438+
let iter = fields.iter().zip(values.iter().cloned());
439+
440+
let deserializer = RecordDeserializer::from(iter);
441+
442+
#[derive(Deserialize, PartialEq, Eq, Debug)]
443+
struct Record(serde_json::Value); // Tuple struct
444+
let record = Record::deserialize(deserializer).unwrap();
445+
assert_eq!(record, Record(serde_json::json!({"a": 1, "b": 2, "c": 3})));
446+
}
447+
{
448+
let iter = fields.iter().zip(values.iter().cloned());
449+
450+
let deserializer = RecordDeserializer::from(iter);
451+
452+
#[derive(Deserialize, PartialEq, Eq, Debug)]
453+
struct Record(i32, i32, i32); // Tuple struct
454+
let record = Record::deserialize(deserializer).unwrap();
455+
assert_eq!(record, Record(1, 2, 3));
456+
}
457+
458+
{
459+
let iter = fields.iter().zip(values.iter().cloned());
460+
461+
let deserializer = RecordDeserializer::from(iter);
462+
463+
type Record = (i32, i32, i32);
464+
let record = Record::deserialize(deserializer).unwrap();
465+
assert_eq!(record, (1, 2, 3));
466+
}
467+
468+
{
469+
let iter = fields.iter().zip(values.iter().cloned());
470+
471+
let deserializer = RecordDeserializer::from(iter);
472+
473+
type Record = [i32; 3];
474+
let record = Record::deserialize(deserializer).unwrap();
475+
assert_eq!(record, [1, 2, 3]);
476+
}
477+
478+
{
479+
let iter = fields.iter().zip(values.iter().cloned());
480+
481+
let deserializer = RecordDeserializer::from(iter);
482+
483+
type Record = Vec<i32>;
484+
let record = Record::deserialize(deserializer).unwrap();
485+
assert_eq!(record, vec![1, 2, 3]);
486+
}
487+
488+
{
489+
let iter = fields.iter().zip(values.iter().cloned());
490+
491+
let deserializer = RecordDeserializer::from(iter);
492+
let value: [crate::common::Value; 3] =
493+
serde::Deserialize::deserialize(deserializer).unwrap();
494+
dbg!(&value);
495+
assert_eq!(
496+
value,
497+
[
498+
crate::common::Value::Int(1),
499+
crate::common::Value::Int(2),
500+
crate::common::Value::Int(3)
501+
]
502+
);
503+
}
504+
{
505+
let iter = fields.iter().zip(values.iter().cloned());
506+
507+
let deserializer = RecordDeserializer::from(iter);
508+
let value: String = serde::Deserialize::deserialize(deserializer).unwrap();
509+
dbg!(&value);
510+
assert_eq!(value, "1");
511+
}
512+
{
513+
let iter = fields.iter().zip(values.iter().cloned());
514+
515+
let deserializer = RecordDeserializer::from(iter);
516+
let value: () = serde::Deserialize::deserialize(deserializer).unwrap();
517+
dbg!(&value);
518+
assert_eq!(value, ());
519+
}
520+
{
521+
let iter = fields.iter().zip(values.iter().cloned());
522+
523+
let deserializer = RecordDeserializer::from(iter);
524+
let value: Option<String> = serde::Deserialize::deserialize(deserializer).unwrap();
525+
dbg!(&value);
526+
assert_eq!(value, Some("1".to_string()));
527+
}
528+
529+
{
530+
let iter = fields.iter().zip(values.iter().cloned());
531+
532+
let deserializer = RecordDeserializer::from(iter);
533+
let value = serde_json::Value::deserialize(deserializer).unwrap();
534+
dbg!(&value);
535+
assert_eq!(value, serde_json::json!({"a": 1, "b": 2, "c": 3}));
536+
}
537+
}
538+
}

taos-ws-sys/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ anyhow = "1"
1414
bytes = "1.1.0"
1515
pretty_env_logger = "0.5.0"
1616
serde_json = "1"
17-
cargo_metadata = "0.18.1"
1817
taos-error = { path = "../taos-error" }
1918
taos-query = { path = "../taos-query" }
2019
taos-ws = { path = "../taos-ws" }

0 commit comments

Comments
 (0)