@@ -81,17 +81,21 @@ impl CassSessionInner {
81
81
let exec_profile_map = cluster. execution_profile_map ( ) . clone ( ) ;
82
82
let host_filter = cluster. build_host_filter ( ) ;
83
83
84
- CassFuture :: make_raw ( Self :: connect_fut (
85
- session_opt,
86
- session_builder,
87
- exec_profile_map,
88
- host_filter,
89
- cluster
90
- . get_client_id ( )
91
- // If user did not set a client id, generate a random uuid v4.
92
- . unwrap_or_else ( uuid:: Uuid :: new_v4) ,
93
- keyspace,
94
- ) )
84
+ CassFuture :: make_raw (
85
+ Self :: connect_fut (
86
+ session_opt,
87
+ session_builder,
88
+ exec_profile_map,
89
+ host_filter,
90
+ cluster
91
+ . get_client_id ( )
92
+ // If user did not set a client id, generate a random uuid v4.
93
+ . unwrap_or_else ( uuid:: Uuid :: new_v4) ,
94
+ keyspace,
95
+ ) ,
96
+ #[ cfg( cpp_integration_testing) ]
97
+ None ,
98
+ )
95
99
}
96
100
97
101
async fn connect_fut (
@@ -255,10 +259,16 @@ pub unsafe extern "C" fn cass_session_execute_batch(
255
259
} ;
256
260
257
261
match request_timeout_ms {
258
- Some ( timeout_ms) => {
259
- CassFuture :: make_raw ( async move { request_with_timeout ( timeout_ms, future) . await } )
260
- }
261
- None => CassFuture :: make_raw ( future) ,
262
+ Some ( timeout_ms) => CassFuture :: make_raw (
263
+ async move { request_with_timeout ( timeout_ms, future) . await } ,
264
+ #[ cfg( cpp_integration_testing) ]
265
+ None ,
266
+ ) ,
267
+ None => CassFuture :: make_raw (
268
+ future,
269
+ #[ cfg( cpp_integration_testing) ]
270
+ None ,
271
+ ) ,
262
272
}
263
273
}
264
274
@@ -297,19 +307,24 @@ pub unsafe extern "C" fn cass_session_execute(
297
307
let mut statement = statement_opt. statement . clone ( ) ;
298
308
299
309
#[ cfg( cpp_integration_testing) ]
300
- statement_opt. record_hosts . then ( || {
310
+ let recording_listener = statement_opt. record_hosts . then ( || {
301
311
let recording_listener =
302
312
Arc :: new ( crate :: integration_testing:: RecordingHistoryListener :: new ( ) ) ;
303
313
match statement {
304
314
BoundStatement :: Simple ( ref mut unprepared) => {
305
- unprepared. query . set_history_listener ( recording_listener) ;
315
+ unprepared
316
+ . query
317
+ . set_history_listener ( Arc :: clone ( & recording_listener) as _ ) ;
306
318
}
307
319
BoundStatement :: Prepared ( ref mut prepared) => {
320
+ // It's extremely interesting to me that this `as _` cast is required
321
+ // for the type checker to accept this code.
308
322
Arc :: make_mut ( & mut prepared. statement )
309
323
. statement
310
- . set_history_listener ( recording_listener) ;
324
+ . set_history_listener ( Arc :: clone ( & recording_listener) as _ ) ;
311
325
}
312
326
} ;
327
+ recording_listener
313
328
} ) ;
314
329
315
330
let statement_exec_profile = statement_opt. exec_profile . clone ( ) ;
@@ -426,10 +441,16 @@ pub unsafe extern "C" fn cass_session_execute(
426
441
} ;
427
442
428
443
match request_timeout_ms {
429
- Some ( timeout_ms) => {
430
- CassFuture :: make_raw ( async move { request_with_timeout ( timeout_ms, future) . await } )
431
- }
432
- None => CassFuture :: make_raw ( future) ,
444
+ Some ( timeout_ms) => CassFuture :: make_raw (
445
+ async move { request_with_timeout ( timeout_ms, future) . await } ,
446
+ #[ cfg( cpp_integration_testing) ]
447
+ recording_listener,
448
+ ) ,
449
+ None => CassFuture :: make_raw (
450
+ future,
451
+ #[ cfg( cpp_integration_testing) ]
452
+ recording_listener,
453
+ ) ,
433
454
}
434
455
}
435
456
@@ -449,31 +470,35 @@ pub unsafe extern "C" fn cass_session_prepare_from_existing(
449
470
450
471
let statement = cass_statement. statement . clone ( ) ;
451
472
452
- CassFuture :: make_raw ( async move {
453
- let query = match & statement {
454
- BoundStatement :: Simple ( q) => q,
455
- BoundStatement :: Prepared ( ps) => {
456
- return Ok ( CassResultValue :: Prepared ( ps. statement . clone ( ) ) ) ;
457
- }
458
- } ;
459
-
460
- let session_guard = session. read ( ) . await ;
461
- if session_guard. is_none ( ) {
462
- return Err ( (
463
- CassError :: CASS_ERROR_LIB_NO_HOSTS_AVAILABLE ,
464
- "Session is not connected" . msg ( ) ,
465
- ) ) ;
466
- }
467
- let session = & session_guard. as_ref ( ) . unwrap ( ) . session ;
468
- let prepared = session
469
- . prepare ( query. query . clone ( ) )
470
- . await
471
- . map_err ( |err| ( err. to_cass_error ( ) , err. msg ( ) ) ) ?;
473
+ CassFuture :: make_raw (
474
+ async move {
475
+ let query = match & statement {
476
+ BoundStatement :: Simple ( q) => q,
477
+ BoundStatement :: Prepared ( ps) => {
478
+ return Ok ( CassResultValue :: Prepared ( Arc :: clone ( & ps. statement ) ) ) ;
479
+ }
480
+ } ;
472
481
473
- Ok ( CassResultValue :: Prepared ( Arc :: new (
474
- CassPrepared :: new_from_prepared_statement ( prepared) ,
475
- ) ) )
476
- } )
482
+ let session_guard = session. read ( ) . await ;
483
+ if session_guard. is_none ( ) {
484
+ return Err ( (
485
+ CassError :: CASS_ERROR_LIB_NO_HOSTS_AVAILABLE ,
486
+ "Session is not connected" . msg ( ) ,
487
+ ) ) ;
488
+ }
489
+ let session = & session_guard. as_ref ( ) . unwrap ( ) . session ;
490
+ let prepared = session
491
+ . prepare ( query. query . clone ( ) )
492
+ . await
493
+ . map_err ( |err| ( err. to_cass_error ( ) , err. msg ( ) ) ) ?;
494
+
495
+ Ok ( CassResultValue :: Prepared ( Arc :: new (
496
+ CassPrepared :: new_from_prepared_statement ( prepared) ,
497
+ ) ) )
498
+ } ,
499
+ #[ cfg( cpp_integration_testing) ]
500
+ None ,
501
+ )
477
502
}
478
503
479
504
#[ unsafe( no_mangle) ]
@@ -503,7 +528,7 @@ pub unsafe extern "C" fn cass_session_prepare_n(
503
528
. unwrap_or_default ( ) ;
504
529
let query = Statement :: new ( query_str. to_string ( ) ) ;
505
530
506
- CassFuture :: make_raw ( async move {
531
+ let fut = async move {
507
532
let session_guard = cass_session. read ( ) . await ;
508
533
if session_guard. is_none ( ) {
509
534
return Err ( (
@@ -524,7 +549,13 @@ pub unsafe extern "C" fn cass_session_prepare_n(
524
549
Ok ( CassResultValue :: Prepared ( Arc :: new (
525
550
CassPrepared :: new_from_prepared_statement ( prepared) ,
526
551
) ) )
527
- } )
552
+ } ;
553
+
554
+ CassFuture :: make_raw (
555
+ fut,
556
+ #[ cfg( cpp_integration_testing) ]
557
+ None ,
558
+ )
528
559
}
529
560
530
561
#[ unsafe( no_mangle) ]
@@ -541,19 +572,23 @@ pub unsafe extern "C" fn cass_session_close(
541
572
return ArcFFI :: null ( ) ;
542
573
} ;
543
574
544
- CassFuture :: make_raw ( async move {
545
- let mut session_guard = session_opt. write ( ) . await ;
546
- if session_guard. is_none ( ) {
547
- return Err ( (
548
- CassError :: CASS_ERROR_LIB_UNABLE_TO_CLOSE ,
549
- "Already closing or closed" . msg ( ) ,
550
- ) ) ;
551
- }
575
+ CassFuture :: make_raw (
576
+ async move {
577
+ let mut session_guard = session_opt. write ( ) . await ;
578
+ if session_guard. is_none ( ) {
579
+ return Err ( (
580
+ CassError :: CASS_ERROR_LIB_UNABLE_TO_CLOSE ,
581
+ "Already closing or closed" . msg ( ) ,
582
+ ) ) ;
583
+ }
552
584
553
- * session_guard = None ;
585
+ * session_guard = None ;
554
586
555
- Ok ( CassResultValue :: Empty )
556
- } )
587
+ Ok ( CassResultValue :: Empty )
588
+ } ,
589
+ #[ cfg( cpp_integration_testing) ]
590
+ None ,
591
+ )
557
592
}
558
593
559
594
#[ unsafe( no_mangle) ]
0 commit comments