diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/changes/changes.xml | 6 | ||||
-rw-r--r-- | src/java/com/healthmarketscience/jackcess/Column.java | 36 | ||||
-rw-r--r-- | src/java/com/healthmarketscience/jackcess/DataType.java | 15 | ||||
-rw-r--r-- | src/java/com/healthmarketscience/jackcess/Table.java | 5 |
4 files changed, 56 insertions, 6 deletions
diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 2be53cf..f22ad4e 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -9,6 +9,12 @@ Add support for updating GUID indexes and for auto-number GUID fields. </action> + <action dev="jahlborn" type="update" issue="2802845"> + Add support for updating rows in a table. + </action> + <action dev="jahlborn" type="fix" issue="2886370"> + Support reading/writing fixed length text fields. + </action> </release> <release version="1.1.19" date="2009-06-13"> <action dev="jahlborn" type="add"> diff --git a/src/java/com/healthmarketscience/jackcess/Column.java b/src/java/com/healthmarketscience/jackcess/Column.java index a41b450..85ebde0 100644 --- a/src/java/com/healthmarketscience/jackcess/Column.java +++ b/src/java/com/healthmarketscience/jackcess/Column.java @@ -345,6 +345,12 @@ public class Column implements Comparable<Column> { return; } + if((_autoNumberGenerator != null) && + (_autoNumberGenerator.getType() == _type)) { + // keep existing + return; + } + switch(_type) { case LONG: _autoNumberGenerator = new LongAutoNumberGenerator(); @@ -1098,7 +1104,7 @@ public class Column implements Comparable<Column> { public ByteBuffer writeFixedLengthField(Object obj, ByteOrder order) throws IOException { - int size = getType().getFixedSize(); + int size = getType().getFixedSize(_columnLength); // create buffer for data ByteBuffer buffer = getPageChannel().createBuffer(size, order); @@ -1132,6 +1138,19 @@ public class Column implements Comparable<Column> { case MONEY: writeCurrencyValue(buffer, obj); break; + case TEXT: + // apparently text numeric values are also occasionally written as fixed + // length... + CharSequence text = toCharSequence(obj); + int numChars = getLengthInUnits(); + if (text.length() != numChars) { + throw new IOException( + "Text is invalid for fixed length column, length " + numChars + + ", got " + text.length()); + } + // force uncompressed encoding for fixed length text + buffer.put(encodeUncompressedText(text, getFormat())); + break; case GUID: writeGUIDValue(buffer, obj, order); break; @@ -1538,6 +1557,11 @@ public class Column implements Comparable<Column> { * Returns the flags used when writing this column. */ public abstract int getColumnFlags(); + + /** + * Returns the type of values generated by this generator. + */ + public abstract DataType getType(); } private final class LongAutoNumberGenerator extends AutoNumberGenerator @@ -1560,6 +1584,11 @@ public class Column implements Comparable<Column> { public int getColumnFlags() { return AUTO_NUMBER_FLAG_MASK; } + + @Override + public DataType getType() { + return DataType.LONG; + } } private final class GuidAutoNumberGenerator extends AutoNumberGenerator @@ -1584,6 +1613,11 @@ public class Column implements Comparable<Column> { public int getColumnFlags() { return AUTO_NUMBER_GUID_FLAG_MASK; } + + @Override + public DataType getType() { + return DataType.GUID; + } } } diff --git a/src/java/com/healthmarketscience/jackcess/DataType.java b/src/java/com/healthmarketscience/jackcess/DataType.java index 0537103..0f5b27a 100644 --- a/src/java/com/healthmarketscience/jackcess/DataType.java +++ b/src/java/com/healthmarketscience/jackcess/DataType.java @@ -287,12 +287,23 @@ public enum DataType { public boolean getHasScalePrecision() { return _hasScalePrecision; } - + public int getFixedSize() { + return getFixedSize(null); + } + + public int getFixedSize(Short colLength) { if(_fixedSize != null) { + if(colLength != null) { + return Math.max(_fixedSize, colLength); + } return _fixedSize; } - throw new IllegalArgumentException("FIX ME"); + if(colLength != null) { + return colLength; + } + throw new IllegalArgumentException("Unexpected fixed length column " + + this); } public int getMinSize() { diff --git a/src/java/com/healthmarketscience/jackcess/Table.java b/src/java/com/healthmarketscience/jackcess/Table.java index a358406..f17fd30 100644 --- a/src/java/com/healthmarketscience/jackcess/Table.java +++ b/src/java/com/healthmarketscience/jackcess/Table.java @@ -486,7 +486,7 @@ public class Table // read fixed length value (non-boolean at this point) int dataStart = rowStart + 2; colDataPos = dataStart + column.getFixedDataOffset(); - colDataLen = column.getType().getFixedSize(); + colDataLen = column.getType().getFixedSize(column.getLength()); } else { @@ -882,8 +882,7 @@ public class Table buffer.putShort((short) 0); } else { buffer.putShort(fixedOffset); - fixedOffset += Math.max(col.getType().getFixedSize(), - col.getLength()); + fixedOffset += col.getType().getFixedSize(col.getLength()); } if(!col.getType().isLongValue()) { buffer.putShort(col.getLength()); //Column length |