]> source.dussan.org Git - jackcess.git/commitdiff
fix access compatibility issue with writing small rows, limit data pages to 256 rows...
authorJames Ahlborn <jtahlborn@yahoo.com>
Wed, 16 Apr 2008 17:25:17 +0000 (17:25 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Wed, 16 Apr 2008 17:25:17 +0000 (17:25 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@329 f203690c-595d-4dc9-a70b-905162fa7fd2

src/changes/changes.xml
src/java/com/healthmarketscience/jackcess/JetFormat.java
src/java/com/healthmarketscience/jackcess/Table.java

index c4ee4c8cfa2506408aecd5af332c87c602a5e086..4fee05f6251782228724ddb8f483bf59d0567daf 100644 (file)
@@ -10,6 +10,9 @@
         Need to store auto-number values back into row so that indexes can be
         updated correctly.
       </action>
+      <action dev="jahlborn" type="fix" issue="1942330">
+        Access seems to limit data pages to a max of 256 rows.
+      </action>
     </release>
     <release version="1.1.13" date="2008-03-21">
       <action dev="jahlborn" type="fix" issue="1913775">
index 173da9535f0a65f41869dfdb684899a5d1ac7a34..787cad3e8fe598d2f571fe43316876ae71a0ca03 100644 (file)
@@ -92,8 +92,6 @@ public abstract class JetFormat {
   public final int OFFSET_COLUMN_FIXED_DATA_OFFSET;
   
   public final int OFFSET_TABLE_DEF_LOCATION;
-  public final int OFFSET_NUM_ROWS_ON_PAGE;
-  public final int OFFSET_ROW_LOCATION_BLOCK;
   
   public final int OFFSET_ROW_START;
   public final int OFFSET_USAGE_MAP_START;
@@ -104,6 +102,7 @@ public abstract class JetFormat {
   
   public final int OFFSET_FREE_SPACE;
   public final int OFFSET_NUM_ROWS_ON_DATA_PAGE;
+  public final int MAX_NUM_ROWS_ON_DATA_PAGE;
   
   public final int OFFSET_INDEX_COMPRESSED_BYTE_COUNT;
   public final int OFFSET_INDEX_ENTRY_MASK;
@@ -178,8 +177,6 @@ public abstract class JetFormat {
     OFFSET_COLUMN_FIXED_DATA_OFFSET = defineOffsetColumnFixedDataOffset();
     
     OFFSET_TABLE_DEF_LOCATION = defineOffsetTableDefLocation();
-    OFFSET_NUM_ROWS_ON_PAGE = defineOffsetNumRowsOnPage();
-    OFFSET_ROW_LOCATION_BLOCK = defineOffsetRowLocationBlock();
     
     OFFSET_ROW_START = defineOffsetRowStart();
     OFFSET_USAGE_MAP_START = defineOffsetUsageMapStart();
@@ -190,6 +187,7 @@ public abstract class JetFormat {
     
     OFFSET_FREE_SPACE = defineOffsetFreeSpace();
     OFFSET_NUM_ROWS_ON_DATA_PAGE = defineOffsetNumRowsOnDataPage();
+    MAX_NUM_ROWS_ON_DATA_PAGE = defineMaxNumRowsOnDataPage();
     
     OFFSET_INDEX_COMPRESSED_BYTE_COUNT = defineOffsetIndexCompressedByteCount();
     OFFSET_INDEX_ENTRY_MASK = defineOffsetIndexEntryMask();
@@ -243,8 +241,6 @@ public abstract class JetFormat {
   protected abstract int defineOffsetColumnFixedDataOffset();
   
   protected abstract int defineOffsetTableDefLocation();
-  protected abstract int defineOffsetNumRowsOnPage();
-  protected abstract int defineOffsetRowLocationBlock();
   
   protected abstract int defineOffsetRowStart();
   protected abstract int defineOffsetUsageMapStart();
@@ -255,6 +251,7 @@ public abstract class JetFormat {
   
   protected abstract int defineOffsetFreeSpace();
   protected abstract int defineOffsetNumRowsOnDataPage();
+  protected abstract int defineMaxNumRowsOnDataPage();
   
   protected abstract int defineOffsetIndexCompressedByteCount();
   protected abstract int defineOffsetIndexEntryMask();
@@ -347,10 +344,6 @@ public abstract class JetFormat {
   
     @Override
     protected int defineOffsetTableDefLocation() { return 4; }
-    @Override
-    protected int defineOffsetNumRowsOnPage() { return 12; }
-    @Override
-    protected int defineOffsetRowLocationBlock() { return 16; }
     
     @Override
     protected int defineOffsetRowStart() { return 14; }
@@ -367,6 +360,8 @@ public abstract class JetFormat {
     protected int defineOffsetFreeSpace() { return 2; }
     @Override
     protected int defineOffsetNumRowsOnDataPage() { return 12; }
+    @Override
+    protected int defineMaxNumRowsOnDataPage() { return 256; }
     
     @Override
     protected int defineOffsetIndexCompressedByteCount() { return 24; }
index 5600d06db9063373c9b2786f78534a9b1ebe4fbe..ad6d9ad82d3f3b3c447aafa79327f5fea00bbcd3 100644 (file)
@@ -1220,7 +1220,9 @@ public class Table
       int rowSize = rowData[i].remaining();
       int rowSpaceUsage = getRowSpaceUsage(rowSize, getFormat());
       short freeSpaceInPage = dataPage.getShort(getFormat().OFFSET_FREE_SPACE);
-      if (freeSpaceInPage < rowSpaceUsage) {
+      int rowsOnPage = getRowsOnDataPage(dataPage, getFormat());
+      if((freeSpaceInPage < rowSpaceUsage) ||
+         (rowsOnPage >= getFormat().MAX_NUM_ROWS_ON_DATA_PAGE)) {
 
         // Last data page is full.  Create a new one.
         writeDataPage(dataPage, pageNumber);
@@ -1292,7 +1294,7 @@ public class Table
                                               getFormat())); //Free space in this page
     dataPage.putInt(_tableDefPageNumber); //Page pointer to table definition
     dataPage.putInt(0); //Unknown
-    dataPage.putInt(0); //Number of records on this page
+    dataPage.putShort((short)0); //Number of rows on this page
     int pageNumber = _addRowBufferH.getPageNumber();
     getPageChannel().writePage(dataPage, pageNumber);
     _ownedPages.addPageNumber(pageNumber);