/// <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); }
internal static decimal SetScale(decimal value, int scale) { var dec = new DecimalAccessor(value) { Scale = (uint)scale }; return(dec.Decimal); }
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); }
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); }
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); }
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); } }
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; } }
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]; } } }