@@ -1374,6 +1374,195 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
1374
1374
CassError :: CASS_OK
1375
1375
}
1376
1376
1377
+ #[ cfg( test) ]
1378
+ mod tests {
1379
+ use std:: { ffi:: c_char, ptr:: addr_of_mut, sync:: Arc } ;
1380
+
1381
+ use scylla:: {
1382
+ frame:: response:: result:: { ColumnSpec , ColumnType , CqlValue , Row , TableSpec } ,
1383
+ transport:: PagingStateResponse ,
1384
+ } ;
1385
+
1386
+ use crate :: {
1387
+ cass_error:: CassError ,
1388
+ cass_types:: { CassDataType , CassValueType } ,
1389
+ query_result:: {
1390
+ cass_result_column_data_type, cass_result_column_name, cass_result_first_row,
1391
+ ptr_to_cstr_n, ptr_to_ref, size_t,
1392
+ } ,
1393
+ session:: create_cass_rows_from_rows,
1394
+ } ;
1395
+
1396
+ use super :: { cass_result_column_count, cass_result_column_type, CassResult , CassResultData } ;
1397
+
1398
+ fn col_spec ( name : & str , typ : ColumnType ) -> ColumnSpec {
1399
+ ColumnSpec {
1400
+ table_spec : TableSpec :: borrowed ( "ks" , "tbl" ) ,
1401
+ name : name. to_string ( ) ,
1402
+ typ,
1403
+ }
1404
+ }
1405
+
1406
+ const FIRST_COLUMN_NAME : & str = "bigint_col" ;
1407
+ const SECOND_COLUMN_NAME : & str = "varint_col" ;
1408
+ const THIRD_COLUMN_NAME : & str = "list_double_col" ;
1409
+ fn create_cass_rows_result ( ) -> CassResult {
1410
+ let metadata = Arc :: new ( CassResultData :: from_result_payload (
1411
+ PagingStateResponse :: NoMorePages ,
1412
+ vec ! [
1413
+ col_spec( FIRST_COLUMN_NAME , ColumnType :: BigInt ) ,
1414
+ col_spec( SECOND_COLUMN_NAME , ColumnType :: Varint ) ,
1415
+ col_spec(
1416
+ THIRD_COLUMN_NAME ,
1417
+ ColumnType :: List ( Box :: new( ColumnType :: Double ) ) ,
1418
+ ) ,
1419
+ ] ,
1420
+ None ,
1421
+ ) ) ;
1422
+
1423
+ let rows = create_cass_rows_from_rows (
1424
+ Some ( vec ! [ Row {
1425
+ columns: vec![
1426
+ Some ( CqlValue :: BigInt ( 42 ) ) ,
1427
+ None ,
1428
+ Some ( CqlValue :: List ( vec![
1429
+ CqlValue :: Float ( 0.5 ) ,
1430
+ CqlValue :: Float ( 42.42 ) ,
1431
+ CqlValue :: Float ( 9999.9999 ) ,
1432
+ ] ) ) ,
1433
+ ] ,
1434
+ } ] ) ,
1435
+ & metadata,
1436
+ ) ;
1437
+
1438
+ CassResult { rows, metadata }
1439
+ }
1440
+
1441
+ unsafe fn cass_result_column_name_rust_str (
1442
+ result_ptr : * const CassResult ,
1443
+ column_index : u64 ,
1444
+ ) -> Option < & ' static str > {
1445
+ let mut name_ptr: * const c_char = std:: ptr:: null ( ) ;
1446
+ let mut name_length: size_t = 0 ;
1447
+ let cass_err = cass_result_column_name (
1448
+ result_ptr,
1449
+ column_index,
1450
+ addr_of_mut ! ( name_ptr) ,
1451
+ addr_of_mut ! ( name_length) ,
1452
+ ) ;
1453
+ assert_eq ! ( CassError :: CASS_OK , cass_err) ;
1454
+ ptr_to_cstr_n ( name_ptr, name_length)
1455
+ }
1456
+
1457
+ #[ test]
1458
+ fn rows_cass_result_api_test ( ) {
1459
+ let result = create_cass_rows_result ( ) ;
1460
+
1461
+ unsafe {
1462
+ let result_ptr = std:: ptr:: addr_of!( result) ;
1463
+
1464
+ // cass_result_column_count test
1465
+ {
1466
+ let column_count = cass_result_column_count ( result_ptr) ;
1467
+ assert_eq ! ( 3 , column_count) ;
1468
+ }
1469
+
1470
+ // cass_result_column_name test
1471
+ {
1472
+ let first_column_name = cass_result_column_name_rust_str ( result_ptr, 0 ) . unwrap ( ) ;
1473
+ assert_eq ! ( FIRST_COLUMN_NAME , first_column_name) ;
1474
+ let second_column_name = cass_result_column_name_rust_str ( result_ptr, 1 ) . unwrap ( ) ;
1475
+ assert_eq ! ( SECOND_COLUMN_NAME , second_column_name) ;
1476
+ let third_column_name = cass_result_column_name_rust_str ( result_ptr, 2 ) . unwrap ( ) ;
1477
+ assert_eq ! ( THIRD_COLUMN_NAME , third_column_name) ;
1478
+ }
1479
+
1480
+ // cass_result_column_type test
1481
+ {
1482
+ let first_col_type = cass_result_column_type ( result_ptr, 0 ) ;
1483
+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_BIGINT , first_col_type) ;
1484
+ let second_col_type = cass_result_column_type ( result_ptr, 1 ) ;
1485
+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_VARINT , second_col_type) ;
1486
+ let third_col_type = cass_result_column_type ( result_ptr, 2 ) ;
1487
+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_LIST , third_col_type) ;
1488
+ let out_of_bound_col_type = cass_result_column_type ( result_ptr, 555 ) ;
1489
+ assert_eq ! (
1490
+ CassValueType :: CASS_VALUE_TYPE_UNKNOWN ,
1491
+ out_of_bound_col_type
1492
+ ) ;
1493
+ }
1494
+
1495
+ // cass_result_column_data_type test
1496
+ {
1497
+ let first_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 0 ) ) ;
1498
+ assert_eq ! (
1499
+ & CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_BIGINT ) ,
1500
+ first_col_data_type
1501
+ ) ;
1502
+ let second_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 1 ) ) ;
1503
+ assert_eq ! (
1504
+ & CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_VARINT ) ,
1505
+ second_col_data_type
1506
+ ) ;
1507
+ let third_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 2 ) ) ;
1508
+ assert_eq ! (
1509
+ & CassDataType :: List {
1510
+ typ: Some ( Arc :: new( CassDataType :: Value (
1511
+ CassValueType :: CASS_VALUE_TYPE_DOUBLE
1512
+ ) ) ) ,
1513
+ frozen: false
1514
+ } ,
1515
+ third_col_data_type
1516
+ ) ;
1517
+ let out_of_bound_col_data_type = cass_result_column_data_type ( result_ptr, 555 ) ;
1518
+ assert ! ( out_of_bound_col_data_type. is_null( ) ) ;
1519
+ }
1520
+ }
1521
+ }
1522
+
1523
+ fn create_non_rows_cass_result ( ) -> CassResult {
1524
+ let metadata = Arc :: new ( CassResultData :: from_result_payload (
1525
+ PagingStateResponse :: NoMorePages ,
1526
+ vec ! [ ] ,
1527
+ None ,
1528
+ ) ) ;
1529
+ CassResult {
1530
+ rows : None ,
1531
+ metadata,
1532
+ }
1533
+ }
1534
+
1535
+ #[ test]
1536
+ fn non_rows_cass_result_api_test ( ) {
1537
+ let result = create_non_rows_cass_result ( ) ;
1538
+
1539
+ // Check that API functions do not panic when rows are empty - e.g. for INSERT queries.
1540
+ unsafe {
1541
+ let result_ptr = std:: ptr:: addr_of!( result) ;
1542
+
1543
+ assert_eq ! ( 0 , cass_result_column_count( result_ptr) ) ;
1544
+ assert_eq ! (
1545
+ CassValueType :: CASS_VALUE_TYPE_UNKNOWN ,
1546
+ cass_result_column_type( result_ptr, 0 )
1547
+ ) ;
1548
+ assert ! ( cass_result_column_data_type( result_ptr, 0 ) . is_null( ) ) ;
1549
+ assert ! ( cass_result_first_row( result_ptr) . is_null( ) ) ;
1550
+
1551
+ {
1552
+ let mut name_ptr: * const c_char = std:: ptr:: null ( ) ;
1553
+ let mut name_length: size_t = 0 ;
1554
+ let cass_err = cass_result_column_name (
1555
+ result_ptr,
1556
+ 0 ,
1557
+ addr_of_mut ! ( name_ptr) ,
1558
+ addr_of_mut ! ( name_length) ,
1559
+ ) ;
1560
+ assert_eq ! ( CassError :: CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS , cass_err) ;
1561
+ }
1562
+ }
1563
+ }
1564
+ }
1565
+
1377
1566
// CassResult functions:
1378
1567
/*
1379
1568
extern "C" {
0 commit comments