@@ -1027,6 +1027,31 @@ pub struct ManagedConnection {
10271027 inner : Arc < ManagedConnectionInner > ,
10281028}
10291029
1030+ struct ConnectionCancelHandle {
1031+ inner : std:: sync:: Weak < ManagedConnectionInner > ,
1032+ }
1033+
1034+ impl adbc_core:: CancelHandle for ConnectionCancelHandle {
1035+ fn try_cancel ( & self ) -> Result < ( ) > {
1036+ if let Some ( inner) = self . inner . upgrade ( ) {
1037+ if let AdbcVersion :: V100 = inner. database . driver . version {
1038+ return Err ( Error :: with_message_and_status (
1039+ ERR_CANCEL_UNSUPPORTED ,
1040+ Status :: NotImplemented ,
1041+ ) ) ;
1042+ }
1043+ let driver = & inner. database . driver . driver ;
1044+ let mut connection = inner. connection . lock ( ) . unwrap ( ) ;
1045+ let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1046+ let method = driver_method ! ( driver, ConnectionCancel ) ;
1047+ let status = unsafe { method ( connection. deref_mut ( ) , & mut error) } ;
1048+ check_status ( status, error)
1049+ } else {
1050+ Ok ( ( ) )
1051+ }
1052+ }
1053+ }
1054+
10301055impl ManagedConnection {
10311056 fn ffi_driver ( & self ) -> & adbc_ffi:: FFI_AdbcDriver {
10321057 & self . inner . database . driver . driver
@@ -1125,19 +1150,10 @@ impl Connection for ManagedConnection {
11251150 Ok ( Self :: StatementType { inner } )
11261151 }
11271152
1128- fn cancel ( & mut self ) -> Result < ( ) > {
1129- if let AdbcVersion :: V100 = self . driver_version ( ) {
1130- return Err ( Error :: with_message_and_status (
1131- ERR_CANCEL_UNSUPPORTED ,
1132- Status :: NotImplemented ,
1133- ) ) ;
1134- }
1135- let driver = self . ffi_driver ( ) ;
1136- let mut connection = self . inner . connection . lock ( ) . unwrap ( ) ;
1137- let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1138- let method = driver_method ! ( driver, ConnectionCancel ) ;
1139- let status = unsafe { method ( connection. deref_mut ( ) , & mut error) } ;
1140- check_status ( status, error)
1153+ fn get_cancel_handle ( & self ) -> Box < dyn adbc_core:: CancelHandle > {
1154+ Box :: new ( ConnectionCancelHandle {
1155+ inner : Arc :: downgrade ( & self . inner ) ,
1156+ } )
11411157 }
11421158
11431159 fn commit ( & mut self ) -> Result < ( ) > {
@@ -1401,6 +1417,31 @@ impl ManagedStatement {
14011417 }
14021418}
14031419
1420+ struct StatementCancelHandle {
1421+ inner : std:: sync:: Weak < ManagedStatementInner > ,
1422+ }
1423+
1424+ impl adbc_core:: CancelHandle for StatementCancelHandle {
1425+ fn try_cancel ( & self ) -> Result < ( ) > {
1426+ if let Some ( inner) = self . inner . upgrade ( ) {
1427+ if let AdbcVersion :: V100 = inner. connection . database . driver . version {
1428+ return Err ( Error :: with_message_and_status (
1429+ ERR_CANCEL_UNSUPPORTED ,
1430+ Status :: NotImplemented ,
1431+ ) ) ;
1432+ }
1433+ let driver = & inner. connection . database . driver . driver ;
1434+ let mut statement = inner. statement . lock ( ) . unwrap ( ) ;
1435+ let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1436+ let method = driver_method ! ( driver, StatementCancel ) ;
1437+ let status = unsafe { method ( statement. deref_mut ( ) , & mut error) } ;
1438+ check_status ( status, error)
1439+ } else {
1440+ Ok ( ( ) )
1441+ }
1442+ }
1443+ }
1444+
14041445impl Statement for ManagedStatement {
14051446 fn bind ( & mut self , batch : RecordBatch ) -> Result < ( ) > {
14061447 let driver = self . ffi_driver ( ) ;
@@ -1425,19 +1466,10 @@ impl Statement for ManagedStatement {
14251466 Ok ( ( ) )
14261467 }
14271468
1428- fn cancel ( & mut self ) -> Result < ( ) > {
1429- if let AdbcVersion :: V100 = self . driver_version ( ) {
1430- return Err ( Error :: with_message_and_status (
1431- ERR_CANCEL_UNSUPPORTED ,
1432- Status :: NotImplemented ,
1433- ) ) ;
1434- }
1435- let driver = self . ffi_driver ( ) ;
1436- let mut statement = self . inner . statement . lock ( ) . unwrap ( ) ;
1437- let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1438- let method = driver_method ! ( driver, StatementCancel ) ;
1439- let status = unsafe { method ( statement. deref_mut ( ) , & mut error) } ;
1440- check_status ( status, error)
1469+ fn get_cancel_handle ( & self ) -> Box < dyn adbc_core:: CancelHandle > {
1470+ Box :: new ( StatementCancelHandle {
1471+ inner : Arc :: downgrade ( & self . inner ) ,
1472+ } )
14411473 }
14421474
14431475 fn execute ( & mut self ) -> Result < Box < dyn RecordBatchReader + Send + ' static > > {
0 commit comments