]> source.dussan.org Git - jackcess.git/commitdiff
add initial support for NUMERIC type
authorJames Ahlborn <jtahlborn@yahoo.com>
Sat, 21 Jan 2006 05:33:12 +0000 (05:33 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Sat, 21 Jan 2006 05:33:12 +0000 (05:33 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@31 f203690c-595d-4dc9-a70b-905162fa7fd2

src/java/com/healthmarketscience/jackcess/Column.java
src/java/com/healthmarketscience/jackcess/DataType.java

index 234544cd0f5f627012c91413dcb5ba693681501a..a6c1519d63d5a31289c9ad6ef2e40fb0ac36b33c 100644 (file)
@@ -28,6 +28,8 @@ King of Prussia, PA 19406
 package com.healthmarketscience.jackcess;
 
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.CharBuffer;
@@ -41,7 +43,6 @@ import java.util.TimeZone;
 import com.healthmarketscience.jackcess.scsu.EndOfInputException;
 import com.healthmarketscience.jackcess.scsu.Expand;
 import com.healthmarketscience.jackcess.scsu.IllegalInputException;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -283,8 +284,31 @@ public class Column implements Comparable<Column> {
         return null;
       }
     } else if (_type == DataType.NUMERIC) {
-      //XXX
-      return null;
+
+      boolean negate = (buffer.get() != 0);
+
+      byte[] tmpArr = new byte[16];
+      buffer.get(tmpArr);
+
+      if(order != ByteOrder.BIG_ENDIAN) {
+        // fix endianness of each 4 byte segment
+        for(int i = 0; i < 4; ++i) {
+          int idx = i * 4;
+          byte b = tmpArr[idx + 0];
+          tmpArr[idx + 0] = tmpArr[idx + 3];
+          tmpArr[idx + 3] = b;
+          b = tmpArr[idx + 1];
+          tmpArr[idx + 1] = tmpArr[idx + 2];
+          tmpArr[idx + 2] = b;
+        }
+      }
+
+      BigInteger intVal = new BigInteger(tmpArr);
+      if(negate) {
+        intVal = intVal.negate();
+      }
+      return new BigDecimal(intVal, getScale());
+      
     } else if (_type == DataType.UNKNOWN_0D || _type == DataType.GUID) {
       return null;
     } else {
@@ -296,6 +320,7 @@ public class Column implements Comparable<Column> {
    * @param lvalDefinition Column value that points to an LVAL record
    * @return The LVAL data
    */
+  @SuppressWarnings("fallthrough")
   private byte[] getLongValue(byte[] lvalDefinition) throws IOException {
     ByteBuffer def = ByteBuffer.wrap(lvalDefinition);
     def.order(ByteOrder.LITTLE_ENDIAN);
@@ -486,7 +511,7 @@ public class Column implements Comparable<Column> {
     } else if (_type == DataType.MEMO) {
       return _format.SIZE_LONG_VALUE_DEF;
     } else if (_type == DataType.NUMERIC) {
-      throw new IllegalArgumentException("FIX ME");
+      return 17;
     } else if (_type == DataType.UNKNOWN_0D || _type == DataType.GUID) {
       throw new IllegalArgumentException("FIX ME");
     } else {
index e7747c640a490091b7af57321eb07b81a9aef147..44ad18df68bbc8fc21bcad4d40bb70af55fcdf62 100644 (file)
@@ -52,7 +52,7 @@ public enum DataType {
   MEMO((byte) 0x0C, Types.LONGVARCHAR, 12),
   UNKNOWN_0D((byte) 0x0D),
   GUID((byte) 0x0F),
-  NUMERIC((byte) 0x10);
+  NUMERIC((byte) 0x10, Types.NUMERIC, 17);
 
   /** Map of SQL types to Access data types */
   private static Map<Integer, DataType> SQL_TYPES = new HashMap<Integer, DataType>();