diff options
author | James Ahlborn <jtahlborn@yahoo.com> | 2008-07-17 02:46:42 +0000 |
---|---|---|
committer | James Ahlborn <jtahlborn@yahoo.com> | 2008-07-17 02:46:42 +0000 |
commit | 48404ab2d688d5fb9af63166e049a0a5c95800cd (patch) | |
tree | 92bb259913b8018c21bbd681012c93eebda04ede | |
parent | 506b7c28ee353058c8d3fdedba3098c60dfaabb3 (diff) | |
download | jackcess-48404ab2d688d5fb9af63166e049a0a5c95800cd.tar.gz jackcess-48404ab2d688d5fb9af63166e049a0a5c95800cd.zip |
Reserve minimum space for memo/ole fields so that greedy inline row usage does not cause spurious write failures for wide tables.
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@358 f203690c-595d-4dc9-a70b-905162fa7fd2
-rw-r--r-- | src/changes/changes.xml | 6 | ||||
-rw-r--r-- | src/java/com/healthmarketscience/jackcess/Table.java | 12 | ||||
-rw-r--r-- | test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java | 26 |
3 files changed, 43 insertions, 1 deletions
diff --git a/src/changes/changes.xml b/src/changes/changes.xml index e30d7f2..e577cda 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -5,6 +5,12 @@ <author email="jahlborn@users.sf.net">James Ahlborn</author> </properties> <body> + <release version="1.1.16" date="TBD"> + <action dev="jahlborn" type="fix" issue="2019244"> + Reserve minimum space for memo/ole fields so that greedy inline row + usage does not cause spurious write failures for wide tables. + </action> + </release> <release version="1.1.15" date="2008-06-27"> <action dev="jahlborn" type="fix" issue="1998225"> Fix writing of large memo/ole fields. Apparently Access does not like diff --git a/src/java/com/healthmarketscience/jackcess/Table.java b/src/java/com/healthmarketscience/jackcess/Table.java index c4976ba..5007f3d 100644 --- a/src/java/com/healthmarketscience/jackcess/Table.java +++ b/src/java/com/healthmarketscience/jackcess/Table.java @@ -1374,7 +1374,17 @@ public class Table maxRowSize -= buffer.position(); // now, account for trailer space maxRowSize -= (nullMask.byteSize() + 4 + (_maxVarColumnCount * 2)); - + + // for each non-null long value column we need to reserve a small + // amount of space so that we don't end up running out of row space + // later by being too greedy + for (Column varCol : _varColumns) { + if((varCol.getType().isLongValue()) && + (rowArray[varCol.getColumnIndex()] != null)) { + maxRowSize -= getFormat().SIZE_LONG_VALUE_DEF; + } + } + //Now write out variable length column data short[] varColumnOffsets = new short[_maxVarColumnCount]; int varColumnOffsetsIndex = 0; diff --git a/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java b/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java index abdb88b..6102c6c 100644 --- a/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java @@ -380,6 +380,32 @@ public class DatabaseTest extends TestCase { } + public void testManyMemos() throws Exception { + final int numColumns = 126; + Database db = create(); + TableBuilder bigTableBuilder = new TableBuilder("myBigTable"); + + for (int i = 0; i < numColumns; i++) + { + Column column = new ColumnBuilder("column_" + i, DataType.MEMO) + .toColumn(); + bigTableBuilder.addColumn(column); + } + + Table bigTable = bigTableBuilder.toTable(db); + + for (int j = 999; j < 1010; j++) + { + Object[] rowData = new String[numColumns]; + for (int i = 0; i < numColumns; i++) + { + rowData[i] = "v_" + i + ";" + j; + } + bigTable.addRow(rowData); + } + db.close(); + } + public void testMissingFile() throws Exception { File bogusFile = new File("fooby-dooby.mdb"); assertTrue(!bogusFile.exists()); |