]> source.dussan.org Git - jackcess.git/commitdiff
begin adding umap support
authorJames Ahlborn <jtahlborn@yahoo.com>
Fri, 29 Apr 2016 01:47:00 +0000 (01:47 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Fri, 29 Apr 2016 01:47:00 +0000 (01:47 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/mutateops@984 f203690c-595d-4dc9-a70b-905162fa7fd2

src/main/java/com/healthmarketscience/jackcess/impl/ColumnImpl.java
src/main/java/com/healthmarketscience/jackcess/impl/IndexData.java
src/main/java/com/healthmarketscience/jackcess/impl/LongValueColumnImpl.java
src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java

index 24c53adb0e94907a5e16f3952884598023443ec5..596bc357c52bd585265e2ff1d5ab8d1d0225039e 100644 (file)
@@ -33,6 +33,7 @@ import java.sql.Blob;
 import java.sql.Clob;
 import java.sql.SQLException;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -309,13 +310,17 @@ public class ColumnImpl implements Column, Comparable<ColumnImpl> {
     return new ColumnImpl(args);
   }
 
-   /**
+  /**
    * Sets the usage maps for this column.
    */
   void setUsageMaps(UsageMap ownedPages, UsageMap freeSpacePages) {
     // base does nothing
   }
 
+  void collectUsageMapPages(Collection<Integer> pages) {
+    // base does nothing
+  }
+    
   /**
    * Secondary column initialization after the table is fully loaded.
    */
index 3cff2e7c3ef01466ac5be2ea1315a487a08f001f..e5e6dc78d9b3faa73fffcee034105860db05293c 100644 (file)
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -372,6 +373,10 @@ public class IndexData {
     _ownedPages.addPageNumber(pageNumber);
   }
 
+  void collectUsageMapPages(Collection<Integer> pages) {
+    pages.add(_ownedPages.getTablePageNumber());
+  }
+  
   /**
    * Used by unit tests to validate the internal status of the index.
    * @usage _advanced_method_
index a42da5453979bc2e694f46e27b255db78be020d8..b33c84a58f3d832cec45b03543e189ffea0125fd 100644 (file)
@@ -17,8 +17,10 @@ limitations under the License.
 package com.healthmarketscience.jackcess.impl;
 
 import java.io.IOException;
+import java.lang.reflect.Type;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.util.Collection;
 
 
 /**
@@ -69,6 +71,10 @@ class LongValueColumnImpl extends ColumnImpl
     _lvalBufferH = new UmapLongValueBufferHolder(ownedPages, freeSpacePages);
   }
 
+  void collectUsageMapPages(Collection<Integer> pages) {
+    // FIXME, writeme
+  }
+  
   @Override
   void postTableLoadInit() throws IOException {
     if(_lvalBufferH == null) {
index fd55628bf7be61b0c1881740946c563c7bbf64ea..4d27ed72e09a2611963927e1dd51cbaf90b5457c 100644 (file)
@@ -22,12 +22,14 @@ import java.io.StringWriter;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -1275,6 +1277,41 @@ public class TableImpl implements Table
     return tableBuffer;
   }
 
+  private Map.Entry<Integer,Integer> addUsageMaps(int numMaps)
+  {
+    JetFormat format = getFormat();
+    int umapRowLength = format.OFFSET_USAGE_MAP_START +
+      format.USAGE_MAP_TABLE_BYTE_LENGTH;
+    int totalUmapSpaceUsage = getRowSpaceUsage(umapRowLength, format) * numMaps;
+    int umapPageNumber = PageChannel.INVALID_PAGE_NUMBER;
+    int firstRowNum = -1;
+    ByteBuffer umapBuf = null;
+    int freeSpace = 0;
+    int rowStart = 0;
+    int umapRowNum = 0;
+
+    // search currently known usage map buffers to find one with enough free
+    // space (the numMaps should always be small enough to put them all on one
+    // page)
+    Set<Integer> knownPages = new HashSet<Integer>();
+    collectUsageMapPages(knownPages);
+    // FIXME
+
+    
+    
+    return new AbstractMap.SimpleImmutableEntry<Integer,Integer>(
+        umapPageNumber, firstRowNum);
+  }
+
+  void collectUsageMapPages(Collection<Integer> pages) {
+    pages.add(_ownedPages.getTablePageNumber());
+    pages.add(_freeSpacePages.getTablePageNumber());
+
+    for(IndexData idx : _indexDatas) {
+      idx.collectUsageMapPages(pages);
+    }
+  }    
+  
   /**
    * @param buffer Buffer to write to
    */