Example #1
0
        /// <summary>
        /// Writes a decimal to a protobuf stream
        /// </summary>
        public static void WriteDecimal(decimal value, ProtoWriter writer)
        {
            var   dec = new DecimalAccessor(value);
            ulong a = ((ulong)dec.Mid) << 32, b = ((ulong)dec.Lo) & 0xFFFFFFFFL;
            ulong low       = a | b;
            uint  high      = (uint)dec.Hi;
            uint  signScale = (uint)(((dec.Flags >> 15) & 0x01FE) | ((dec.Flags >> 31) & 0x0001));

            SubItemToken token = ProtoWriter.StartSubItem(null, writer);

            if (low != 0)
            {
                ProtoWriter.WriteFieldHeader(FieldDecimalLow, WireType.Variant, writer);
                ProtoWriter.WriteUInt64(low, writer);
            }
            if (high != 0)
            {
                ProtoWriter.WriteFieldHeader(FieldDecimalHigh, WireType.Variant, writer);
                ProtoWriter.WriteUInt32(high, writer);
            }
            if (signScale != 0)
            {
                ProtoWriter.WriteFieldHeader(FieldDecimalSignScale, WireType.Variant, writer);
                ProtoWriter.WriteUInt32(signScale, writer);
            }
            ProtoWriter.EndSubItem(token, writer);
        }
Example #2
0
    internal static decimal SetScale(decimal value, int scale)
    {
        var dec = new DecimalAccessor(value)
        {
            Scale = (uint)scale
        };

        return(dec.Decimal);
    }
Example #3
0
    public static int EncodeDecimal32(decimal value, int targetPrecision, int targetScale)
    {
        var dec   = new DecimalAccessor(value);
        int scale = (int)dec.Scale;

        CheckConditions(value, scale, targetPrecision, targetScale);

        int  scaleAdjustment = targetScale - scale;
        uint maxValue        = PowerOf10Int32(targetPrecision - scaleAdjustment) - 1;
        uint unscaledValue   = dec.Low;

        if (dec.High > 0 || dec.Mid > 0 || unscaledValue > maxValue)
        {
            ThrowValueTooBig(value, targetPrecision);
        }

        uint factor = PowerOf10Int32(scaleAdjustment);
        int  result = (int)(unscaledValue * factor);

        return(dec.IsNegative ? result * -1 : result);
    }
Example #4
0
    public static KuduInt128 EncodeDecimal128(decimal value, int targetPrecision, int targetScale)
    {
        var dec   = new DecimalAccessor(value);
        var scale = (int)dec.Scale;

        CheckConditions(value, scale, targetPrecision, targetScale);

        int scaleAdjustment = targetScale - scale;
        var maxValue        = KuduInt128.PowerOf10(targetPrecision - scaleAdjustment) - 1;
        var unscaledValue   = new KuduInt128(dec.Low, dec.Mid, dec.High, 0);

        if (unscaledValue > maxValue)
        {
            ThrowValueTooBig(value, targetPrecision);
        }

        var factor = KuduInt128.PowerOf10(scaleAdjustment);
        var result = unscaledValue * factor;

        return(dec.IsNegative ? result.Negate() : result);
    }
Example #5
0
    public static long EncodeDecimal64(decimal value, int targetPrecision, int targetScale)
    {
        var dec   = new DecimalAccessor(value);
        int scale = (int)dec.Scale;

        CheckConditions(value, scale, targetPrecision, targetScale);

        int   scaleAdjustment = targetScale - scale;
        ulong maxValue        = PowerOf10Int64(targetPrecision - scaleAdjustment) - 1;
        ulong unscaledValue   = ToLong(dec.Low, dec.Mid);

        if (dec.High > 0 || unscaledValue > maxValue)
        {
            ThrowValueTooBig(value, targetPrecision);
        }

        ulong factor = PowerOf10Int64(scaleAdjustment);
        long  result = (long)(unscaledValue * factor);

        return(dec.IsNegative ? result * -1 : result);
    }
Example #6
0
        void ISerializer <decimal> .Write(ref ProtoWriter.State state, decimal value)
        {
            ulong low;
            uint  high, signScale;

            if (s_decimalOptimized) // the JIT should remove the non-preferred implementation, at least on modern runtimes
            {
                var   dec = new DecimalAccessor(value);
                ulong a = ((ulong)dec.Mid) << 32, b = ((ulong)dec.Lo) & 0xFFFFFFFFL;
                low       = a | b;
                high      = (uint)dec.Hi;
                signScale = (uint)(((dec.Flags >> 15) & 0x01FE) | ((dec.Flags >> 31) & 0x0001));
            }
            else
            {
                int[] bits = decimal.GetBits(value);
                ulong a = ((ulong)bits[1]) << 32, b = ((ulong)bits[0]) & 0xFFFFFFFFL;
                low       = a | b;
                high      = (uint)bits[2];
                signScale = (uint)(((bits[3] >> 15) & 0x01FE) | ((bits[3] >> 31) & 0x0001));
            }

            if (low != 0)
            {
                state.WriteFieldHeader(FieldDecimalLow, WireType.Varint);
                state.WriteUInt64(low);
            }
            if (high != 0)
            {
                state.WriteFieldHeader(FieldDecimalHigh, WireType.Varint);
                state.WriteUInt32(high);
            }
            if (signScale != 0)
            {
                state.WriteFieldHeader(FieldDecimalSignScale, WireType.Varint);
                state.WriteUInt32(signScale);
            }
        }
Example #7
0
        private void InitInfo(Type modelType)
        {
            accessorDict = new Dictionary <string, Accessor>();
            var Properties = TypeCache.GetTable(modelType).Fields;

            foreach (var kv in Properties)
            {
                Accessor accessor = null;
                var      prop     = kv.GetPropertyInfo();
                string   propName = prop.Name.ToUpper();
                var      propType = prop.PropertyType;

                if (propType.IsEnum)
                {
                    propType = propType.GetEnumUnderlyingType();
                }
                if (typeof(string) == propType)
                {
                    accessor = new StringAccessor(prop);
                }
                else if (typeof(int) == propType)
                {
                    accessor = new IntAccessor(prop);
                }
                else if (typeof(int?) == propType)
                {
                    accessor = new IntNullableAccessor(prop);
                }
                else if (typeof(DateTime) == propType)
                {
                    accessor = new DateTimeAccessor(prop);
                }
                else if (typeof(DateTime?) == propType)
                {
                    accessor = new DateTimeNullableAccessor(prop);
                }
                else if (typeof(long) == propType)
                {
                    accessor = new LongAccessor(prop);
                }
                else if (typeof(long?) == propType)
                {
                    accessor = new LongNullableAccessor(prop);
                }
                else if (typeof(float) == propType)
                {
                    accessor = new FloatAccessor(prop);
                }
                else if (typeof(float?) == propType)
                {
                    accessor = new FloatNullableAccessor(prop);
                }
                else if (typeof(double) == propType)
                {
                    accessor = new DoubleAccessor(prop);
                }
                else if (typeof(double?) == propType)
                {
                    accessor = new DoubleNullableAccessor(prop);
                }
                else if (typeof(Guid) == propType)
                {
                    accessor = new GuidAccessor(prop);
                }
                else if (typeof(Guid?) == propType)
                {
                    accessor = new GuidNullableAccessor(prop);
                }
                else if (typeof(short) == propType)
                {
                    accessor = new ShortAccessor(prop);
                }
                else if (typeof(short?) == propType)
                {
                    accessor = new ShortNullableAccessor(prop);
                }
                else if (typeof(byte) == propType)
                {
                    accessor = new ByteAccessor(prop);
                }
                else if (typeof(byte?) == propType)
                {
                    accessor = new ByteNullableAccessor(prop);
                }
                else if (typeof(char) == propType)
                {
                    accessor = new CharAccessor(prop);
                }
                else if (typeof(char?) == propType)
                {
                    accessor = new CharNullableAccessor(prop);
                }
                else if (typeof(decimal) == propType)
                {
                    accessor = new DecimalAccessor(prop);
                }
                else if (typeof(decimal?) == propType)
                {
                    accessor = new DecimalNullableAccessor(prop);
                }
                else if (typeof(byte[]) == propType)
                {
                    accessor = new ByteArrayAccessor(prop);
                }
                else if (typeof(bool) == propType)
                {
                    accessor = new BoolAccessor(prop);
                }
                else if (typeof(bool?) == propType)
                {
                    accessor = new BoolNullableAccessor(prop);
                }
                else if (typeof(TimeSpan) == propType)
                {
                    accessor = new TimeSpanAccessor(prop);
                }
                else if (typeof(TimeSpan?) == propType)
                {
                    accessor = new TimeSpanNullableAccessor(prop);
                }
                accessorDict[propName] = accessor;
            }
        }
Example #8
0
        private void InitInfo()
        {
            accessorDict  = new Dictionary <string, Accessor>(Properties.Length);
            FieldAttrDict = new Dictionary <PropertyInfo, OrmFieldAttribute>(Properties.Length);
            foreach (var prop in Properties)
            {
                Accessor accessor = null;

                string propName = prop.Name.ToUpper();
                var    propType = prop.PropertyType;

                if (propType.IsEnum)
                {
                    propType = propType.GetEnumUnderlyingType();
                }
                if (typeof(string) == propType)
                {
                    accessor = new StringAccessor(prop);
                }
                else if (typeof(int) == propType)
                {
                    accessor = new IntAccessor(prop);
                }
                else if (typeof(int?) == propType)
                {
                    accessor = new IntNullableAccessor(prop);
                }
                else if (typeof(DateTime) == propType)
                {
                    accessor = new DateTimeAccessor(prop);
                }
                else if (typeof(DateTime?) == propType)
                {
                    accessor = new DateTimeNullableAccessor(prop);
                }
                else if (typeof(long) == propType)
                {
                    accessor = new LongAccessor(prop);
                }
                else if (typeof(long?) == propType)
                {
                    accessor = new LongNullableAccessor(prop);
                }
                else if (typeof(float) == propType)
                {
                    accessor = new FloatAccessor(prop);
                }
                else if (typeof(float?) == propType)
                {
                    accessor = new FloatNullableAccessor(prop);
                }
                else if (typeof(double) == propType)
                {
                    accessor = new DoubleAccessor(prop);
                }
                else if (typeof(double?) == propType)
                {
                    accessor = new DoubleNullableAccessor(prop);
                }
                else if (typeof(Guid) == propType)
                {
                    accessor = new GuidAccessor(prop);
                }
                else if (typeof(Guid?) == propType)
                {
                    accessor = new GuidNullableAccessor(prop);
                }
                else if (typeof(short) == propType)
                {
                    accessor = new ShortAccessor(prop);
                }
                else if (typeof(short?) == propType)
                {
                    accessor = new ShortNullableAccessor(prop);
                }
                else if (typeof(byte) == propType)
                {
                    accessor = new ByteAccessor(prop);
                }
                else if (typeof(byte?) == propType)
                {
                    accessor = new ByteNullableAccessor(prop);
                }
                else if (typeof(char) == propType)
                {
                    accessor = new CharAccessor(prop);
                }
                else if (typeof(char?) == propType)
                {
                    accessor = new CharNullableAccessor(prop);
                }
                else if (typeof(decimal) == propType)
                {
                    accessor = new DecimalAccessor(prop);
                }
                else if (typeof(decimal?) == propType)
                {
                    accessor = new DecimalNullableAccessor(prop);
                }
                else if (typeof(byte[]) == propType)
                {
                    accessor = new ByteArrayAccessor(prop);
                }
                else if (typeof(bool) == propType)
                {
                    accessor = new BoolAccessor(prop);
                }
                else if (typeof(bool?) == propType)
                {
                    accessor = new BoolNullableAccessor(prop);
                }
                else if (typeof(TimeSpan) == propType)
                {
                    accessor = new TimeSpanAccessor(prop);
                }
                else if (typeof(TimeSpan?) == propType)
                {
                    accessor = new TimeSpanNullableAccessor(prop);
                }
                accessorDict[propName] = accessor;
                //自定义属性
                var customerAttributes = prop.GetCustomAttributes(typeof(OrmFieldAttribute), false);
                if (customerAttributes == null || customerAttributes.Length == 0)
                {
                    FieldAttrDict[prop] = null;
                }
                else
                {
                    FieldAttrDict[prop] = (OrmFieldAttribute)customerAttributes[0];
                }
            }
        }