@@ -17,6 +17,7 @@ use std::convert::TryInto;
17
17
use std:: fmt;
18
18
use std:: os:: raw:: c_char;
19
19
use std:: ptr;
20
+ use std:: rc:: Rc ;
20
21
use std:: str;
21
22
use std:: sync:: atomic:: { AtomicU32 , Ordering } ;
22
23
use std:: sync:: Arc ;
@@ -128,7 +129,7 @@ pub enum BufferRowIndex {
128
129
129
130
enum DpiData < ' a > {
130
131
Data ( & ' a mut dpiData ) ,
131
- Var ( DpiVar ) ,
132
+ Var ( Rc < DpiVar > ) , // Rc is incremented only when <Row as RowValue>::get() is called.
132
133
Null ,
133
134
}
134
135
@@ -298,7 +299,7 @@ impl SqlValue<'_> {
298
299
& mut data,
299
300
)
300
301
) ;
301
- self . data = DpiData :: Var ( DpiVar :: new ( handle, data) ) ;
302
+ self . data = DpiData :: Var ( Rc :: new ( DpiVar :: new ( handle, data) ) ) ;
302
303
self . native_type = native_type;
303
304
self . oratype = Some ( oratype. clone ( ) ) ;
304
305
if native_type_num == DPI_NATIVE_TYPE_STMT {
@@ -322,7 +323,7 @@ impl SqlValue<'_> {
322
323
) ;
323
324
if num != 0 {
324
325
self . array_size = num;
325
- self . data = DpiData :: Var ( DpiVar :: with_add_ref ( handle, data) ) ;
326
+ self . data = DpiData :: Var ( Rc :: new ( DpiVar :: with_add_ref ( handle, data) ) ) ;
326
327
}
327
328
Ok ( ( ) )
328
329
}
@@ -849,21 +850,31 @@ impl SqlValue<'_> {
849
850
Ok ( ( ) )
850
851
}
851
852
852
- pub ( crate ) fn dup_by_handle ( & self ) -> Result < SqlValue < ' static > > {
853
- let mut val = SqlValue :: new (
854
- self . conn . clone ( ) ,
855
- self . lob_bind_type ,
856
- self . query_params . clone ( ) ,
857
- 1 ,
858
- ) ;
859
- if let Some ( ref oratype) = self . oratype {
860
- val. init_handle ( oratype) ?;
861
- chkerr ! (
862
- self . ctxt( ) ,
863
- dpiVar_copyData( val. handle( ) ?, 0 , self . handle( ) ?, self . buffer_row_index( ) )
864
- ) ;
853
+ pub ( crate ) fn clone_except_fetch_array_buffer ( & self ) -> Result < SqlValue < ' static > > {
854
+ if let DpiData :: Var ( ref var) = self . data {
855
+ Ok ( SqlValue {
856
+ conn : self . conn . clone ( ) ,
857
+ data : DpiData :: Var ( var. clone ( ) ) ,
858
+ native_type : self . native_type . clone ( ) ,
859
+ oratype : self . oratype . clone ( ) ,
860
+ array_size : self . array_size ,
861
+ buffer_row_index : BufferRowIndex :: Owned ( self . buffer_row_index ( ) ) ,
862
+ keep_bytes : Vec :: new ( ) ,
863
+ keep_dpiobj : DpiObject :: null ( ) ,
864
+ lob_bind_type : self . lob_bind_type ,
865
+ query_params : self . query_params . clone ( ) ,
866
+ } )
867
+ } else {
868
+ Err ( Error :: internal_error ( "dpVar handle isn't initialized" ) )
869
+ }
870
+ }
871
+
872
+ pub ( crate ) fn fetch_array_buffer_shared_count ( & self ) -> Result < usize > {
873
+ if let DpiData :: Var ( ref var) = self . data {
874
+ Ok ( Rc :: strong_count ( var) )
875
+ } else {
876
+ Err ( Error :: internal_error ( "dpData isn't initialized" ) )
865
877
}
866
- Ok ( val)
867
878
}
868
879
869
880
//
0 commit comments