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">
return;
}
+ if((_autoNumberGenerator != null) &&
+ (_autoNumberGenerator.getType() == _type)) {
+ // keep existing
+ return;
+ }
+
switch(_type) {
case LONG:
_autoNumberGenerator = new LongAutoNumberGenerator();
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);
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;
* 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
public int getColumnFlags() {
return AUTO_NUMBER_FLAG_MASK;
}
+
+ @Override
+ public DataType getType() {
+ return DataType.LONG;
+ }
}
private final class GuidAutoNumberGenerator extends AutoNumberGenerator
public int getColumnFlags() {
return AUTO_NUMBER_GUID_FLAG_MASK;
}
+
+ @Override
+ public DataType getType() {
+ return DataType.GUID;
+ }
}
}
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() {
// 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 {
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
db.close();
}
+
+ public void testFixedText() throws Exception
+ {
+ Database db = openCopy(new File("test/data/fixedTextTest.mdb"));
+
+ Table t = db.getTable("users");
+ Column c = t.getColumn("c_flag_");
+ assertEquals(DataType.TEXT, c.getType());
+ assertEquals(false, c.isVariableLength());
+ assertEquals(2, c.getLength());
+
+ Map<String,Object> row = t.getNextRow();
+ assertEquals("N", row.get("c_flag_"));
+
+ t.addRow(3, "testFixedText", "boo", "foo", "bob", 3, 5, 9, "Y",
+ new Date());
+
+ t.getNextRow();
+ row = t.getNextRow();
+ assertEquals("testFixedText", row.get("c_user_login"));
+ assertEquals("Y", row.get("c_flag_"));
+
+ db.close();
+ }
static Object[] createTestRow(String col1Val) {
return new Object[] {col1Val, "R", "McCune", 1234, (byte) 0xad, 555.66d,