Browse Source

add write support for numeric/guid


git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@69 f203690c-595d-4dc9-a70b-905162fa7fd2
tags/rel_1_1_5
James Ahlborn 18 years ago
parent
commit
0bca2b8a4d

+ 7
- 3
src/java/com/healthmarketscience/jackcess/Column.java View File

@@ -79,12 +79,12 @@ public class Column implements Comparable<Column> {
*/
private static final short LONG_VALUE_TYPE_OTHER_PAGES = (short) 0x0;

private static final Pattern GUID_PATTERN = Pattern.compile("\\s*[{]([\\p{XDigit}]{4})-([\\p{XDigit}]{2})-([\\p{XDigit}]{2})-([\\p{XDigit}]{2})-([\\p{XDigit}]{6})[}]\\s*");
private static final Pattern GUID_PATTERN = Pattern.compile("\\s*[{]([\\p{XDigit}]{8})-([\\p{XDigit}]{4})-([\\p{XDigit}]{4})-([\\p{XDigit}]{4})-([\\p{XDigit}]{12})[}]\\s*");

/** default precision value for new numeric columns */
public static final byte DEFAULT_PRECISION = 18;
/** default scale value for new numeric columns */
public static final byte DEFAULT_SCALE = 18;
public static final byte DEFAULT_SCALE = 0;
/** For text columns, whether or not they are compressed */
private boolean _compressedUnicode = false;
@@ -812,8 +812,12 @@ public class Column implements Comparable<Column> {
return BigDecimal.ZERO;
} else if(value instanceof BigDecimal) {
return (BigDecimal)value;
} else {
} else if(value instanceof BigInteger) {
return new BigDecimal((BigInteger)value);
} else if(value instanceof Number) {
return new BigDecimal(((Number)value).doubleValue());
} else {
return new BigDecimal(value.toString());
}
}


+ 7
- 2
src/java/com/healthmarketscience/jackcess/Database.java View File

@@ -409,8 +409,13 @@ public class Database {
buffer.putShort((short) 0);
}
buffer.putShort(columnNumber); //Column Number again
buffer.put((byte) 0x09); //Unknown
buffer.put((byte) 0x04); //Unknown
if(col.getType() == DataType.NUMERIC) {
buffer.put((byte) col.getPrecision()); // numeric precision
buffer.put((byte) col.getScale()); // numeric scale
} else {
buffer.put((byte) 0x00); //unused
buffer.put((byte) 0x00); //unused
}
buffer.putShort((short) 0); //Unknown
if (col.getType().isVariableLength()) { //Variable length
buffer.put((byte) 0x2);

+ 98
- 2
test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java View File

@@ -4,6 +4,7 @@ package com.healthmarketscience.jackcess;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
@@ -242,7 +243,6 @@ public class DatabaseTest extends TestCase {
Table table = open().getTable("Table1");
Map<String, Boolean> foundPKs = new HashMap<String, Boolean>();
for(Index index : table.getIndexes()) {
System.out.println(index);
foundPKs.put(index.getColumns().iterator().next().getName(),
index.isPrimaryKey());
}
@@ -303,7 +303,7 @@ public class DatabaseTest extends TestCase {
Table table = db.getTable("Test");
table.addRow(new BigDecimal("-2341234.03450"));
table.addRow(37L);
table.addRow(new BigDecimal("10000.45"));
table.addRow("10000.45");

table.reset();

@@ -327,6 +327,102 @@ public class DatabaseTest extends TestCase {
}
}

public void testGUID() throws Exception
{
Database db = create();

List<Column> columns = new ArrayList<Column>();
Column col = new Column();
col.setName("A");
col.setType(DataType.GUID);
columns.add(col);
db.createTable("test", columns);

Table table = db.getTable("Test");
table.addRow("{32A59F01-AA34-3E29-453F-4523453CD2E6}");
table.addRow("{32a59f01-aa34-3e29-453f-4523453cd2e6}");
table.addRow("{11111111-1111-1111-1111-111111111111}");
table.addRow("{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}");

table.reset();

List<Object> foundValues = new ArrayList<Object>();
Map<String, Object> row = null;
while((row = table.getNextRow()) != null) {
foundValues.add(row.get("A"));
}

assertEquals(Arrays.asList(
"{32A59F01-AA34-3E29-453F-4523453CD2E6}",
"{32A59F01-AA34-3E29-453F-4523453CD2E6}",
"{11111111-1111-1111-1111-111111111111}",
"{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}"),
foundValues);

try {
table.addRow("3245234");
fail("IOException should have been thrown");
} catch(IOException e) {
// ignored
}
}

public void testNumeric() throws Exception
{
Database db = create();

List<Column> columns = new ArrayList<Column>();
Column col = new Column();
col.setName("A");
col.setType(DataType.NUMERIC);
col.setScale((byte)4);
col.setPrecision((byte)8);
columns.add(col);
col = new Column();
col.setName("B");
col.setType(DataType.NUMERIC);
col.setScale((byte)8);
col.setPrecision((byte)28);
columns.add(col);
db.createTable("test", columns);

Table table = db.getTable("Test");
table.addRow(new BigDecimal("-1234.03450"),
new BigDecimal("23923434453436.36234219"));
table.addRow(37L, 37L);
table.addRow("1000.45", "-3452345321000");

table.reset();

List<Object> foundSmallValues = new ArrayList<Object>();
List<Object> foundBigValues = new ArrayList<Object>();
Map<String, Object> row = null;
while((row = table.getNextRow()) != null) {
foundSmallValues.add(row.get("A"));
foundBigValues.add(row.get("B"));
}

assertEquals(Arrays.asList(
new BigDecimal("-1234.0345"),
new BigDecimal("37.0000"),
new BigDecimal("1000.4500")),
foundSmallValues);
assertEquals(Arrays.asList(
new BigDecimal("23923434453436.36234219"),
new BigDecimal("37.00000000"),
new BigDecimal("-3452345321000.00000000")),
foundBigValues);

try {
table.addRow(new BigDecimal("3245234.234"),
new BigDecimal("3245234.234"));
fail("IOException should have been thrown");
} catch(IOException e) {
// ignored
}
}

private Object[] createTestRow() {
return new Object[] {"Tim", "R", "McCune", 1234, (byte) 0xad, 555.66d,
777.88f, (short) 999, new Date()};

Loading…
Cancel
Save