Beispiel #1
0
        /// <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());
            }
        }