internal SqlCeException ProcessResults(int hr, IntPtr pError, object src) { if (hr == 0) { return(null); } if (NativeMethods.Failed(hr)) { Exception ex = SqlCeUtil.CreateException(pError, hr); if (ex is SqlCeException) { return((SqlCeException)ex); } throw ex; } if (base.Events[ADP.EventInfoMessage] != null) { SqlCeInfoMessageEventHandler sqlCeInfoMessageEventHandler = (SqlCeInfoMessageEventHandler)base.Events[ADP.EventInfoMessage]; if (sqlCeInfoMessageEventHandler != null) { try { sqlCeInfoMessageEventHandler(this, new SqlCeInfoMessageEventArgs(hr, pError, src)); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } } } } else { NativeMethods.ClearErrorInfo(pError); } return(null); }
internal unsafe void Open(bool silent) { int num = 0; int lcidLocale = -1; int cbBufferPool = -1; int dwAutoShrinkPercent = -1; int cMaxPages = -1; int cMaxTmpPages = -1; int dwDefaultEscalation = -1; int dwDefaultTimeout = -1; int dwFlushInterval = -1; object obj = null; string text = null; string source = null; string text2 = null; string value = null; SEOPENFLAGS dwFlags = SEOPENFLAGS.MODE_READ | SEOPENFLAGS.MODE_WRITE; bool flag = false; int num2 = 0; if (isDisposed) { throw new ObjectDisposedException("SqlCeConnection"); } DateTime utcNow = DateTime.UtcNow; if (ConnectionString == null || ConnectionString.Length == 0) { throw new InvalidOperationException(Res.GetString("ADP_NoConnectionString")); } if (dataSource == null || dataSource.Trim().Length == 0) { throw new ArgumentException(Res.GetString("ADP_EmptyDatabaseName")); } if (isOpened) { throw new InvalidOperationException(Res.GetString("ADP_ConnectionAlreadyOpen", ConnectionState.Open.ToString())); } MEOPENINFO mEOPENINFO = default(MEOPENINFO); IntPtr intPtr = Marshal.AllocCoTaskMem(sizeof(MEOPENINFO)); if (IntPtr.Zero == intPtr) { throw new OutOfMemoryException(); } try { if (ADP.IsEmpty(modifiedConnStr)) { throw new InvalidOperationException(Res.GetString("ADP_NoConnectionString")); } text = ConStringUtil.ReplaceDataDirectory(dataSource); obj = connTokens["Locale Identifier"]; if (obj != null) { lcidLocale = (int)obj; } obj = connTokens["Max Buffer Size"]; if (obj != null) { cbBufferPool = (int)obj * 1024; } obj = connTokens["Autoshrink Threshold"]; if (obj != null) { dwAutoShrinkPercent = (int)obj; } obj = connTokens["Max Database Size"]; if (obj != null) { cMaxPages = (int)obj * 256; } obj = connTokens["Temp File Max Size"]; if (obj != null) { cMaxTmpPages = (int)obj * 256; } obj = connTokens["Flush Interval"]; if (obj != null) { dwFlushInterval = (int)obj; } obj = connTokens["Default Lock Escalation"]; if (obj != null) { dwDefaultEscalation = (int)obj; } obj = connTokens["Default Lock Timeout"]; if (obj != null) { dwDefaultTimeout = (int)obj; } obj = connTokens["Temp File Directory"]; if (obj != null) { text2 = (string)obj; } obj = connTokens["Encryption Mode"]; if (obj != null) { value = (string)obj; } obj = connTokens["Password"]; if (obj != null) { string text3 = (string)obj; if (text3.Length > 0) { source = text3; } } obj = connTokens["Case Sensitive"]; if (obj != null) { flag = (bool)obj; } string text4 = null; obj = connTokens["Mode"]; if (obj != null) { text4 = (string)obj; } num2 = connTokens.FileAccessRetryTimeout * 1000; if (text4 != null) { switch (text4) { case "Read Only": dwFlags = SEOPENFLAGS.MODE_READ; break; case "Read Write": dwFlags = (SEOPENFLAGS.MODE_READ | SEOPENFLAGS.MODE_WRITE); break; case "Exclusive": dwFlags = (SEOPENFLAGS.MODE_READ | SEOPENFLAGS.MODE_WRITE | SEOPENFLAGS.MODE_SHARE_DENY_READ | SEOPENFLAGS.MODE_SHARE_DENY_WRITE); break; case "Shared Read": dwFlags = (SEOPENFLAGS.MODE_READ | SEOPENFLAGS.MODE_WRITE | SEOPENFLAGS.MODE_SHARE_DENY_WRITE); break; } } FileIOPermissionAccess fileIOPermissionAccess = FileIOPermissionAccess.Read; if (!string.IsNullOrEmpty(text4) && !text4.Equals("Read Only", StringComparison.OrdinalIgnoreCase)) { fileIOPermissionAccess = (fileIOPermissionAccess | FileIOPermissionAccess.Write | FileIOPermissionAccess.Append); } SqlCeUtil.DemandForPermission(text, fileIOPermissionAccess); if (!string.IsNullOrEmpty(text2)) { SqlCeUtil.DemandForPermission(text2, FileIOPermissionAccess.AllAccess); } mEOPENINFO.pwszFileName = NativeMethods.MarshalStringToLPWSTR(text); mEOPENINFO.pwszPassword = NativeMethods.MarshalStringToLPWSTR(source); mEOPENINFO.pwszTempPath = NativeMethods.MarshalStringToLPWSTR(text2); mEOPENINFO.lcidLocale = lcidLocale; mEOPENINFO.cbBufferPool = cbBufferPool; mEOPENINFO.dwAutoShrinkPercent = dwAutoShrinkPercent; mEOPENINFO.dwFlushInterval = dwFlushInterval; mEOPENINFO.cMaxPages = cMaxPages; mEOPENINFO.cMaxTmpPages = cMaxTmpPages; mEOPENINFO.dwDefaultTimeout = dwDefaultTimeout; mEOPENINFO.dwDefaultEscalation = dwDefaultEscalation; mEOPENINFO.dwFlags = dwFlags; mEOPENINFO.dwEncryptionMode = ConStringUtil.MapEncryptionMode(value); mEOPENINFO.dwLocaleFlags = 0; if (flag) { mEOPENINFO.dwLocaleFlags &= 1; } flushFailureEventHandler = OnFlushFailure; Marshal.StructureToPtr((object)mEOPENINFO, intPtr, false); num = NativeMethods.OpenStore(intPtr, Marshal.GetFunctionPointerForDelegate((Delegate)flushFailureEventHandler), ref pStoreService, ref pStoreServer, ref pQpServices, ref pSeStore, ref pTx, ref pQpDatabase, ref pQpSession, ref pStoreEvents, ref pError); SqlCeException ex = ProcessResults(num, pError, this); if (ex != null) { if (ex.NativeError != 25035 || num2 == 0) { throw ex; } int num3 = 100; int num4 = 1; DateTime utcNow2 = DateTime.UtcNow; TimeSpan timeSpan = utcNow2 - utcNow; while (ex != null && ex.NativeError == 25035 && utcNow <= utcNow2 && timeSpan.TotalMilliseconds < num2 && num4 <= 10) { int num5 = num2 - (int)timeSpan.TotalMilliseconds; if (num5 < num3) { num3 = num5; } Thread.Sleep(num3); num3 *= 2; num = NativeMethods.OpenStore(intPtr, Marshal.GetFunctionPointerForDelegate((Delegate)flushFailureEventHandler), ref pStoreService, ref pStoreServer, ref pQpServices, ref pSeStore, ref pTx, ref pQpDatabase, ref pQpSession, ref pStoreEvents, ref pError); ex = ProcessResults(num, pError, this); num4++; utcNow2 = DateTime.UtcNow; timeSpan = utcNow2 - utcNow; } if (ex != null) { throw ex; } } removePwd = true; state = ConnectionState.Open; isOpened = true; } finally { Marshal.FreeCoTaskMem(mEOPENINFO.pwszFileName); Marshal.FreeCoTaskMem(mEOPENINFO.pwszPassword); Marshal.FreeCoTaskMem(mEOPENINFO.pwszTempPath); Marshal.FreeCoTaskMem(intPtr); if (ConnectionState.Open != state) { Close(); removePwd = false; state = ConnectionState.Closed; } } if (!silent) { OnStateChange(ConnectionState.Closed, ConnectionState.Open); } }