diff options
author | James Ahlborn <jtahlborn@yahoo.com> | 2011-04-16 18:13:20 +0000 |
---|---|---|
committer | James Ahlborn <jtahlborn@yahoo.com> | 2011-04-16 18:13:20 +0000 |
commit | 36003393bd00e45c195b286f2189ec9533fbc53d (patch) | |
tree | 9691bfa76e75a5b1a0f1ec1eedb520bcc2c91933 /src/java | |
parent | 955c6654b77ed12de7ee126fad60ee9f294dd8b5 (diff) | |
download | jackcess-36003393bd00e45c195b286f2189ec9533fbc53d.tar.gz jackcess-36003393bd00e45c195b286f2189ec9533fbc53d.zip |
Access expects a row to be at least big enough to hold all fixed values, even if they are null. (fixes #3181334)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@553 f203690c-595d-4dc9-a70b-905162fa7fd2
Diffstat (limited to 'src/java')
-rw-r--r-- | src/java/com/healthmarketscience/jackcess/Table.java | 63 |
1 files changed, 35 insertions, 28 deletions
diff --git a/src/java/com/healthmarketscience/jackcess/Table.java b/src/java/com/healthmarketscience/jackcess/Table.java index 77b82d1..8808728 100644 --- a/src/java/com/healthmarketscience/jackcess/Table.java +++ b/src/java/com/healthmarketscience/jackcess/Table.java @@ -1605,45 +1605,52 @@ public class Table int fixedDataEnd = fixedDataStart; for (Column col : _columns) { - if(!col.isVariableLength()) { + if(col.isVariableLength()) { + continue; + } - Object rowValue = rowArray[col.getColumnIndex()]; + Object rowValue = rowArray[col.getColumnIndex()]; - if (col.getType() == DataType.BOOLEAN) { + if (col.getType() == DataType.BOOLEAN) { - if(Column.toBooleanValue(rowValue)) { - //Booleans are stored in the null mask - nullMask.markNotNull(col); - } + if(Column.toBooleanValue(rowValue)) { + //Booleans are stored in the null mask + nullMask.markNotNull(col); + } + rowValue = null; - } else { - - if(col.isAutoNumber() && !isUpdate) { + } else if(col.isAutoNumber() && !isUpdate) { - // ignore given row value, use next autonumber - rowValue = col.getAutoNumberGenerator().getNext(); + // ignore given row value, use next autonumber + rowValue = col.getAutoNumberGenerator().getNext(); - // we need to stick this back in the row so that the indexes get - // updated correctly (and caller can get the generated value) - rowArray[col.getColumnIndex()] = rowValue; - } + // we need to stick this back in the row so that the indexes get + // updated correctly (and caller can get the generated value) + rowArray[col.getColumnIndex()] = rowValue; + } - if(rowValue != null) { + if(rowValue != null) { - // we have a value - nullMask.markNotNull(col); + // we have a value to write + nullMask.markNotNull(col); - //remainingRowLength is ignored when writing fixed length data - buffer.position(fixedDataStart + col.getFixedDataOffset()); - buffer.put(col.write(rowValue, 0)); + // remainingRowLength is ignored when writing fixed length data + buffer.position(fixedDataStart + col.getFixedDataOffset()); + buffer.put(col.write(rowValue, 0)); - // keep track of the end of fixed data - if(buffer.position() > fixedDataEnd) { - fixedDataEnd = buffer.position(); - } - } - } } + + // always insert space for the entire fixed data column length + // (including null values), access expects the row to always be at least + // big enough to hold all fixed values + buffer.position(fixedDataStart + col.getFixedDataOffset() + + col.getLength()); + + // keep track of the end of fixed data + if(buffer.position() > fixedDataEnd) { + fixedDataEnd = buffer.position(); + } + } // reposition at end of fixed data |