コード例 #1
0
        private static string TryProcessParameterAsString(
            object value,
            KnownProvider provider,
            StringBuilder sb,
            ValuesInjectionMethodInternal injectMethod)
        {
            // null is just 'NULL'
            if (value == null)
            {
                return("NULL");
            }

            switch (injectMethod)
            {
            case ValuesInjectionMethodInternal.ViaParameters:
                return(null);

            case ValuesInjectionMethodInternal.Auto:
                // Postgres has a huge limit for parameters, whereas MSSQL is just ... 2100 :(
                if (provider == KnownProvider.PostgreSql)
                {
                    return(null);
                }
                break;
            }

            // Try to inject parameters as text
            sb.Length = 0;
            switch (value)
            {
            case string strValue:
                sb.Append("'").Append(strValue.Replace("'", "''")).Append("'");
                break;

            case float _:
            case double _:
            case decimal _:
                sb.Append(Convert.ToString(value, CultureInfo.InvariantCulture));
                break;

            case int _:
            case long _:
                switch (provider)
                {
                case KnownProvider.Mssql:
                    if (value is int)
                    {
                        sb.Append(Convert.ToString(value, CultureInfo.InvariantCulture));
                    }
                    else
                    {
                        sb.Append("CAST(")
                        .Append(Convert.ToString(value, CultureInfo.InvariantCulture))
                        .Append("AS BIGINT)");
                    }
                    break;

                default:
                    sb.Append(Convert.ToString(value, CultureInfo.InvariantCulture));
                    break;
                }

                break;

            case DateTime dateValue:
                switch (provider)
                {
                case KnownProvider.Mssql:
                    sb.Append("CAST ('")
                    .Append(dateValue.ToString("yyyy-MM-ddTHH:mm:ss.fff"))
                    .Append("' AS DATETIME)");
                    break;

                case KnownProvider.PostgreSql:
                    sb.Append("'")
                    .Append(dateValue.ToString("yyyy-MM-ddTHH:mm:ss.fff"))
                    .Append("'::date");
                    break;

                default:
                    return(null);
                }

                break;

            default:
                return(null);
            }

            return(sb.ToString());
        }
コード例 #2
0
        private static void AppendRowsAsValues(StringBuilder sb, InterceptionOptions options, DbCommand command, IList parameters, KnownProvider providerType)
        {
#if EFCore
            string paramPattern = EntityFrameworkCore.MemoryJoin.MemoryJoiner.ParametersPrefix;
#else
            string paramPattern = EntityFramework.MemoryJoin.MemoryJoiner.ParametersPrefix;
#endif

            Interlocked.Increment(ref parametersSequence);

            paramPattern = paramPattern + parametersSequence + "_";

            var innerSb = new StringBuilder(20);
            var i       = 0;
            var id      = 1;

            sb.Append("( VALUES ");

            foreach (var el in options.Data)
            {
                sb.Append("(");
                // Let's append Id anyways, as per Issue #1

                sb.Append(id).Append(", ");
                foreach (var columnName in options.ColumnNames)
                {
                    var value       = el[columnName];
                    var stringValue = TryProcessParameterAsString(value,
                                                                  providerType, innerSb, options.ValuesInjectMethod);

                    if (stringValue != null)
                    {
                        sb.Append(stringValue);
                    }
                    else
                    {
                        var paramName = $"{paramPattern}{i}";
                        var param     = command.CreateParameter();
                        param.ParameterName = paramName;
                        param.Value         = value;
                        parameters.Add(param);
                        sb.Append(paramName);

                        i++;
                    }
                    sb.Append(", ");
                }
                sb.Length -= ", ".Length;
                sb.Append("), ");
                id++;
            }

            sb.Length -= ", ".Length;
            sb.Append(")");
        }
コード例 #3
0
 public static extern int EnumSystemFirmwareTables(KnownProvider firmwareTableProviderSignature, IntPtr firmwareTableBuffer, int bufferSize);
コード例 #4
0
 public static extern int GetSystemFirmwareTable(KnownProvider firmwareTableProviderSignature, int firmwareTableId, IntPtr firmwareTableBuffer, int bufferSize);
コード例 #5
0
        private static void AppendRowsAsValues(StringBuilder sb, InterceptionOptions options, DbCommand command, IList parameters, KnownProvider providerType)
        {
            const string paramPattern = "@__gen_q_p";

            var innerSb = new StringBuilder(20);
            var i       = 0;
            var id      = 1;

            sb.Append("( VALUES ");

            foreach (var el in options.Data)
            {
                sb.Append("(");
                // Let's append Id anyways, as per Issue #1

                sb.Append(id).Append(", ");
                foreach (var columnName in options.ColumnNames)
                {
                    var value       = el[columnName];
                    var stringValue = TryProcessParameterAsString(value,
                                                                  providerType, innerSb, options.ValuesInjectMethod);

                    if (stringValue != null)
                    {
                        sb.Append(stringValue);
                    }
                    else
                    {
                        var paramName = $"{paramPattern}{i}";
                        var param     = command.CreateParameter();
                        param.ParameterName = paramName;
                        param.Value         = value;
                        parameters.Add(param);
                        sb.Append(paramName);

                        i++;
                    }
                    sb.Append(", ");
                }
                sb.Length -= ", ".Length;
                sb.Append("), ");
                id++;
            }

            sb.Length -= ", ".Length;
            sb.Append(")");
        }