/// <inheritdoc /> public override IList <TValue> Distinct <TValue>(string fieldname, Search search = null) { var escapedFieldName = Storage.EscapeFieldName(Layout[fieldname]); var field = new FieldProperties { Name = fieldname, NameAtDatabase = fieldname, Flags = FieldFlags.None, DataType = DataType.String, TypeAtDatabase = DataType.String }; field.Validate(); string query; if (search == null) { query = $"SELECT DISTINCT {escapedFieldName} FROM {FQTN}"; } else { var s = ToSqlSearch(search); query = $"SELECT DISTINCT {escapedFieldName} FROM {FQTN} WHERE {s}"; } var rows = Storage.Query(query, Database.Name, Name); var result = new Set <TValue>(); foreach (var row in rows) { var value = (TValue)Fields.ConvertValue(typeof(TValue), row[0], CultureInfo.InvariantCulture); result.Include(value); } return(result.AsList()); }
/// <summary>Invokes the method using the specified data.</summary> /// <param name="data">The data.</param> /// <exception cref="WebServerException"> /// Could not convert parameter {0} value {1} to type {2} /// or /// Function {0}\nParameter {1} is missing!. /// </exception> public void Invoke(WebData data) { data.Server.OnCheckSession(data); // auth required ? if (PageAttribute.AuthType != WebServerAuthType.None) { if (!data.Session.IsAuthenticated()) { Trace.TraceInformation("{0} {1}: Error call to <red>{2}<default> requires a valid user account. Elapsed {3}", data.Request.SourceAddress, data.Session, data.Request.DecodedUrl, data.Elapsed.FormatTime()); data.Result.AddMessage(data.Method, WebError.AuthenticationRequired, $"The requested URL {data.Request.DecodedUrl} requires a valid user account."); if (data.Method?.PageAttribute?.AuthType == WebServerAuthType.Basic) { data.Result.Headers["WWW-Authenticate"] = $"Basic realm=\"{AssemblyVersionInfo.Program.Company} - {AssemblyVersionInfo.Program.Product}\""; } return; } data.Server.OnCheckAccess(data); } if (data.Server.VerboseMode) { Trace.TraceInformation("Request {0} Invoke Method {1}", data.Request, data.Method); } if (instance is Action <WebData> func) { func.Invoke(data); if (data.Server.VerboseMode) { Trace.TraceInformation("{0} {1}: Completed call to <green>{2}<default>. Elapsed {3}", data.Request.SourceAddress, data.Session, Name, data.Elapsed.FormatTime()); } return; } var usedParameters = new Set <string>(data.Request.Parameters.Keys); var parameters = new ArrayList(); foreach (ParameterInfo p in Method.GetParameters()) { if (p.ParameterType == typeof(WebData)) { parameters.Add(data); continue; } if (data.Request.Parameters.ContainsKey(p.Name)) { string value = data.Request.Parameters[p.Name]; if (value.Trim().Length > 0) { try { parameters.Add(Fields.ConvertValue(p.ParameterType, value, CultureInfo.InvariantCulture)); } catch (Exception ex) { throw new WebServerException(ex, WebError.InvalidParameters, 0, string.Format("Could not convert parameter {0} value {1} to type {2}", p.Name, value, p.ParameterType.Name)); } continue; } } if (data.Request.MultiPartFormData != null) { if (data.Request.MultiPartFormData.TryGet(p.Name, out WebSinglePart part)) { // binary ? if (p.ParameterType == typeof(byte[])) { parameters.Add(part.Content); } else { // no convert from string string value = Encoding.UTF8.GetString(part.Content); parameters.Add(Fields.ConvertValue(p.ParameterType, value, CultureInfo.InvariantCulture)); } continue; } } if (p.IsOptional) { try { #if NET_45 if (p.HasDefaultValue) #endif { parameters.Add(p.DefaultValue); continue; } } catch { Trace.TraceError("Invalid default value at parameter {0}!", p); } parameters.Add(null); continue; } throw new WebServerException(WebError.InvalidParameters, 0, string.Format("Function {0}\nParameter {1} is missing!", this, p.Name)); } if (!PageAttribute.AllowAnyParameters) { foreach (string name in Method.GetParameters().Select(p => p.Name)) { usedParameters.TryRemove(name); } if (usedParameters.Count > 0) { throw new WebServerException(WebError.InvalidParameters, 0, string.Format("Function {0}\nParameter {1} is unknown!", this, usedParameters.First())); } } Method.Invoke(instance, parameters.ToArray()); if (data.Server.VerboseMode) { Trace.TraceInformation("{0} {1}: Completed call to <green>{2}<default>. Elapsed {3}", data.Request.SourceAddress, data.Session, Name, data.Elapsed.FormatTime()); } }