@@ -1198,6 +1198,31 @@ pub struct ManagedConnection {
11981198 inner : Arc < ManagedConnectionInner > ,
11991199}
12001200
1201+ struct ConnectionCancelHandle {
1202+ inner : std:: sync:: Weak < ManagedConnectionInner > ,
1203+ }
1204+
1205+ impl adbc_core:: CancelHandle for ConnectionCancelHandle {
1206+ fn try_cancel ( & self ) -> Result < ( ) > {
1207+ if let Some ( inner) = self . inner . upgrade ( ) {
1208+ if let AdbcVersion :: V100 = inner. database . driver . version {
1209+ return Err ( Error :: with_message_and_status (
1210+ ERR_CANCEL_UNSUPPORTED ,
1211+ Status :: NotImplemented ,
1212+ ) ) ;
1213+ }
1214+ let driver = & inner. database . driver . driver ;
1215+ let mut connection = inner. connection . lock ( ) . unwrap ( ) ;
1216+ let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1217+ let method = driver_method ! ( driver, ConnectionCancel ) ;
1218+ let status = unsafe { method ( connection. deref_mut ( ) , & mut error) } ;
1219+ check_status ( status, error)
1220+ } else {
1221+ Ok ( ( ) )
1222+ }
1223+ }
1224+ }
1225+
12011226impl ManagedConnection {
12021227 fn ffi_driver ( & self ) -> & adbc_ffi:: FFI_AdbcDriver {
12031228 & self . inner . database . driver . driver
@@ -1296,19 +1321,10 @@ impl Connection for ManagedConnection {
12961321 Ok ( Self :: StatementType { inner } )
12971322 }
12981323
1299- fn cancel ( & mut self ) -> Result < ( ) > {
1300- if let AdbcVersion :: V100 = self . driver_version ( ) {
1301- return Err ( Error :: with_message_and_status (
1302- ERR_CANCEL_UNSUPPORTED ,
1303- Status :: NotImplemented ,
1304- ) ) ;
1305- }
1306- let driver = self . ffi_driver ( ) ;
1307- let mut connection = self . inner . connection . lock ( ) . unwrap ( ) ;
1308- let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1309- let method = driver_method ! ( driver, ConnectionCancel ) ;
1310- let status = unsafe { method ( connection. deref_mut ( ) , & mut error) } ;
1311- check_status ( status, error)
1324+ fn get_cancel_handle ( & self ) -> Box < dyn adbc_core:: CancelHandle > {
1325+ Box :: new ( ConnectionCancelHandle {
1326+ inner : Arc :: downgrade ( & self . inner ) ,
1327+ } )
13121328 }
13131329
13141330 fn commit ( & mut self ) -> Result < ( ) > {
@@ -1612,6 +1628,31 @@ impl ManagedStatement {
16121628 }
16131629}
16141630
1631+ struct StatementCancelHandle {
1632+ inner : std:: sync:: Weak < ManagedStatementInner > ,
1633+ }
1634+
1635+ impl adbc_core:: CancelHandle for StatementCancelHandle {
1636+ fn try_cancel ( & self ) -> Result < ( ) > {
1637+ if let Some ( inner) = self . inner . upgrade ( ) {
1638+ if let AdbcVersion :: V100 = inner. connection . database . driver . version {
1639+ return Err ( Error :: with_message_and_status (
1640+ ERR_CANCEL_UNSUPPORTED ,
1641+ Status :: NotImplemented ,
1642+ ) ) ;
1643+ }
1644+ let driver = & inner. connection . database . driver . driver ;
1645+ let mut statement = inner. statement . lock ( ) . unwrap ( ) ;
1646+ let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1647+ let method = driver_method ! ( driver, StatementCancel ) ;
1648+ let status = unsafe { method ( statement. deref_mut ( ) , & mut error) } ;
1649+ check_status ( status, error)
1650+ } else {
1651+ Ok ( ( ) )
1652+ }
1653+ }
1654+ }
1655+
16151656impl Statement for ManagedStatement {
16161657 fn bind ( & mut self , batch : RecordBatch ) -> Result < ( ) > {
16171658 let driver = self . ffi_driver ( ) ;
@@ -1636,19 +1677,10 @@ impl Statement for ManagedStatement {
16361677 Ok ( ( ) )
16371678 }
16381679
1639- fn cancel ( & mut self ) -> Result < ( ) > {
1640- if let AdbcVersion :: V100 = self . driver_version ( ) {
1641- return Err ( Error :: with_message_and_status (
1642- ERR_CANCEL_UNSUPPORTED ,
1643- Status :: NotImplemented ,
1644- ) ) ;
1645- }
1646- let driver = self . ffi_driver ( ) ;
1647- let mut statement = self . inner . statement . lock ( ) . unwrap ( ) ;
1648- let mut error = adbc_ffi:: FFI_AdbcError :: with_driver ( driver) ;
1649- let method = driver_method ! ( driver, StatementCancel ) ;
1650- let status = unsafe { method ( statement. deref_mut ( ) , & mut error) } ;
1651- check_status ( status, error)
1680+ fn get_cancel_handle ( & self ) -> Box < dyn adbc_core:: CancelHandle > {
1681+ Box :: new ( StatementCancelHandle {
1682+ inner : Arc :: downgrade ( & self . inner ) ,
1683+ } )
16521684 }
16531685
16541686 fn execute ( & mut self ) -> Result < impl RecordBatchReader > {
0 commit comments