1 package com.quadcap.sql.types; 2 3 40 41 import java.io.Externalizable ; 42 import java.io.IOException ; 43 import java.io.ObjectInput ; 44 import java.io.ObjectOutput ; 45 46 import java.sql.ResultSet ; 47 import java.sql.SQLException ; 48 import java.sql.Types ; 49 50 import java.math.BigDecimal ; 51 52 import com.quadcap.util.Debug; 53 54 59 public class TypeDecimal implements Type, Externalizable { 60 public static final TypeDecimal typeDecimal = new TypeDecimal(); 61 62 int precision = -1; 63 int scale = -1; 64 65 public TypeDecimal() {} 66 67 public TypeDecimal(int precision, int scale) { 68 this.precision = precision; 69 this.scale = scale; 70 } 71 72 public String getTypeName() { 73 return "DECIMAL"; 74 } 75 76 public int getJDBCType() { return Types.DECIMAL; } 77 78 public String getJDBCClassName() { return "java.math.BigDecimal"; } 79 80 public int getPrecision() { return precision; } 81 82 public int getScale() { return scale; } 83 84 public int getMaxPrecision() { return -1; } 85 86 public int getMinScale() { return -1; } 87 88 public int getMaxScale() { return -1; } 89 90 public boolean isCharType() { return false; } 91 92 public boolean isCaseSensitive() { return false; } 93 94 public boolean isCurrency() { return false; } 95 96 public boolean isSigned() { return true; } 97 98 public int getDisplayWidth() { return precision + 1; } 99 100 public String toString() { 101 if (precision > 0) { 102 return "DECIMAL(" + precision + ", " + scale + ")"; 103 } else { 104 return "DECIMAL"; 105 } 106 } 107 108 public void readExternal(ObjectInput in) throws IOException { 109 precision = in.readInt(); 110 scale = in.readInt(); 111 } 112 113 public void writeExternal(ObjectOutput out) throws IOException { 114 out.writeInt(precision); 115 out.writeInt(scale); 116 } 117 118 public Value convert(Value v) throws ValueException { 119 return v.convert(this); 120 } 121 122 125 public Value convertNumber(long n) throws ValueException { 126 if (precision > 0 && scale >= 0) { 127 long lim = (long)(Math.pow(10, precision-scale)) - 1; 128 if (n > lim || n < (0-lim)) { 129 throw new ValueException("Can't convert to type: " + this); 130 } 131 } 132 BigDecimal d = 133 BigDecimal.valueOf(n).setScale((scale < 0 ? 0 : scale), 134 BigDecimal.ROUND_HALF_DOWN); 135 return new ValueScaledInteger(d); 136 } 137 138 public String getCreateParams() { 139 return "precision, scale"; 140 } 141 } 142 | Popular Tags |