void ReuseConnection(ref SqlStateConnection conn, bool usePooling)
 {
     if (usePooling)
     {
         s_rpool.StoreResource(conn);
     }
     conn = null;
 }
        SqlStateConnection GetConnection(ref bool usePooling)
        {
            SqlStateConnection conn = null;

            usePooling = CanUsePooling();
            if (usePooling)
            {
                conn = (SqlStateConnection)s_rpool.RetrieveResource();
            }
            if (conn == null)
            {
                conn = new SqlStateConnection(s_sqlConnectionString);
            }

            return(conn);
        }
        protected override SessionStateItem GetExclusive(String id)
        {
            Debug.Trace("SessionStateClientManager", "Calling Sql GetExclusive, id=" + id);

            bool               usePooling = true;
            SessionStateItem   item;
            SqlStateConnection conn = GetConnection(ref usePooling);

            try {
                item = DoGet(id, conn._cmdTempGetExclusive);
            }
            catch {
                conn.Dispose();
                throw;
            }

            ReuseConnection(ref conn, usePooling);
            return(item);
        }
        protected override void ResetTimeoutAsyncWorker(String id)
        {
            Debug.Trace("SessionStateClientManager", "Calling Sql ResetTimeout, id=" + id);

            bool usePooling         = true;
            SqlStateConnection conn = GetConnection(ref usePooling);

            try {
                conn._cmdTempResetTimeout.Parameters[0].Value = id + s_appSuffix;
                conn._cmdTempResetTimeout.ExecuteNonQuery();
            }
            catch (Exception e) {
                conn.Dispose();
                throw new HttpException(
                          HttpRuntime.FormatResourceString(SR.Cant_connect_sql_session_database),
                          e);
            }

            ReuseConnection(ref conn, usePooling);
        }
        void DisposeOrReuseConnection(ref SqlStateConnection conn, bool usePooling) {
            try {
                if (conn == null) {
                    return;
                }

                if (usePooling) {
                    conn.ClearAllParameters();
                    _partitionInfo.StoreResource(conn);
                    conn = null;
                }
            }
            finally {
                if (conn != null) {
                    conn.Dispose();
                }
            }
        }
        SqlStateConnection GetConnection(string id, ref bool usePooling) {
            SqlStateConnection conn = null;

            if (_partitionInfo == null) {
                Debug.Assert(s_partitionManager != null);
                Debug.Assert(_partitionResolver != null);

                _partitionInfo = (SqlPartitionInfo)s_partitionManager.GetPartition(_partitionResolver, id);
            }

            Debug.Trace("SessionStatePooling", "Calling GetConnection under " + WindowsIdentity.GetCurrent().Name);
#if DBG
            Debug.Assert(_module._rqChangeImpersonationRefCount != 0,
                "SessionStateModule.ChangeImpersonation should have been called before making any call to SQL");
#endif

            usePooling = CanUsePooling();
            if (usePooling) {
                conn = (SqlStateConnection) _partitionInfo.RetrieveResource();
                if (conn != null && (conn.Connection.State & ConnectionState.Open) == 0) {
                    conn.Dispose();
                    conn = null;
                }
            }

            if (conn == null) {
                conn = new SqlStateConnection(_partitionInfo, s_retryInterval);
            }

            return conn;
        }
        protected override void SetAsyncWorker(String id, SessionStateItem item,
                                               byte[] buf, int length, bool inStorage)
        {
            SqlCommand cmd;

            Debug.Trace("SessionStateClientManager", "Calling Sql Set, id=" + id);

            bool usePooling         = true;
            SqlStateConnection conn = GetConnection(ref usePooling);

            try {
                if (inStorage)
                {
                    Debug.Assert(item.streamLength > 0, "item.streamLength > 0");
                    if (length <= ITEM_SHORT_LENGTH)
                    {
                        if (item.streamLength <= ITEM_SHORT_LENGTH)
                        {
                            cmd = conn._cmdTempUpdateShort;
                        }
                        else
                        {
                            cmd = conn._cmdTempUpdateShortNullLong;
                        }
                    }
                    else
                    {
                        if (item.streamLength <= ITEM_SHORT_LENGTH)
                        {
                            cmd = conn._cmdTempUpdateLongNullShort;
                        }
                        else
                        {
                            cmd = conn._cmdTempUpdateLong;
                        }
                    }
                }
                else
                {
                    if (length <= ITEM_SHORT_LENGTH)
                    {
                        cmd = conn._cmdTempInsertShort;
                    }
                    else
                    {
                        cmd = conn._cmdTempInsertLong;
                    }
                }

                cmd.Parameters[0].Value = id + s_appSuffix;
                cmd.Parameters[1].Size  = length;
                cmd.Parameters[1].Value = buf;
                cmd.Parameters[2].Value = item.timeout;
                if (inStorage)
                {
                    cmd.Parameters[3].Value = item.lockCookie;
                }

                try {
                    cmd.ExecuteNonQuery();
                }
                catch (Exception e) {
                    SqlException sqlExpt = e as SqlException;
                    if (sqlExpt != null &&
                        sqlExpt.Number == SQL_ERROR_PRIMARY_KEY_VIOLATION &&
                        !inStorage)
                    {
                        Debug.Trace("SessionStateClientSet",
                                    "Insert failed because of primary key violation; just leave gracefully; id=" + id);

                        // It's possible that two threads (from the same session) are creating the session
                        // state, both failed to get it first, and now both tried to insert it.
                        // One thread may lose with a Primary Key Violation error. If so, that thread will
                        // just lose and exit gracefully.
                    }
                    else
                    {
                        throw new HttpException(
                                  HttpRuntime.FormatResourceString(SR.Cant_connect_sql_session_database),
                                  e);
                    }
                }
            }
            catch {
                conn.Dispose();
                throw;
            }

            ReuseConnection(ref conn, usePooling);
        }
 private SqlStateConnection GetConnection(string id, ref bool usePooling)
 {
     SqlStateConnection connection = null;
     if (this._partitionInfo == null)
     {
         this._partitionInfo = (SqlPartitionInfo) s_partitionManager.GetPartition(this._partitionResolver, id);
     }
     usePooling = this.CanUsePooling();
     if (usePooling)
     {
         connection = (SqlStateConnection) this._partitionInfo.RetrieveResource();
         if ((connection != null) && ((connection.Connection.State & ConnectionState.Open) == ConnectionState.Closed))
         {
             connection.Dispose();
             connection = null;
         }
     }
     if (connection == null)
     {
         connection = new SqlStateConnection(this._partitionInfo, s_retryInterval);
     }
     return connection;
 }