diff --git a/Builder/IISMainHandler/build.txt b/Builder/IISMainHandler/build.txt index dd35c6b..bccf25b 100644 --- a/Builder/IISMainHandler/build.txt +++ b/Builder/IISMainHandler/build.txt @@ -1 +1 @@ -548 \ No newline at end of file +557 \ No newline at end of file diff --git a/Builder/IISUploadHandler/build.txt b/Builder/IISUploadHandler/build.txt index 2989c6c..6eac4a6 100644 --- a/Builder/IISUploadHandler/build.txt +++ b/Builder/IISUploadHandler/build.txt @@ -1 +1 @@ -283 \ No newline at end of file +292 \ No newline at end of file diff --git a/Common/Common.csproj b/Common/Common.csproj index dff83c5..c1bcce0 100644 --- a/Common/Common.csproj +++ b/Common/Common.csproj @@ -87,6 +87,7 @@ + diff --git a/Common/dataobjects/QuickLink.cs b/Common/dataobjects/QuickLink.cs new file mode 100644 index 0000000..4a1f500 --- /dev/null +++ b/Common/dataobjects/QuickLink.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using FLocal.Core; +using FLocal.Core.DB; +using FLocal.Core.DB.conditions; + +namespace FLocal.Common.dataobjects { + public class QuickLink : SqlObject { + + public class TableSpec : ISqlObjectTableSpec { + public const string TABLE = "QuickLinks"; + public const string FIELD_ID = "Id"; + public const string FIELD_NAME = "Name"; + public const string FIELD_URL = "Url"; + public static readonly TableSpec instance = new TableSpec(); + public string name { get { return TABLE; } } + public string idName { get { return FIELD_ID; } } + public void refreshSqlObject(int id) { Refresh(id); } + } + + protected override ISqlObjectTableSpec table { get { return TableSpec.instance; } } + + private string _name; + public string name { + get { + this.LoadIfNotLoaded(); + return this._name; + } + } + + private string _url; + public string url { + get { + this.LoadIfNotLoaded(); + return this._url; + } + } + + private static Dictionary name2id = new Dictionary(); + public static QuickLink LoadByName(string name) { + if(!name2id.ContainsKey(name)) { + lock(name2id) { + if(!name2id.ContainsKey(name)) { + List ids = Config.instance.mainConnection.LoadIdsByConditions( + TableSpec.instance, + new ComparisonCondition( + TableSpec.instance.getColumnSpec(TableSpec.FIELD_NAME), + ComparisonType.EQUAL, + name + ), + Diapasone.unlimited + ); + if(ids.Count > 1) { + throw new CriticalException("not unique"); + } else if(ids.Count == 1) { + name2id[name] = int.Parse(ids[0]); + } else { + throw new NotFoundInDBException(); + } + } + } + } + return QuickLink.LoadById(name2id[name]); + } + + protected override void doFromHash(Dictionary data) { + this._name = data[TableSpec.FIELD_NAME]; + this._url = data[TableSpec.FIELD_URL]; + } + + } +} diff --git a/IISMainHandler/IISMainHandler.csproj b/IISMainHandler/IISMainHandler.csproj index fa2496d..27b8a4d 100644 --- a/IISMainHandler/IISMainHandler.csproj +++ b/IISMainHandler/IISMainHandler.csproj @@ -81,6 +81,7 @@ + diff --git a/IISMainHandler/handlers/response/QuickLinkHandler.cs b/IISMainHandler/handlers/response/QuickLinkHandler.cs new file mode 100644 index 0000000..edda726 --- /dev/null +++ b/IISMainHandler/handlers/response/QuickLinkHandler.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FLocal.Core; +using FLocal.Common; +using FLocal.Common.dataobjects; + +namespace FLocal.IISHandler.handlers.response { + class QuickLinkHandler : RedirectGetHandler { + + protected override string getRedirectUrl(WebContext context) { + return QuickLink.LoadByName(context.requestParts[1]).url; + } + + } +}