Skip to content

Commit b0219f2

Browse files
Merge pull request #164 from yuyang-ok/raw_type
add raw_type to column
2 parents eaed2ad + 2c5207c commit b0219f2

4 files changed

Lines changed: 52 additions & 7 deletions

File tree

rsfbclient-core/src/row.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,17 @@ impl Row {
3737
#[derive(Debug, Clone)]
3838
pub struct Column {
3939
pub value: SqlType,
40+
pub raw_type: u32,
4041
pub name: String,
4142
}
4243

4344
impl Column {
44-
pub fn new(name: String, value: SqlType) -> Self {
45-
Column { name, value }
45+
pub fn new(name: String, raw_type: u32, value: SqlType) -> Self {
46+
Column {
47+
name,
48+
raw_type,
49+
value,
50+
}
4651
}
4752
}
4853

rsfbclient-native/src/row.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ pub struct ColumnBuffer {
5555

5656
/// Column name
5757
col_name: String,
58+
59+
raw_type: i16,
5860
}
5961

6062
impl ColumnBuffer {
@@ -154,6 +156,7 @@ impl ColumnBuffer {
154156
buffer,
155157
nullind,
156158
col_name,
159+
raw_type: sqltype,
157160
})
158161
}
159162

@@ -166,7 +169,11 @@ impl ColumnBuffer {
166169
charset: &Charset,
167170
) -> Result<Column, FbError> {
168171
if *self.nullind != 0 {
169-
return Ok(Column::new(self.col_name.clone(), SqlType::Null));
172+
return Ok(Column::new(
173+
self.col_name.clone(),
174+
self.raw_type as u32,
175+
SqlType::Null,
176+
));
170177
}
171178

172179
let col_type = match &self.buffer {
@@ -185,7 +192,11 @@ impl ColumnBuffer {
185192
Boolean(b) => SqlType::Boolean(**b != 0),
186193
};
187194

188-
Ok(Column::new(self.col_name.clone(), col_type))
195+
Ok(Column::new(
196+
self.col_name.clone(),
197+
self.raw_type as u32,
198+
col_type,
199+
))
189200
}
190201
}
191202

rsfbclient-rust/src/wire.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -586,18 +586,19 @@ pub fn parse_sql_response(
586586
let mut data = Vec::with_capacity(xsqlda.len());
587587

588588
for (col_index, var) in xsqlda.iter().enumerate() {
589+
// Remove nullable type indicator
590+
let sqltype = var.sqltype as u32 & (!1);
591+
589592
if version >= ProtocolVersion::V13 && read_null(resp, col_index)? {
590593
// There is no data in protocol 13 if null, so just continue
591594
data.push(ParsedColumn::Complete(Column::new(
592595
var.alias_name.clone(),
596+
sqltype,
593597
SqlType::Null,
594598
)));
595599
continue;
596600
}
597601

598-
// Remove nullable type indicator
599-
let sqltype = var.sqltype as u32 & (!1);
600-
601602
match sqltype {
602603
ibase::SQL_VARYING => {
603604
let d = resp.get_wire_bytes()?;
@@ -606,11 +607,13 @@ pub fn parse_sql_response(
606607
if null {
607608
data.push(ParsedColumn::Complete(Column::new(
608609
var.alias_name.clone(),
610+
sqltype,
609611
SqlType::Null,
610612
)))
611613
} else {
612614
data.push(ParsedColumn::Complete(Column::new(
613615
var.alias_name.clone(),
616+
sqltype,
614617
SqlType::Text(charset.decode(&d[..])?),
615618
)))
616619
}
@@ -623,11 +626,13 @@ pub fn parse_sql_response(
623626
if null {
624627
data.push(ParsedColumn::Complete(Column::new(
625628
var.alias_name.clone(),
629+
sqltype,
626630
SqlType::Null,
627631
)))
628632
} else {
629633
data.push(ParsedColumn::Complete(Column::new(
630634
var.alias_name.clone(),
635+
sqltype,
631636
SqlType::Integer(i),
632637
)))
633638
}
@@ -640,11 +645,13 @@ pub fn parse_sql_response(
640645
if null {
641646
data.push(ParsedColumn::Complete(Column::new(
642647
var.alias_name.clone(),
648+
sqltype,
643649
SqlType::Null,
644650
)))
645651
} else {
646652
data.push(ParsedColumn::Complete(Column::new(
647653
var.alias_name.clone(),
654+
sqltype,
648655
SqlType::Floating(f),
649656
)))
650657
}
@@ -660,11 +667,13 @@ pub fn parse_sql_response(
660667
if null {
661668
data.push(ParsedColumn::Complete(Column::new(
662669
var.alias_name.clone(),
670+
sqltype,
663671
SqlType::Null,
664672
)))
665673
} else {
666674
data.push(ParsedColumn::Complete(Column::new(
667675
var.alias_name.clone(),
676+
sqltype,
668677
SqlType::Timestamp(rsfbclient_core::date_time::decode_timestamp(ts)),
669678
)))
670679
}
@@ -677,6 +686,7 @@ pub fn parse_sql_response(
677686
if null {
678687
data.push(ParsedColumn::Complete(Column::new(
679688
var.alias_name.clone(),
689+
sqltype,
680690
SqlType::Null,
681691
)))
682692
} else {
@@ -697,11 +707,13 @@ pub fn parse_sql_response(
697707
if null {
698708
data.push(ParsedColumn::Complete(Column::new(
699709
var.alias_name.clone(),
710+
sqltype,
700711
SqlType::Null,
701712
)))
702713
} else {
703714
data.push(ParsedColumn::Complete(Column::new(
704715
var.alias_name.clone(),
716+
sqltype,
705717
SqlType::Boolean(b),
706718
)))
707719
}
@@ -767,6 +779,7 @@ impl ParsedColumn {
767779

768780
Column::new(
769781
col_name,
782+
ibase::SQL_BLOB,
770783
if binary {
771784
SqlType::Binary(data)
772785
} else {

src/tests/row.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,22 @@ mk_tests_default! {
411411
assert_eq!(res, col);
412412
}
413413

414+
Ok(())
415+
}
416+
#[test]
417+
fn raw_type () -> Result<(), FbError> {
418+
let mut conn = cbuilder().connect()?;
419+
420+
let row: Row = conn
421+
.query_first(
422+
"select cast('firebird' as varchar(8)), cast('firebird' as char(8)) from rdb$database",
423+
(),
424+
)?
425+
.unwrap();
426+
assert_eq!(2, row.cols.len());
427+
428+
assert_eq!(448, row.cols.first().unwrap().raw_type);
429+
414430
Ok(())
415431
}
416432
}

0 commit comments

Comments
 (0)