summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/changes/changes.xml6
-rw-r--r--src/java/com/healthmarketscience/jackcess/Column.java36
-rw-r--r--src/java/com/healthmarketscience/jackcess/DataType.java15
-rw-r--r--src/java/com/healthmarketscience/jackcess/Table.java5
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