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:: {
@@ -18,50 +18,37 @@ use uuid::Uuid;
18
18
19
19
pub struct CassResult {
20
20
pub rows : Option < Vec < CassRow > > ,
21
- pub metadata : Arc < CassResultData > ,
21
+ pub metadata : Arc < CassResultMetadata > ,
22
+ pub tracing_id : Option < Uuid > ,
23
+ pub paging_state_response : PagingStateResponse ,
22
24
}
23
25
24
- pub struct CassResultData {
25
- pub paging_state_response : PagingStateResponse ,
26
- pub col_specs : Vec < ColumnSpec < ' static > > ,
27
- pub col_data_types : Arc < Vec < Arc < CassDataType > > > ,
28
- pub tracing_id : Option < Uuid > ,
26
+ #[ derive( Debug ) ]
27
+ pub struct CassResultMetadata {
28
+ pub col_specs : Vec < CassColumnSpec > ,
29
29
}
30
30
31
- impl CassResultData {
32
- pub fn from_result_payload (
33
- paging_state_response : PagingStateResponse ,
34
- col_specs : Vec < ColumnSpec < ' static > > ,
35
- maybe_col_data_types : Option < Arc < Vec < Arc < CassDataType > > > > ,
36
- tracing_id : Option < Uuid > ,
37
- ) -> CassResultData {
38
- // `maybe_col_data_types` is:
39
- // - Some(_) for prepared statements executions
40
- // - None for unprepared (simple) queries executions
41
- let col_data_types = maybe_col_data_types. unwrap_or_else ( || {
42
- // This allocation is unfortunately necessary, because of the type of CassResultData::col_data_types.
43
- Arc :: new (
44
- col_specs
45
- . iter ( )
46
- . map ( |col_spec| Arc :: new ( get_column_type ( col_spec. typ ( ) ) ) )
47
- . collect ( ) ,
48
- )
49
- } ) ;
50
-
51
- CassResultData {
52
- paging_state_response,
53
- col_specs,
54
- col_data_types,
55
- tracing_id,
56
- }
31
+ impl CassResultMetadata {
32
+ pub fn from_column_specs ( col_specs : & [ ColumnSpec < ' _ > ] ) -> CassResultMetadata {
33
+ let col_specs = col_specs
34
+ . iter ( )
35
+ . map ( |col_spec| {
36
+ let name = col_spec. name ( ) . to_owned ( ) ;
37
+ let data_type = Arc :: new ( get_column_type ( col_spec. typ ( ) ) ) ;
38
+
39
+ CassColumnSpec { name, data_type }
40
+ } )
41
+ . collect ( ) ;
42
+
43
+ CassResultMetadata { col_specs }
57
44
}
58
45
}
59
46
60
47
/// The lifetime of CassRow is bound to CassResult.
61
48
/// It will be freed, when CassResult is freed.(see #[cass_result_free])
62
49
pub struct CassRow {
63
50
pub columns : Vec < CassValue > ,
64
- pub result_metadata : Arc < CassResultData > ,
51
+ pub result_metadata : Arc < CassResultMetadata > ,
65
52
}
66
53
67
54
pub enum Value {
@@ -851,7 +838,7 @@ pub unsafe extern "C" fn cass_result_free(result_raw: *const CassResult) {
851
838
#[ no_mangle]
852
839
pub unsafe extern "C" fn cass_result_has_more_pages ( result : * const CassResult ) -> cass_bool_t {
853
840
let result = ptr_to_ref ( result) ;
854
- ( !result. metadata . paging_state_response . finished ( ) ) as cass_bool_t
841
+ ( !result. paging_state_response . finished ( ) ) as cass_bool_t
855
842
}
856
843
857
844
#[ no_mangle]
@@ -902,9 +889,9 @@ pub unsafe extern "C" fn cass_row_get_column_by_name_n(
902
889
. col_specs
903
890
. iter ( )
904
891
. enumerate ( )
905
- . find ( |( _, spec ) | {
906
- is_case_sensitive && spec . name ( ) == name_str
907
- || !is_case_sensitive && spec . name ( ) . eq_ignore_ascii_case ( name_str)
892
+ . find ( |( _, col_spec ) | {
893
+ is_case_sensitive && col_spec . name == name_str
894
+ || !is_case_sensitive && col_spec . name . eq_ignore_ascii_case ( name_str)
908
895
} )
909
896
. map ( |( index, _) | {
910
897
return match row_from_raw. columns . get ( index) {
@@ -929,8 +916,12 @@ pub unsafe extern "C" fn cass_result_column_name(
929
916
return CassError :: CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS ;
930
917
}
931
918
932
- let column_spec: & ColumnSpec = result_from_raw. metadata . col_specs . get ( index_usize) . unwrap ( ) ;
933
- let column_name = column_spec. name ( ) ;
919
+ let column_name = & result_from_raw
920
+ . metadata
921
+ . col_specs
922
+ . get ( index_usize)
923
+ . unwrap ( )
924
+ . name ;
934
925
935
926
write_str_to_c ( column_name, name, name_length) ;
936
927
@@ -961,9 +952,9 @@ pub unsafe extern "C" fn cass_result_column_data_type(
961
952
962
953
result_from_raw
963
954
. metadata
964
- . col_data_types
955
+ . col_specs
965
956
. get ( index_usize)
966
- . map ( Arc :: as_ptr)
957
+ . map ( |col_spec| Arc :: as_ptr ( & col_spec . data_type ) )
967
958
. unwrap_or ( std:: ptr:: null ( ) )
968
959
}
969
960
@@ -1365,7 +1356,7 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
1365
1356
1366
1357
let result_from_raw = ptr_to_ref ( result) ;
1367
1358
1368
- match & result_from_raw. metadata . paging_state_response {
1359
+ match & result_from_raw. paging_state_response {
1369
1360
PagingStateResponse :: HasMorePages { state } => match state. as_bytes_slice ( ) {
1370
1361
Some ( result_paging_state) => {
1371
1362
* paging_state_size = result_paging_state. len ( ) as u64 ;
@@ -1404,7 +1395,9 @@ mod tests {
1404
1395
session:: create_cass_rows_from_rows,
1405
1396
} ;
1406
1397
1407
- use super :: { cass_result_column_count, cass_result_column_type, CassResult , CassResultData } ;
1398
+ use super :: {
1399
+ cass_result_column_count, cass_result_column_type, CassResult , CassResultMetadata ,
1400
+ } ;
1408
1401
1409
1402
fn col_spec ( name : & ' static str , typ : ColumnType < ' static > ) -> ColumnSpec < ' static > {
1410
1403
ColumnSpec :: borrowed ( name, typ, TableSpec :: borrowed ( "ks" , "tbl" ) )
@@ -1414,19 +1407,14 @@ mod tests {
1414
1407
const SECOND_COLUMN_NAME : & str = "varint_col" ;
1415
1408
const THIRD_COLUMN_NAME : & str = "list_double_col" ;
1416
1409
fn create_cass_rows_result ( ) -> CassResult {
1417
- let metadata = Arc :: new ( CassResultData :: from_result_payload (
1418
- PagingStateResponse :: NoMorePages ,
1419
- vec ! [
1420
- col_spec( FIRST_COLUMN_NAME , ColumnType :: BigInt ) ,
1421
- col_spec( SECOND_COLUMN_NAME , ColumnType :: Varint ) ,
1422
- col_spec(
1423
- THIRD_COLUMN_NAME ,
1424
- ColumnType :: List ( Box :: new( ColumnType :: Double ) ) ,
1425
- ) ,
1426
- ] ,
1427
- None ,
1428
- None ,
1429
- ) ) ;
1410
+ let metadata = Arc :: new ( CassResultMetadata :: from_column_specs ( & [
1411
+ col_spec ( FIRST_COLUMN_NAME , ColumnType :: BigInt ) ,
1412
+ col_spec ( SECOND_COLUMN_NAME , ColumnType :: Varint ) ,
1413
+ col_spec (
1414
+ THIRD_COLUMN_NAME ,
1415
+ ColumnType :: List ( Box :: new ( ColumnType :: Double ) ) ,
1416
+ ) ,
1417
+ ] ) ) ;
1430
1418
1431
1419
let rows = create_cass_rows_from_rows (
1432
1420
vec ! [ Row {
@@ -1446,6 +1434,8 @@ mod tests {
1446
1434
CassResult {
1447
1435
rows : Some ( rows) ,
1448
1436
metadata,
1437
+ tracing_id : None ,
1438
+ paging_state_response : PagingStateResponse :: NoMorePages ,
1449
1439
}
1450
1440
}
1451
1441
@@ -1532,15 +1522,12 @@ mod tests {
1532
1522
}
1533
1523
1534
1524
fn create_non_rows_cass_result ( ) -> CassResult {
1535
- let metadata = Arc :: new ( CassResultData :: from_result_payload (
1536
- PagingStateResponse :: NoMorePages ,
1537
- vec ! [ ] ,
1538
- None ,
1539
- None ,
1540
- ) ) ;
1525
+ let metadata = Arc :: new ( CassResultMetadata :: from_column_specs ( & [ ] ) ) ;
1541
1526
CassResult {
1542
1527
rows : None ,
1543
1528
metadata,
1529
+ tracing_id : None ,
1530
+ paging_state_response : PagingStateResponse :: NoMorePages ,
1544
1531
}
1545
1532
}
1546
1533
0 commit comments