internal OleDbConnectionInternal(OleDbConnectionString constr, OleDbConnection?connection) : base() { Debug.Assert((null != constr) && !constr.IsEmpty, "empty connectionstring"); ConnectionString = constr; if (constr.PossiblePrompt && !System.Environment.UserInteractive) { throw ODB.PossiblePromptNotUserInteractive(); } try { // this is the native DataLinks object which pools the native datasource/session OleDbServicesWrapper wrapper = OleDbConnectionInternal.GetObjectPool(); _datasrcwrp = new DataSourceWrapper(); // DataLinks wrapper will call IDataInitialize::GetDataSource to create the DataSource // uses constr.ActualConnectionString, no InfoMessageEvent checking wrapper.GetDataSource(constr, ref _datasrcwrp); Debug.Assert(!_datasrcwrp.IsInvalid, "bad DataSource"); // initialization is delayed because of OleDbConnectionStringBuilder only wants // pre-Initialize IDBPropertyInfo & IDBProperties on the data source if (null != connection) { _sessionwrp = new SessionWrapper(); // From the DataSource object, will call IDBInitialize.Initialize & IDBCreateSession.CreateSession // We always need both called so we use a single call for a single DangerousAddRef/DangerousRelease pair. OleDbHResult hr = _datasrcwrp.InitializeAndCreateSession(constr, ref _sessionwrp); // process the HResult here instead of from the SafeHandle because the possibility // of an InfoMessageEvent. if ((0 <= hr) && !_sessionwrp.IsInvalid) { // process infonessage events OleDbConnection.ProcessResults(hr, connection, connection); } else { Exception?e = OleDbConnection.ProcessResults(hr, null, null); Debug.Assert(null != e, "CreateSessionError"); throw e; } Debug.Assert(!_sessionwrp.IsInvalid, "bad Session"); } } catch { if (null != _sessionwrp) { _sessionwrp.Dispose(); _sessionwrp = null; } if (null != _datasrcwrp) { _datasrcwrp.Dispose(); _datasrcwrp = null; } throw; } }
// @devnote: should be multithread safe public static void ReleaseObjectPool() { OleDbConnectionInternal.idataInitialize = null; }
// @devnote: should be multithread safe access to OleDbConnection.idataInitialize, // though last one wins for setting variable. It may be different objects, but // OLE DB will ensure I'll work with just the single pool static private OleDbServicesWrapper GetObjectPool() { OleDbServicesWrapper wrapper = OleDbConnectionInternal.idataInitialize; if (null == wrapper) { lock(dataInitializeLock) { wrapper = OleDbConnectionInternal.idataInitialize; if (null == wrapper) { VersionCheck(); object datalinks; try { datalinks = CreateInstanceDataLinks(); } catch (Exception e) { // if (!ADP.IsCatchableExceptionType(e)) { throw; } throw ODB.MDACNotAvailable(e); } if (null == datalinks) { throw ODB.MDACNotAvailable(null); } wrapper = new OleDbServicesWrapper(datalinks); OleDbConnectionInternal.idataInitialize = wrapper; } } } Debug.Assert(null != wrapper, "GetObjectPool: null dataInitialize"); return wrapper; }
// @devnote: should be multithread safe static public void ReleaseObjectPool() { OleDbConnectionInternal.idataInitialize = null; }
public static void ReleaseObjectPool() { idataInitialize = null; }