]> source.dussan.org Git - jackcess.git/commitdiff
Added ability to delete current row.
authorTim McCune <javajedi@users.sf.net>
Tue, 30 Aug 2005 06:33:27 +0000 (06:33 +0000)
committerTim McCune <javajedi@users.sf.net>
Tue, 30 Aug 2005 06:33:27 +0000 (06:33 +0000)
Fixed bug where adding a new row to a table whose last row had been deleted failed.

git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@29 f203690c-595d-4dc9-a70b-905162fa7fd2

project.xml
src/java/com/healthmarketscience/jackcess/Table.java
src/java/com/healthmarketscience/jackcess/UsageMap.java
test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java

index ed4ba935279bc4acf8408654f9c289ee3879af12..27bbac04ee5e97356c88786aa1b70839232de928 100644 (file)
@@ -3,7 +3,7 @@
   <pomVersion>1</pomVersion>
   <id>jackcess</id>
   <name>Jackcess</name>
-  <currentVersion>1.1.2</currentVersion>
+  <currentVersion>1.1.3</currentVersion>
   <organization>
     <name>Health Market Science, Inc.</name>
     <url>http://www.healthmarketscience.com</url>
index 96b51ca50d8fa9f16c6351b9221e08ff3beacbcd..b0223b63d9665aac917e7f1bb773e1c272b35061 100644 (file)
@@ -139,6 +139,7 @@ public class Table {
   public void reset() {
     _rowsLeftOnPage = 0;
     _ownedPages.reset();
+    _currentRowInPage = 0;
   }
   
   /**
@@ -147,6 +148,19 @@ public class Table {
   public Map<String, Object> getNextRow() throws IOException {
     return getNextRow(null);
   }
+
+  /**
+   * Delete the current row (retrieved by a call to {@link #getNextRow}).
+   */
+  public void deleteCurrentRow() throws IOException {
+    if (_currentRowInPage == 0) {
+      throw new IllegalStateException("Must call getNextRow first");
+    }
+    int index = _format.OFFSET_DATA_ROW_LOCATION_BLOCK + (_currentRowInPage - 1) *
+        _format.SIZE_ROW_LOCATION + 1;
+    _buffer.put(index, (byte) (_buffer.get(index) | 0xc0));
+    _pageChannel.writePage(_buffer, _ownedPages.getCurrentPageNumber());
+  }
   
   /**
    * @param columnNames Only column names in this collection will be returned
@@ -384,6 +398,10 @@ public class Table {
       if (rowCount > 0) {
         rowLocation = dataPage.getShort(_format.OFFSET_DATA_ROW_LOCATION_BLOCK +
             (rowCount - 1) * _format.SIZE_ROW_LOCATION);
+        if (rowLocation < 0) {
+          // Deleted row
+          rowLocation &= ~0xc000;
+        }
       }
       rowLocation -= rowSize;
       dataPage.putShort(_format.OFFSET_DATA_ROW_LOCATION_BLOCK +
index c6ddbc7491fdd8dcfb4078fc30b53b754ca871c3..642470bae6e20b9a5fd348eab1a96cf7f26b0eb9 100644 (file)
@@ -128,7 +128,11 @@ public abstract class UsageMap {
   public List<Integer> getPageNumbers() {
     return _pageNumbers;
   }
-  
+
+  public Integer getCurrentPageNumber() {
+    return _pageNumbers.get(_currentPageIndex - 1);
+  }
+
   protected void setStartOffset(int startOffset) {
     _startOffset = startOffset;
   }
@@ -166,8 +170,8 @@ public abstract class UsageMap {
    */
   public boolean getNextPage(ByteBuffer buffer) throws IOException {
     if (_pageNumbers.size() > _currentPageIndex) {
-      Integer pageNumber = (Integer) _pageNumbers.get(_currentPageIndex++);
-      _pageChannel.readPage(buffer, pageNumber.intValue());
+      Integer pageNumber = _pageNumbers.get(_currentPageIndex++);
+      _pageChannel.readPage(buffer, pageNumber);
       return true;
     } else {
       return false;
index 94ee8269309601281a0e21f38d9478417b57249f..f72b6c65dcc574ed23565386021bff868296bef9 100644 (file)
@@ -103,16 +103,8 @@ public class DatabaseTest extends TestCase {
   public void testWriteAndRead() throws Exception {
     Database db = create();
     createTestTable(db);
-    Object[] row = new Object[9];
-    row[0] = "Tim";
-    row[1] = "R";
-    row[2] = "McCune";
+    Object[] row = createTestRow();
     row[3] = null;
-    row[4] = new Byte((byte) 0xad);
-    row[5] = new Double(555.66d);
-    row[6] = new Float(777.88d);
-    row[7] = new Short((short) 999);
-    row[8] = new Date();
     Table table = db.getTable("Test");
     int count = 1000;
     for (int i = 0; i < count; i++) { 
@@ -136,16 +128,7 @@ public class DatabaseTest extends TestCase {
     createTestTable(db);
     int count = 1000;
     List<Object[]> rows = new ArrayList<Object[]>(count);
-    Object[] row = new Object[9];
-    row[0] = "Tim";
-    row[1] = "R";
-    row[2] = "McCune";
-    row[3] = new Integer(1234);
-    row[4] = new Byte((byte) 0xad);
-    row[5] = new Double(555.66d);
-    row[6] = new Float(777.88d);
-    row[7] = new Short((short) 999);
-    row[8] = new Date();
+    Object[] row = createTestRow();
     for (int i = 0; i < count; i++) {
       rows.add(row);
     }
@@ -163,6 +146,57 @@ public class DatabaseTest extends TestCase {
       assertEquals(row[7], readRow.get("H"));
     }
   }
+
+  public void testDeleteCurrentRow() throws Exception {
+    Database db = create();
+    createTestTable(db);
+    Object[] row = createTestRow();
+    Table table = db.getTable("Test");
+    for (int i = 0; i < 10; i++) {
+      row[3] = i;
+      table.addRow(row);
+    }
+    row[3] = 1974;
+    assertEquals(10, countRows(table));
+    table.reset();
+    table.getNextRow();
+    table.deleteCurrentRow();
+    assertEquals(9, countRows(table));
+    table.reset();
+    table.getNextRow();
+    table.deleteCurrentRow();
+    assertEquals(8, countRows(table));
+    table.reset();
+    for (int i = 0; i < 8; i++) {
+      table.getNextRow();
+    }
+    table.deleteCurrentRow();
+    assertEquals(7, countRows(table));
+    table.addRow(row);
+    assertEquals(8, countRows(table));
+    table.reset();
+    for (int i = 0; i < 3; i++) {
+      table.getNextRow();
+    }
+    table.deleteCurrentRow();
+    assertEquals(7, countRows(table));
+    table.reset();
+    assertEquals(2, table.getNextRow().get("D"));
+  }
+
+  private int countRows(Table table) throws Exception {
+    table.reset();
+    int rtn = 0;
+    while (table.getNextRow() != null) {
+      rtn++;
+    }
+    return rtn;
+  }
+
+  private Object[] createTestRow() {
+    return new Object[] {"Tim", "R", "McCune", 1234, (byte) 0xad, 555.66d,
+        777.88f, (short) 999, new Date()};
+  }
   
   private void createTestTable(Database db) throws Exception {
     List<Column> columns = new ArrayList<Column>();