1
1
use crate :: argconv:: * ;
2
2
use crate :: cass_error:: CassError ;
3
3
use crate :: cass_types:: {
4
- cass_data_type_type, get_column_type, CassDataType , CassValueType , MapDataType ,
4
+ cass_data_type_type, get_column_type, CassColumnSpec , CassDataType , CassValueType , MapDataType ,
5
5
} ;
6
6
use crate :: inet:: CassInet ;
7
7
use crate :: metadata:: {
@@ -24,37 +24,22 @@ pub struct CassResult {
24
24
}
25
25
26
26
pub struct CassResultData {
27
- pub col_names : Vec < String > ,
28
- pub col_data_types : Arc < Vec < Arc < CassDataType > > > ,
27
+ pub col_specs : Vec < CassColumnSpec > ,
29
28
}
30
29
31
30
impl CassResultData {
32
- pub fn from_result_payload (
33
- col_specs : & [ ColumnSpec < ' _ > ] ,
34
- maybe_col_data_types : Option < Arc < Vec < Arc < CassDataType > > > > ,
35
- ) -> CassResultData {
36
- // `maybe_col_data_types` is:
37
- // - Some(_) for prepared statements executions
38
- // - None for unprepared (simple) queries executions
39
- let col_data_types = maybe_col_data_types. unwrap_or_else ( || {
40
- // This allocation is unfortunately necessary, because of the type of CassResultData::col_data_types.
41
- Arc :: new (
42
- col_specs
43
- . iter ( )
44
- . map ( |col_spec| Arc :: new ( get_column_type ( col_spec. typ ( ) ) ) )
45
- . collect ( ) ,
46
- )
47
- } ) ;
48
-
49
- let col_names = col_specs
31
+ pub fn from_column_specs ( col_specs : & [ ColumnSpec < ' _ > ] ) -> CassResultData {
32
+ let col_specs = col_specs
50
33
. iter ( )
51
- . map ( |col_spec| col_spec. name ( ) . to_owned ( ) )
34
+ . map ( |col_spec| {
35
+ let name = col_spec. name ( ) . to_owned ( ) ;
36
+ let data_type = Arc :: new ( get_column_type ( col_spec. typ ( ) ) ) ;
37
+
38
+ CassColumnSpec { name, data_type }
39
+ } )
52
40
. collect ( ) ;
53
41
54
- CassResultData {
55
- col_names,
56
- col_data_types,
57
- }
42
+ CassResultData { col_specs }
58
43
}
59
44
}
60
45
@@ -900,12 +885,12 @@ pub unsafe extern "C" fn cass_row_get_column_by_name_n(
900
885
901
886
return row_from_raw
902
887
. result_metadata
903
- . col_names
888
+ . col_specs
904
889
. iter ( )
905
890
. enumerate ( )
906
- . find ( |( _, col_name ) | {
907
- is_case_sensitive && * col_name == name_str
908
- || !is_case_sensitive && col_name . eq_ignore_ascii_case ( name_str)
891
+ . find ( |( _, col_spec ) | {
892
+ is_case_sensitive && col_spec . name == name_str
893
+ || !is_case_sensitive && col_spec . name . eq_ignore_ascii_case ( name_str)
909
894
} )
910
895
. map ( |( index, _) | {
911
896
return match row_from_raw. columns . get ( index) {
@@ -926,11 +911,16 @@ pub unsafe extern "C" fn cass_result_column_name(
926
911
let result_from_raw = ptr_to_ref ( result) ;
927
912
let index_usize: usize = index. try_into ( ) . unwrap ( ) ;
928
913
929
- if index_usize >= result_from_raw. metadata . col_data_types . len ( ) {
914
+ if index_usize >= result_from_raw. metadata . col_specs . len ( ) {
930
915
return CassError :: CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS ;
931
916
}
932
917
933
- let column_name = result_from_raw. metadata . col_names . get ( index_usize) . unwrap ( ) ;
918
+ let column_name = & result_from_raw
919
+ . metadata
920
+ . col_specs
921
+ . get ( index_usize)
922
+ . unwrap ( )
923
+ . name ;
934
924
935
925
write_str_to_c ( column_name, name, name_length) ;
936
926
@@ -961,9 +951,9 @@ pub unsafe extern "C" fn cass_result_column_data_type(
961
951
962
952
result_from_raw
963
953
. metadata
964
- . col_data_types
954
+ . col_specs
965
955
. get ( index_usize)
966
- . map ( Arc :: as_ptr)
956
+ . map ( |col_spec| Arc :: as_ptr ( & col_spec . data_type ) )
967
957
. unwrap_or ( std:: ptr:: null ( ) )
968
958
}
969
959
@@ -1338,7 +1328,7 @@ pub unsafe extern "C" fn cass_result_row_count(result_raw: *const CassResult) ->
1338
1328
pub unsafe extern "C" fn cass_result_column_count ( result_raw : * const CassResult ) -> size_t {
1339
1329
let result = ptr_to_ref ( result_raw) ;
1340
1330
1341
- result. metadata . col_data_types . len ( ) as size_t
1331
+ result. metadata . col_specs . len ( ) as size_t
1342
1332
}
1343
1333
1344
1334
#[ no_mangle]
@@ -1414,17 +1404,14 @@ mod tests {
1414
1404
const SECOND_COLUMN_NAME : & str = "varint_col" ;
1415
1405
const THIRD_COLUMN_NAME : & str = "list_double_col" ;
1416
1406
fn create_cass_rows_result ( ) -> CassResult {
1417
- let metadata = Arc :: new ( CassResultData :: from_result_payload (
1418
- & [
1419
- col_spec ( FIRST_COLUMN_NAME , ColumnType :: BigInt ) ,
1420
- col_spec ( SECOND_COLUMN_NAME , ColumnType :: Varint ) ,
1421
- col_spec (
1422
- THIRD_COLUMN_NAME ,
1423
- ColumnType :: List ( Box :: new ( ColumnType :: Double ) ) ,
1424
- ) ,
1425
- ] ,
1426
- None ,
1427
- ) ) ;
1407
+ let metadata = Arc :: new ( CassResultData :: from_column_specs ( & [
1408
+ col_spec ( FIRST_COLUMN_NAME , ColumnType :: BigInt ) ,
1409
+ col_spec ( SECOND_COLUMN_NAME , ColumnType :: Varint ) ,
1410
+ col_spec (
1411
+ THIRD_COLUMN_NAME ,
1412
+ ColumnType :: List ( Box :: new ( ColumnType :: Double ) ) ,
1413
+ ) ,
1414
+ ] ) ) ;
1428
1415
1429
1416
let rows = create_cass_rows_from_rows (
1430
1417
vec ! [ Row {
@@ -1532,7 +1519,7 @@ mod tests {
1532
1519
}
1533
1520
1534
1521
fn create_non_rows_cass_result ( ) -> CassResult {
1535
- let metadata = Arc :: new ( CassResultData :: from_result_payload ( & [ ] , None ) ) ;
1522
+ let metadata = Arc :: new ( CassResultData :: from_column_specs ( & [ ] ) ) ;
1536
1523
CassResult {
1537
1524
rows : None ,
1538
1525
metadata,
0 commit comments