]> source.dussan.org Git - jackcess.git/commitdiff
handle reading/writing numeric values which thing that they are fixed length fields...
authorJames Ahlborn <jtahlborn@yahoo.com>
Tue, 5 Jun 2007 02:21:55 +0000 (02:21 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Tue, 5 Jun 2007 02:21:55 +0000 (02:21 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@148 f203690c-595d-4dc9-a70b-905162fa7fd2

src/java/com/healthmarketscience/jackcess/Column.java
src/java/com/healthmarketscience/jackcess/DataType.java
test/data/fixedNumericTest.mdb [new file with mode: 0644]
test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java

index 033e93342ad891840a3cd0f513c0030d610a5210..b9dc208c9d6cb7dbd2452a8f4a065dd9e7ef6996 100644 (file)
@@ -924,6 +924,11 @@ public class Column implements Comparable<Column> {
     case GUID:
       writeGUIDValue(buffer, obj);
       break;
+    case NUMERIC:
+      // yes, that's right, occasionally numeric values are written as fixed
+      // length...
+      writeNumericValue(buffer, obj);
+      break;
     default:
       throw new IOException("Unsupported data type: " + getType());
     }
index a19f374c71b706bdbd9acc0358c8d9bfec766115..eac9bd85d56c06b193a4d32fba77329f6ca0c8f3 100644 (file)
@@ -58,7 +58,7 @@ public enum DataType {
   UNKNOWN_0D((byte) 0x0D),
   GUID((byte) 0x0F, null, 16),
   // for some reason numeric is "var len" even though it has a fixed size...
-  NUMERIC((byte) 0x10, Types.NUMERIC, null, true, false, 17, 17, 17,
+  NUMERIC((byte) 0x10, Types.NUMERIC, 17, true, false, 17, 17, 17,
           true, 0, 0, 28, 1, 18, 28, 1);
 
   /** Map of SQL types to Access data types */
diff --git a/test/data/fixedNumericTest.mdb b/test/data/fixedNumericTest.mdb
new file mode 100644 (file)
index 0000000..e329181
Binary files /dev/null and b/test/data/fixedNumericTest.mdb differ
index 449424d0c36ccbe0cce06cf46d27afaddd714b1a..75241335452ab5ba7cfa1af491c7cf7c13ca124c 100644 (file)
@@ -478,6 +478,7 @@ public class DatabaseTest extends TestCase {
     col.setScale((byte)4);
     col.setPrecision((byte)8);
     columns.add(col);
+    assertTrue(col.isVariableLength());
     
     col = new Column();
     col.setName("B");
@@ -523,6 +524,57 @@ public class DatabaseTest extends TestCase {
     }
   }
 
+  public void testFixedNumeric() throws Exception
+  {
+    File srcFile = new File("test/data/fixedNumericTest.mdb");
+    File dbFile = File.createTempFile("databaseTest", ".mdb");
+    dbFile.deleteOnExit();
+    copyFile(srcFile, dbFile);
+    
+    Database db = Database.open(dbFile);
+    Table t = db.getTable("test");
+
+    boolean first = true;
+    for(Column col : t.getColumns()) {
+      if(first) {
+        assertTrue(col.isVariableLength());
+        assertEquals(DataType.MEMO, col.getType());
+        first = false;
+      } else {
+        assertFalse(col.isVariableLength());
+        assertEquals(DataType.NUMERIC, col.getType());
+      }
+    }
+      
+    Map<String, Object> row = t.getNextRow();
+    assertEquals("some data", row.get("col1"));
+    assertEquals(new BigDecimal("1"), row.get("col2"));
+    assertEquals(new BigDecimal("0"), row.get("col3"));
+    assertEquals(new BigDecimal("0"), row.get("col4"));
+    assertEquals(new BigDecimal("4"), row.get("col5"));
+    assertEquals(new BigDecimal("-1"), row.get("col6"));
+    assertEquals(new BigDecimal("1"), row.get("col7"));
+
+    Object[] tmpRow = new Object[]{
+      "foo", new BigDecimal("1"), new BigDecimal(3), new BigDecimal("13"),
+      new BigDecimal("-17"), new BigDecimal("0"), new BigDecimal("8734")};
+    t.addRow(tmpRow);
+    t.reset();
+
+    t.getNextRow();
+    row = t.getNextRow();
+    assertEquals(tmpRow[0], row.get("col1"));
+    assertEquals(tmpRow[1], row.get("col2"));
+    assertEquals(tmpRow[2], row.get("col3"));
+    assertEquals(tmpRow[3], row.get("col4"));
+    assertEquals(tmpRow[4], row.get("col5"));
+    assertEquals(tmpRow[5], row.get("col6"));
+    assertEquals(tmpRow[6], row.get("col7"));
+    
+    db.close();
+
+  }  
+
   public void testMultiPageTableDef() throws Exception
   {
     List<Column> columns = open().getTable("Table2").getColumns();