aboutsummaryrefslogtreecommitdiffstats
path: root/src/java
diff options
context:
space:
mode:
authorJames Ahlborn <jtahlborn@yahoo.com>2011-04-16 18:13:20 +0000
committerJames Ahlborn <jtahlborn@yahoo.com>2011-04-16 18:13:20 +0000
commit36003393bd00e45c195b286f2189ec9533fbc53d (patch)
tree9691bfa76e75a5b1a0f1ec1eedb520bcc2c91933 /src/java
parent955c6654b77ed12de7ee126fad60ee9f294dd8b5 (diff)
downloadjackcess-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.java63
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