From: James Ahlborn Date: Tue, 5 Jun 2007 02:21:55 +0000 (+0000) Subject: handle reading/writing numeric values which thing that they are fixed length fields... X-Git-Tag: rel_1_1_9~14 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b0bc33f822e48f5973fd9f41cc123343ff5a8d02;p=jackcess.git handle reading/writing numeric values which thing that they are fixed length fields (fix #1672071) git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@148 f203690c-595d-4dc9-a70b-905162fa7fd2 --- diff --git a/src/java/com/healthmarketscience/jackcess/Column.java b/src/java/com/healthmarketscience/jackcess/Column.java index 033e933..b9dc208 100644 --- a/src/java/com/healthmarketscience/jackcess/Column.java +++ b/src/java/com/healthmarketscience/jackcess/Column.java @@ -924,6 +924,11 @@ public class Column implements Comparable { 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()); } diff --git a/src/java/com/healthmarketscience/jackcess/DataType.java b/src/java/com/healthmarketscience/jackcess/DataType.java index a19f374..eac9bd8 100644 --- a/src/java/com/healthmarketscience/jackcess/DataType.java +++ b/src/java/com/healthmarketscience/jackcess/DataType.java @@ -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 index 0000000..e329181 Binary files /dev/null and b/test/data/fixedNumericTest.mdb differ diff --git a/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java b/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java index 449424d..7524133 100644 --- a/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java @@ -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 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 columns = open().getTable("Table2").getColumns();