@@ -17,11 +17,10 @@ use crate::binding::*;
17
17
use crate :: DbError ;
18
18
use crate :: Error ;
19
19
use crate :: Result ;
20
- use lazy_static :: lazy_static ;
21
- use std:: mem:: MaybeUninit ;
20
+ use once_cell :: sync :: OnceCell ;
21
+ use std:: mem:: { self , MaybeUninit } ;
22
22
use std:: os:: raw:: c_char;
23
23
use std:: ptr;
24
- use std:: result;
25
24
use std:: sync:: { Arc , Mutex } ;
26
25
27
26
//
@@ -41,15 +40,23 @@ pub(crate) struct Context {
41
40
unsafe impl Sync for Context { }
42
41
unsafe impl Send for Context { }
43
42
44
- lazy_static ! {
45
- static ref DPI_CONTEXT : result:: Result <Context , DbError > = {
43
+ static GLOBAL_CONTEXT : OnceCell < Context > = OnceCell :: new ( ) ;
44
+
45
+ impl Context {
46
+ // Use this only inside of GLOBAL_CONTEXT.get_or_try_init().
47
+ fn from_params ( params : & mut dpiContextCreateParams ) -> Result < Context > {
48
+ if params. defaultDriverName . is_null ( ) {
49
+ let driver_name: & ' static str =
50
+ concat ! ( "rust-oracle : " , env!( "CARGO_PKG_VERSION" ) , "\0 " ) ;
51
+ params. defaultDriverName = driver_name. as_ptr ( ) as * const c_char ;
52
+ }
46
53
let mut ctxt = ptr:: null_mut ( ) ;
47
54
let mut err = MaybeUninit :: uninit ( ) ;
48
55
if unsafe {
49
56
dpiContext_createWithParams (
50
57
DPI_MAJOR_VERSION ,
51
58
DPI_MINOR_VERSION ,
52
- ptr :: null_mut ( ) ,
59
+ params ,
53
60
& mut ctxt,
54
61
err. as_mut_ptr ( ) ,
55
62
)
@@ -60,17 +67,17 @@ lazy_static! {
60
67
last_warning : None ,
61
68
} )
62
69
} else {
63
- Err ( DbError :: from_dpi_error( & unsafe { err. assume_init( ) } ) )
70
+ Err ( Error :: from_dpi_error ( & unsafe { err. assume_init ( ) } ) )
64
71
}
65
- } ;
66
- }
72
+ }
67
73
68
- impl Context {
69
74
pub fn new0 ( ) -> Result < Context > {
70
- match * DPI_CONTEXT {
71
- Ok ( ref ctxt) => Ok ( ctxt. clone ( ) ) ,
72
- Err ( ref err) => Err ( Error :: from_db_error ( err. clone ( ) ) ) ,
73
- }
75
+ Ok ( GLOBAL_CONTEXT
76
+ . get_or_try_init ( || {
77
+ let mut params = unsafe { mem:: zeroed ( ) } ;
78
+ Context :: from_params ( & mut params)
79
+ } ) ?
80
+ . clone ( ) )
74
81
}
75
82
76
83
pub fn new ( ) -> Result < Context > {
@@ -101,10 +108,7 @@ impl Context {
101
108
unsafe {
102
109
dpiContext_initCommonCreateParams ( self . context , params. as_mut_ptr ( ) ) ;
103
110
let mut params = params. assume_init ( ) ;
104
- let driver_name: & ' static str = concat ! ( "rust-oracle : " , env!( "CARGO_PKG_VERSION" ) ) ;
105
111
params. createMode |= DPI_MODE_CREATE_THREADED ;
106
- params. driverName = driver_name. as_ptr ( ) as * const c_char ;
107
- params. driverNameLength = driver_name. len ( ) as u32 ;
108
112
params
109
113
}
110
114
}
0 commit comments