Example #1
0
        /// <summary>
        /// Given the request url, return the Redirect that applies to this path.
        /// </summary>
        /// <param name="sourceUrl">The source url</param>
        public Redirect LocateRedirect(string sourceUrl)
        {
            // MAKE SURE WE HAVE A VALID CACHE
            if (!_ValidCache)
            {
                this.InitializeCache();
            }

            // CHECK FOR FIXED REDIRECT IN CACHE
            string loweredSourceUrl = sourceUrl.ToLowerInvariant();

            if (this._FixedRedirects.Contains(loweredSourceUrl))
            {
                // RETURN CACHED ITEM
                return(this._FixedRedirects[loweredSourceUrl]);
            }

            // SEE IF WE HAVE MORE FIXED REDIRECTS IN DATABASE
            if (this._CacheSize < this._FixedRedirectCount)
            {
                // TRY TO FIND A FIXED REDIRECT BY QUERY
                Redirect redirect = RedirectDataSource.LoadForSourceUrl(loweredSourceUrl);
                if (redirect != null)
                {
                    // REDIRECT FOUND, KICK OUT THE LAST ITEM IN CACHE
                    this._FixedRedirects.RemoveAt(this._FixedRedirects.Count - 1);

                    // PUT THE NEW ITEM TO THE TOP OF CACHE
                    this._FixedRedirects.Insert(0, redirect);

                    // RETURN THE NEW REDIRECT
                    return(redirect);
                }
            }

            // LOOK THROUGH DYNAMIC REDIRECTS
            foreach (Redirect item in this._DynamicRedirects)
            {
                if (item.AppliesToUrl(sourceUrl))
                {
                    // A MATCHING REDIRECT IS FOUND, RETURN IT
                    return(item);
                }
            }

            // NO REDIRECT FOUND FOR THE GIVEN URL
            return(null);
        }
Example #2
0
        protected void InitializeCache()
        {
            // WE ALWAYS LOAD ALL DYNAMIC REDIRECTS TO CACHE
            _DynamicRedirects = RedirectDataSource.LoadDynamicRedirects();

            // WE LOAD FIXED REDIRECTS UP TO CACHE SIZE
            _FixedRedirects = new KeyedRedirectCollection();
            RedirectCollection tempFixedRedirects = RedirectDataSource.LoadFixedRedirects(this._CacheSize, 0);

            foreach (Redirect item in tempFixedRedirects)
            {
                _FixedRedirects.Add(item);
            }
            _FixedRedirectCount = RedirectDataSource.CountFixedRedirects();
            _ValidCache         = true;
        }
 public static Redirect Load(Int32 redirectId)
 {
     return(RedirectDataSource.Load(redirectId, true));
 }
        /// <summary>
        /// Saves this Redirect object to the database.
        /// </summary>
        /// <returns><b>SaveResult</b> enumeration that represents the result of the save operation.</returns>
        protected SaveResult BaseSave()
        {
            if (this.IsDirty)
            {
                Database database     = Token.Instance.Database;
                bool     recordExists = true;

                //SET EMPTY STOREID TO CURRENT CONTEXT
                if (this.StoreId == 0)
                {
                    this.StoreId = Token.Instance.StoreId;
                }
                if (this.RedirectId == 0)
                {
                    recordExists = false;
                }

                if (this.OrderBy < 0)
                {
                    this.OrderBy = RedirectDataSource.GetNextOrderBy();
                }

                //SET DEFAULT FOR DATE FIELD
                if (this.CreatedDate == System.DateTime.MinValue)
                {
                    this.CreatedDate = LocaleHelper.LocalNow;
                }

                if (recordExists)
                {
                    //verify whether record is already present
                    StringBuilder selectQuery = new StringBuilder();
                    selectQuery.Append("SELECT COUNT(*) As RecordCount FROM ac_Redirects");
                    selectQuery.Append(" WHERE RedirectId = @redirectId");
                    using (DbCommand selectCommand = database.GetSqlStringCommand(selectQuery.ToString()))
                    {
                        database.AddInParameter(selectCommand, "@RedirectId", System.Data.DbType.Int32, this.RedirectId);
                        if ((int)database.ExecuteScalar(selectCommand) == 0)
                        {
                            recordExists = false;
                        }
                    }
                }

                int result = 0;
                if (recordExists)
                {
                    //UPDATE
                    StringBuilder updateQuery = new StringBuilder();
                    updateQuery.Append("UPDATE ac_Redirects SET ");
                    updateQuery.Append("StoreId = @StoreId");
                    updateQuery.Append(", SourceUrl = @SourceUrl");
                    updateQuery.Append(", LoweredSourceUrl = @LoweredSourceUrl");
                    updateQuery.Append(", TargetUrl = @TargetUrl");
                    updateQuery.Append(", UseRegEx = @UseRegEx");
                    updateQuery.Append(", CreatedDate = @CreatedDate");
                    updateQuery.Append(", LastVisitedDate = @LastVisitedDate");
                    updateQuery.Append(", VisitCount = @VisitCount");
                    updateQuery.Append(", OrderBy = @OrderBy");
                    updateQuery.Append(" WHERE RedirectId = @RedirectId");
                    using (DbCommand updateCommand = database.GetSqlStringCommand(updateQuery.ToString()))
                    {
                        database.AddInParameter(updateCommand, "@RedirectId", System.Data.DbType.Int32, this.RedirectId);
                        database.AddInParameter(updateCommand, "@StoreId", System.Data.DbType.Int32, this.StoreId);
                        database.AddInParameter(updateCommand, "@SourceUrl", System.Data.DbType.String, this.SourceUrl);
                        database.AddInParameter(updateCommand, "@LoweredSourceUrl", System.Data.DbType.String, this.LoweredSourceUrl);
                        database.AddInParameter(updateCommand, "@TargetUrl", System.Data.DbType.String, this.TargetUrl);
                        database.AddInParameter(updateCommand, "@UseRegEx", System.Data.DbType.Boolean, this.UseRegEx);
                        database.AddInParameter(updateCommand, "@CreatedDate", System.Data.DbType.DateTime, LocaleHelper.FromLocalTime(this.CreatedDate));
                        database.AddInParameter(updateCommand, "@LastVisitedDate", System.Data.DbType.DateTime, NullableData.DbNullify(LocaleHelper.FromLocalTime(this.LastVisitedDate)));
                        database.AddInParameter(updateCommand, "@VisitCount", System.Data.DbType.Int32, NullableData.DbNullify(this.VisitCount));
                        database.AddInParameter(updateCommand, "@OrderBy", System.Data.DbType.Int16, this.OrderBy);
                        //RESULT IS NUMBER OF RECORDS AFFECTED
                        result = database.ExecuteNonQuery(updateCommand);
                    }
                }
                else
                {
                    //INSERT
                    StringBuilder insertQuery = new StringBuilder();
                    insertQuery.Append("INSERT INTO ac_Redirects (StoreId, SourceUrl, LoweredSourceUrl, TargetUrl, UseRegEx, CreatedDate, LastVisitedDate, VisitCount, OrderBy)");
                    insertQuery.Append(" VALUES (@StoreId, @SourceUrl, @LoweredSourceUrl, @TargetUrl, @UseRegEx, @CreatedDate, @LastVisitedDate, @VisitCount, @OrderBy)");
                    insertQuery.Append("; SELECT Scope_Identity()");
                    using (DbCommand insertCommand = database.GetSqlStringCommand(insertQuery.ToString()))
                    {
                        database.AddInParameter(insertCommand, "@RedirectId", System.Data.DbType.Int32, this.RedirectId);
                        database.AddInParameter(insertCommand, "@StoreId", System.Data.DbType.Int32, this.StoreId);
                        database.AddInParameter(insertCommand, "@SourceUrl", System.Data.DbType.String, this.SourceUrl);
                        database.AddInParameter(insertCommand, "@LoweredSourceUrl", System.Data.DbType.String, this.LoweredSourceUrl);
                        database.AddInParameter(insertCommand, "@TargetUrl", System.Data.DbType.String, this.TargetUrl);
                        database.AddInParameter(insertCommand, "@UseRegEx", System.Data.DbType.Boolean, this.UseRegEx);
                        database.AddInParameter(insertCommand, "@CreatedDate", System.Data.DbType.DateTime, LocaleHelper.FromLocalTime(this.CreatedDate));
                        database.AddInParameter(insertCommand, "@LastVisitedDate", System.Data.DbType.DateTime, NullableData.DbNullify(LocaleHelper.FromLocalTime(this.LastVisitedDate)));
                        database.AddInParameter(insertCommand, "@VisitCount", System.Data.DbType.Int32, NullableData.DbNullify(this.VisitCount));
                        database.AddInParameter(insertCommand, "@OrderBy", System.Data.DbType.Int16, this.OrderBy);
                        //RESULT IS NEW IDENTITY;
                        result           = AlwaysConvert.ToInt(database.ExecuteScalar(insertCommand));
                        this._RedirectId = result;
                    }
                }

                //OBJECT IS DIRTY IF NO RECORDS WERE UPDATED OR INSERTED
                this.IsDirty = (result == 0);
                if (this.IsDirty)
                {
                    return(SaveResult.Failed);
                }
                else
                {
                    return(recordExists ? SaveResult.RecordUpdated : SaveResult.RecordInserted);
                }
            }

            //SAVE IS SUCCESSFUL IF OBJECT IS NOT DIRTY
            return(SaveResult.NotDirty);
        }