@@ -565,6 +565,31 @@ pub struct ManagedConnection {
565565 inner : Arc < ManagedConnectionInner > ,
566566}
567567
568+ struct ConnectionCancelHandle {
569+ inner : std:: sync:: Weak < ManagedConnectionInner > ,
570+ }
571+
572+ impl adbc_core:: CancelHandle for ConnectionCancelHandle {
573+ fn try_cancel ( & self ) -> Result < ( ) > {
574+ if let Some ( inner) = self . inner . upgrade ( ) {
575+ if let AdbcVersion :: V100 = inner. database . driver . version {
576+ return Err ( Error :: with_message_and_status (
577+ ERR_CANCEL_UNSUPPORTED ,
578+ Status :: NotImplemented ,
579+ ) ) ;
580+ }
581+ let driver = & inner. database . driver . driver ;
582+ let mut connection = inner. connection . lock ( ) . unwrap ( ) ;
583+ let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
584+ let method = driver_method ! ( driver, ConnectionCancel ) ;
585+ let status = unsafe { method ( connection. deref_mut ( ) , & mut error) } ;
586+ check_status ( status, error)
587+ } else {
588+ Ok ( ( ) )
589+ }
590+ }
591+ }
592+
568593impl ManagedConnection {
569594 fn ffi_driver ( & self ) -> & adbc_ffi:: FFI_AdbcDriver {
570595 & self . inner . database . driver . driver
@@ -663,19 +688,10 @@ impl Connection for ManagedConnection {
663688 Ok ( Self :: StatementType { inner } )
664689 }
665690
666- fn cancel ( & mut self ) -> Result < ( ) > {
667- if let AdbcVersion :: V100 = self . driver_version ( ) {
668- return Err ( Error :: with_message_and_status (
669- ERR_CANCEL_UNSUPPORTED ,
670- Status :: NotImplemented ,
671- ) ) ;
672- }
673- let driver = self . ffi_driver ( ) ;
674- let mut connection = self . inner . connection . lock ( ) . unwrap ( ) ;
675- let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
676- let method = driver_method ! ( driver, ConnectionCancel ) ;
677- let status = unsafe { method ( connection. deref_mut ( ) , & mut error) } ;
678- check_status ( status, error)
691+ fn get_cancel_handle ( & self ) -> Box < dyn adbc_core:: CancelHandle > {
692+ Box :: new ( ConnectionCancelHandle {
693+ inner : Arc :: downgrade ( & self . inner ) ,
694+ } )
679695 }
680696
681697 fn commit ( & mut self ) -> Result < ( ) > {
@@ -939,6 +955,31 @@ impl ManagedStatement {
939955 }
940956}
941957
958+ struct StatementCancelHandle {
959+ inner : std:: sync:: Weak < ManagedStatementInner > ,
960+ }
961+
962+ impl adbc_core:: CancelHandle for StatementCancelHandle {
963+ fn try_cancel ( & self ) -> Result < ( ) > {
964+ if let Some ( inner) = self . inner . upgrade ( ) {
965+ if let AdbcVersion :: V100 = inner. connection . database . driver . version {
966+ return Err ( Error :: with_message_and_status (
967+ ERR_CANCEL_UNSUPPORTED ,
968+ Status :: NotImplemented ,
969+ ) ) ;
970+ }
971+ let driver = & inner. connection . database . driver . driver ;
972+ let mut statement = inner. statement . lock ( ) . unwrap ( ) ;
973+ let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
974+ let method = driver_method ! ( driver, StatementCancel ) ;
975+ let status = unsafe { method ( statement. deref_mut ( ) , & mut error) } ;
976+ check_status ( status, error)
977+ } else {
978+ Ok ( ( ) )
979+ }
980+ }
981+ }
982+
942983impl Statement for ManagedStatement {
943984 fn bind ( & mut self , batch : RecordBatch ) -> Result < ( ) > {
944985 let driver = self . ffi_driver ( ) ;
@@ -963,19 +1004,10 @@ impl Statement for ManagedStatement {
9631004 Ok ( ( ) )
9641005 }
9651006
966- fn cancel ( & mut self ) -> Result < ( ) > {
967- if let AdbcVersion :: V100 = self . driver_version ( ) {
968- return Err ( Error :: with_message_and_status (
969- ERR_CANCEL_UNSUPPORTED ,
970- Status :: NotImplemented ,
971- ) ) ;
972- }
973- let driver = self . ffi_driver ( ) ;
974- let mut statement = self . inner . statement . lock ( ) . unwrap ( ) ;
975- let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
976- let method = driver_method ! ( driver, StatementCancel ) ;
977- let status = unsafe { method ( statement. deref_mut ( ) , & mut error) } ;
978- check_status ( status, error)
1007+ fn get_cancel_handle ( & self ) -> Box < dyn adbc_core:: CancelHandle > {
1008+ Box :: new ( StatementCancelHandle {
1009+ inner : Arc :: downgrade ( & self . inner ) ,
1010+ } )
9791011 }
9801012
9811013 fn execute ( & mut self ) -> Result < Box < dyn RecordBatchReader + Send + ' static > > {
0 commit comments