Changeset 858:0a1635adadb6 in livinglogic.java.ul4

Show
Ignore:
Timestamp:
06/17/13 13:42:19 (6 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Try to narrow BigIntegers? in int() and com.livinglogic.dbutils.Connection.

Location:
src
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • src/main/java/com/livinglogic/dbutils/ResultSetMapIterator.java

    r840 r858  
    1010import static java.sql.Types.TIMESTAMP; 
    1111 
     12import java.math.BigInteger; 
    1213import java.math.BigDecimal; 
    1314import java.sql.Clob; 
     
    8990                        { 
    9091                            if (metaData.getScale(i) <= 0) 
    91                                 value = ((BigDecimal)value).toBigInteger(); 
     92                                value = Utils.narrowBigInteger(((BigDecimal)value).toBigInteger()); 
    9293                        } 
     94                        else if (value instanceof BigInteger) 
     95                            value = Utils.narrowBigInteger((BigInteger)value); 
    9396                    } 
    9497                    record.put(key, value); 
  • src/main/java/com/livinglogic/ul4/FunctionInt.java

    r857 r858  
    5858            } 
    5959        } 
    60         else if (obj instanceof Integer || obj instanceof Byte || obj instanceof Short || obj instanceof Long || obj instanceof BigInteger) 
     60        else if (obj instanceof Integer || obj instanceof Byte || obj instanceof Short || obj instanceof Long) 
    6161            return obj; 
     62        else if (obj instanceof BigInteger) 
     63            return Utils.narrowBigInteger((BigInteger)obj); 
    6264        else if (obj instanceof Boolean) 
    6365            return ((Boolean)obj).booleanValue() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO; 
  • src/main/java/com/livinglogic/ul4/Utils.java

    r844 r858  
    108108            return ((Number)arg).doubleValue(); 
    109109        throw new UnsupportedOperationException("can't convert " + objectType(arg) + " to double!"); 
     110    } 
     111 
     112    private static BigInteger intMinValue = new BigInteger(String.valueOf(Integer.MIN_VALUE)); 
     113    private static BigInteger intMaxValue = new BigInteger(String.valueOf(Integer.MAX_VALUE)); 
     114    private static BigInteger longMinValue = new BigInteger(String.valueOf(Long.MIN_VALUE)); 
     115    private static BigInteger longMaxValue = new BigInteger(String.valueOf(Long.MAX_VALUE)); 
     116 
     117    public static Object narrowBigInteger(BigInteger arg) 
     118    { 
     119        if (intMinValue.compareTo(arg) <= 0 && arg.compareTo(intMinValue) <= 0) 
     120            return arg.intValue(); 
     121        else if (longMinValue.compareTo(arg) <= 0 && arg.compareTo(longMinValue) <= 0) 
     122            return arg.longValue(); 
     123        return arg; 
    110124    } 
    111125 
  • src/main/resources/versiondoc.txt

    r857 r858  
    33Comments: 
    44* int(string) now returns a Long/BigInteger if the value overflows. 
     5* int() and com.livinglogic.dbutils.Connection now try to convert BigIntegers to 
     6  a narrower format (Integer/Long) if possible. 
    57 
    68 
  • src/test/java/tests/UL4Test.java

    r857 r858  
    14221422        checkTemplateOutput("9999999999", "<?print int(data)?>", "data", "9999999999"); 
    14231423        checkTemplateOutput("999999999999999999999999", "<?print int(data)?>", "data", "999999999999999999999999"); 
     1424        checkTemplateOutput("999999999999999999999999", "<?print int(data)?>", "data", new BigInteger("999999999999999999999999")); 
    14241425    } 
    14251426