28
28
// class methods
29
29
static NJS_NAPI_METHOD (njsOracleDb_createPool );
30
30
static NJS_NAPI_METHOD (njsOracleDb_getConnection );
31
+ static NJS_NAPI_METHOD (njsOracleDb_initOracleClient );
31
32
32
33
// asynchronous methods
33
34
static NJS_ASYNC_METHOD (njsOracleDb_createPoolAsync );
@@ -95,7 +96,7 @@ static NJS_NAPI_FINALIZE(njsOracleDb_finalize);
95
96
static bool njsOracleDb_initCommonCreateParams (njsBaton * baton ,
96
97
dpiCommonCreateParams * params );
97
98
static bool njsOracleDb_initDPI (njsOracleDb * oracleDb , napi_env env ,
98
- njsBaton * baton );
99
+ dpiContextCreateParams * params , njsBaton * baton );
99
100
100
101
// define constants exposed to JS
101
102
static njsConstant njsClassConstants [] = {
@@ -324,6 +325,8 @@ static const napi_property_descriptor njsClassProperties[] = {
324
325
napi_default , NULL },
325
326
{ "_getConnection" , NULL , njsOracleDb_getConnection , NULL , NULL , NULL ,
326
327
napi_default , NULL },
328
+ { "_initOracleClient" , NULL , njsOracleDb_initOracleClient , NULL , NULL ,
329
+ NULL , napi_default , NULL },
327
330
{ NULL , NULL , NULL , NULL , NULL , NULL , napi_default , NULL }
328
331
};
329
332
@@ -437,7 +440,7 @@ static bool njsOracleDb_createPoolProcessArgs(njsBaton *baton, napi_env env,
437
440
bool connStrFound , connStrFound1 ;
438
441
439
442
// initialize ODPI-C library, if necessary
440
- if (!njsOracleDb_initDPI (baton -> oracleDb , env , baton ))
443
+ if (!njsOracleDb_initDPI (baton -> oracleDb , env , NULL , baton ))
441
444
return false;
442
445
443
446
// set defaults on baton
@@ -656,7 +659,7 @@ static bool njsOracleDb_getConnectionProcessArgs(njsBaton *baton,
656
659
bool connStrFound , connStrFound1 ;
657
660
658
661
// initialize ODPI-C library, if necessary
659
- if (!njsOracleDb_initDPI (baton -> oracleDb , env , baton ))
662
+ if (!njsOracleDb_initDPI (baton -> oracleDb , env , NULL , baton ))
660
663
return false;
661
664
662
665
// copy items used from the OracleDb class since they may change after
@@ -884,7 +887,7 @@ static napi_value njsOracleDb_getOracleClientVersion(napi_env env,
884
887
885
888
if (!njsUtils_validateGetter (env , info , (njsBaseInstance * * ) & oracleDb ))
886
889
return NULL ;
887
- if (!njsOracleDb_initDPI (oracleDb , env , NULL ))
890
+ if (!njsOracleDb_initDPI (oracleDb , env , NULL , NULL ))
888
891
return NULL ;
889
892
if (dpiContext_getClientVersion (oracleDb -> context , & versionInfo ) < 0 ) {
890
893
njsUtils_throwErrorDPI (env , oracleDb );
@@ -907,7 +910,7 @@ static napi_value njsOracleDb_getOracleClientVersionString(napi_env env,
907
910
908
911
if (!njsUtils_validateGetter (env , info , (njsBaseInstance * * ) & oracleDb ))
909
912
return NULL ;
910
- if (!njsOracleDb_initDPI (oracleDb , env , NULL ))
913
+ if (!njsOracleDb_initDPI (oracleDb , env , NULL , NULL ))
911
914
return NULL ;
912
915
if (dpiContext_getClientVersion (oracleDb -> context , & versionInfo ) < 0 ) {
913
916
njsUtils_throwErrorDPI (env , oracleDb );
@@ -1074,6 +1077,84 @@ static napi_value njsOracleDb_getVersionSuffix(napi_env env,
1074
1077
}
1075
1078
1076
1079
1080
+ //-----------------------------------------------------------------------------
1081
+ // njsOracleDb_initOracleClientHelper()
1082
+ // Helper method that performs the work of njsOracleDb_initOracleClient().
1083
+ //-----------------------------------------------------------------------------
1084
+ static bool njsOracleDb_initOracleClientHelper (napi_env env ,
1085
+ napi_callback_info info )
1086
+ {
1087
+ size_t libDirLength , configDirLength , errorUrlLength , driverNameLength ;
1088
+ char * libDir , * configDir , * errorUrl , * driverName ;
1089
+ njsBaseInstance * callingInstance ;
1090
+ napi_value callingObj , args [1 ];
1091
+ dpiContextCreateParams params ;
1092
+ njsOracleDb * oracleDb ;
1093
+ bool ok ;
1094
+
1095
+ // process arguments
1096
+ libDir = configDir = errorUrl = driverName = NULL ;
1097
+ libDirLength = configDirLength = errorUrlLength = driverNameLength = 0 ;
1098
+ if (!njsUtils_validateArgs (env , info , 1 , args , & callingObj ,
1099
+ & callingInstance ))
1100
+ return false;
1101
+ if (!njsUtils_getStringFromArg (env , args , 0 , "libDir" , & libDir ,
1102
+ & libDirLength , NULL , NULL ))
1103
+ return false;
1104
+ if (!njsUtils_getStringFromArg (env , args , 0 , "configDir" , & configDir ,
1105
+ & configDirLength , NULL , NULL ))
1106
+ return false;
1107
+ if (!njsUtils_getStringFromArg (env , args , 0 , "errorUrl" , & errorUrl ,
1108
+ & errorUrlLength , NULL , NULL ))
1109
+ return false;
1110
+ if (!njsUtils_getStringFromArg (env , args , 0 , "driverName" , & driverName ,
1111
+ & driverNameLength , NULL , NULL ))
1112
+ return false;
1113
+
1114
+ // initialize library
1115
+ memset (& params , 0 , sizeof (params ));
1116
+ if (libDirLength > 0 )
1117
+ params .oracleClientLibDir = libDir ;
1118
+ if (configDirLength > 0 )
1119
+ params .oracleClientConfigDir = configDir ;
1120
+ if (errorUrlLength > 0 )
1121
+ params .loadErrorUrl = errorUrl ;
1122
+ if (driverNameLength > 0 )
1123
+ params .defaultDriverName = driverName ;
1124
+ oracleDb = (njsOracleDb * ) callingInstance ;
1125
+ ok = njsOracleDb_initDPI (oracleDb , env , & params , NULL );
1126
+
1127
+ // cleanup
1128
+ if (libDir )
1129
+ free (libDir );
1130
+ if (configDir )
1131
+ free (configDir );
1132
+ if (errorUrl )
1133
+ free (errorUrl );
1134
+ if (driverName )
1135
+ free (driverName );
1136
+ return ok ;
1137
+ }
1138
+
1139
+
1140
+ //-----------------------------------------------------------------------------
1141
+ // njsOracleDb_initOracleClient()
1142
+ // Initialize the Oracle Client library now, rather than when the first pool
1143
+ // or standalone connection is created, or a request is made to determine the
1144
+ // Oracle Client version. If the Oracle Client library has already been
1145
+ // initialized, an exception is raised.
1146
+ //
1147
+ // PARAMETERS
1148
+ // - options
1149
+ //-----------------------------------------------------------------------------
1150
+ static napi_value njsOracleDb_initOracleClient (napi_env env ,
1151
+ napi_callback_info info )
1152
+ {
1153
+ njsOracleDb_initOracleClientHelper (env , info );
1154
+ return NULL ;
1155
+ }
1156
+
1157
+
1077
1158
//-----------------------------------------------------------------------------
1078
1159
// njsOracleDb_initCommonCreateParams()
1079
1160
// Initialize common creation parameters for pools and standalone
@@ -1089,10 +1170,6 @@ static bool njsOracleDb_initCommonCreateParams(njsBaton *baton,
1089
1170
if (baton -> events )
1090
1171
params -> createMode = (dpiCreateMode )
1091
1172
(params -> createMode | DPI_MODE_CREATE_EVENTS );
1092
- params -> encoding = "UTF-8" ;
1093
- params -> nencoding = "UTF-8" ;
1094
- params -> driverName = NJS_DRIVER_NAME ;
1095
- params -> driverNameLength = (uint32_t ) strlen (params -> driverName );
1096
1173
return true;
1097
1174
}
1098
1175
@@ -1106,27 +1183,47 @@ static bool njsOracleDb_initCommonCreateParams(njsBaton *baton,
1106
1183
// errors that can take place when the module is imported.
1107
1184
//-----------------------------------------------------------------------------
1108
1185
static bool njsOracleDb_initDPI (njsOracleDb * oracleDb , napi_env env ,
1109
- njsBaton * baton )
1186
+ dpiContextCreateParams * params , njsBaton * baton )
1110
1187
{
1188
+ dpiContextCreateParams localParams ;
1111
1189
napi_value error , message ;
1112
1190
dpiErrorInfo errorInfo ;
1113
1191
1114
- // if already initialized, nothing needs to be done
1115
- if (oracleDb -> context )
1116
- return true;
1192
+ // if already initialized and parameters were passed, raise an exception;
1193
+ // otherwise do nothing as this is implicitly called when creating a
1194
+ // standalone connection or session pool and when getting the Oracle Client
1195
+ // library version
1196
+ if (oracleDb -> context ) {
1197
+ if (!params )
1198
+ return true;
1199
+ return njsUtils_throwError (env , errClientLibAlreadyInitialized );
1200
+ }
1201
+
1202
+ // set up parameters used for initializing ODPI-C
1203
+ if (params ) {
1204
+ memcpy (& localParams , params , sizeof (dpiContextCreateParams ));
1205
+ } else {
1206
+ memset (& localParams , 0 , sizeof (dpiContextCreateParams ));
1207
+ }
1208
+ localParams .defaultEncoding = NJS_ENCODING ;
1209
+ if (!localParams .defaultDriverName )
1210
+ localParams .defaultDriverName = NJS_DRIVER_NAME ;
1211
+ if (!localParams .loadErrorUrl )
1212
+ localParams .loadErrorUrl =
1213
+ "https://oracle.github.io/node-oracledb/INSTALL.html" ;
1117
1214
1118
1215
// create global DPI context (with baton available)
1119
1216
if (baton ) {
1120
- if (dpiContext_create (DPI_MAJOR_VERSION , DPI_MINOR_VERSION ,
1121
- & oracleDb -> context , & baton -> errorInfo ) < 0 ) {
1217
+ if (dpiContext_createWithParams (DPI_MAJOR_VERSION , DPI_MINOR_VERSION ,
1218
+ & localParams , & oracleDb -> context , & baton -> errorInfo ) < 0 ) {
1122
1219
baton -> dpiError = true;
1123
1220
return false;
1124
1221
}
1125
1222
1126
1223
// create global DPI context (no baton available, throw error immediately)
1127
1224
} else {
1128
- if (dpiContext_create (DPI_MAJOR_VERSION , DPI_MINOR_VERSION ,
1129
- & oracleDb -> context , & errorInfo ) < 0 ) {
1225
+ if (dpiContext_createWithParams (DPI_MAJOR_VERSION , DPI_MINOR_VERSION ,
1226
+ & localParams , & oracleDb -> context , & errorInfo ) < 0 ) {
1130
1227
NJS_CHECK_NAPI (env , napi_create_string_utf8 (env , errorInfo .message ,
1131
1228
errorInfo .messageLength , & message ))
1132
1229
NJS_CHECK_NAPI (env , napi_create_error (env , NULL , message , & error ))
0 commit comments