Browse Source

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
tags/jackcess-1.2.4
James Ahlborn 13 years ago
parent
commit
36003393bd
2 changed files with 39 additions and 28 deletions
  1. 4
    0
      src/changes/changes.xml
  2. 35
    28
      src/java/com/healthmarketscience/jackcess/Table.java

+ 4
- 0
src/changes/changes.xml View File

Add support for Access 2010, including new "General" sort order Add support for Access 2010, including new "General" sort order
(support for long text index entries still needs work). (support for long text index entries still needs work).
</action> </action>
<action dev="jahlborn" type="fix" issue="3287626">
Access expects a row to be at least big enough to hold all fixed
values, even if they are null.
</action>
</release> </release>
<release version="1.2.3" date="2011-03-05"> <release version="1.2.3" date="2011-03-05">
<action dev="jahlborn" type="fix" issue="3181334"> <action dev="jahlborn" type="fix" issue="3181334">

+ 35
- 28
src/java/com/healthmarketscience/jackcess/Table.java View File

int fixedDataEnd = fixedDataStart; int fixedDataEnd = fixedDataStart;
for (Column col : _columns) { 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 // reposition at end of fixed data

Loading…
Cancel
Save