/// <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); }
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); }