aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/changes/changes.xml6
-rw-r--r--src/java/com/healthmarketscience/jackcess/Table.java12
-rw-r--r--test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java26
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());