示例#1
0
 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);
 }
示例#2
0
        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);
            }
        }