]> source.dussan.org Git - jackcess.git/commitdiff
increase max size of memo/ole columns
authorJames Ahlborn <jtahlborn@yahoo.com>
Mon, 14 Mar 2011 02:53:11 +0000 (02:53 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Mon, 14 Mar 2011 02:53:11 +0000 (02:53 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@526 f203690c-595d-4dc9-a70b-905162fa7fd2

src/java/com/healthmarketscience/jackcess/Column.java
src/java/com/healthmarketscience/jackcess/DataType.java

index f578f762e7ebd1ac95e3a02d94a9090a48cbdeff..e4b7ecdb96744145f4511aa8a04737abc5b478e7 100644 (file)
@@ -107,6 +107,11 @@ public class Column implements Comparable<Column> {
    * multiple other pages
    */
   private static final byte LONG_VALUE_TYPE_OTHER_PAGES = (byte) 0x00;
+  /**
+   * Mask to apply the long length in order to get the flag bits (only the
+   * first 2 bits are type flags).
+   */
+  private static final int LONG_VALUE_TYPE_MASK = 0xC0000000;
 
   /** mask for the fixed len bit */
   public static final byte FIXED_LEN_FLAG_MASK = (byte)0x01;
@@ -117,9 +122,13 @@ public class Column implements Comparable<Column> {
   /** mask for the auto number guid bit */
   public static final byte AUTO_NUMBER_GUID_FLAG_MASK = (byte)0x40;
   
-  /** mask for the unknown bit */
+  /** mask for the unknown bit (possible "can be null"?) */
   public static final byte UNKNOWN_FLAG_MASK = (byte)0x02;
 
+  // some other flags?
+  // 0x10: replication related field (or hidden?)
+  // 0x80: hyperlink (some memo based thing)
+
   /** the "general" text sort order */
   public static final short GENERAL_SORT_ORDER = 1033;
 
@@ -548,14 +557,11 @@ public class Column implements Comparable<Column> {
   {
     ByteBuffer def = ByteBuffer.wrap(lvalDefinition)
       .order(PageChannel.DEFAULT_BYTE_ORDER);
-    int length = ByteUtil.get3ByteInt(def);
-    // bail out gracefully here as we don't understand the format
-    if (length < 0)
-    {
-       return null;
-    }
+    int lengthWithFlags = def.getInt();
+    int length = lengthWithFlags & (~LONG_VALUE_TYPE_MASK);
+
     byte[] rtn = new byte[length];
-    byte type = def.get();
+    byte type = (byte)((lengthWithFlags & LONG_VALUE_TYPE_MASK) >>> 24);
 
     if(type == LONG_VALUE_TYPE_THIS_PAGE) {
 
@@ -932,8 +938,9 @@ public class Column implements Comparable<Column> {
     }
 
     ByteBuffer def = getPageChannel().createBuffer(lvalDefLen);
-    ByteUtil.put3ByteInt(def, value.length);
-    def.put(type);
+    // take length and apply type to first byte
+    int lengthWithFlags = value.length | (type << 24);
+    def.putInt(lengthWithFlags);
 
     if(type == LONG_VALUE_TYPE_THIS_PAGE) {
       // write long value inline
index 56330d97f915443917a133f9474140f3191d5b57..079c1e75e61cb28fd2f6d527399dfdae9effc4ae 100644 (file)
@@ -112,14 +112,14 @@ public enum DataType {
    * Accepts a {@code byte[]}, or {@code null}.  Equivalent to SQL
    * {@link Types#LONGVARBINARY}, {@link Types#BLOB}.
    */
-  OLE((byte) 0x0B, Types.LONGVARBINARY, null, true, true, 0, null, 0xFFFFFF,
+  OLE((byte) 0x0B, Types.LONGVARBINARY, null, true, true, 0, null, 0x3FFFFFFF,
       1),
   /**
    * Corresponds to a java String of max length 8388607 chars.  Accepts any
    * CharSequence, any Object converted to a String , or {@code null}.
    * Equivalent to SQL {@link Types#LONGVARCHAR}, {@link Types#CLOB}.
    */
-  MEMO((byte) 0x0C, Types.LONGVARCHAR, null, true, true, 0, null, 0xFFFFFF,
+  MEMO((byte) 0x0C, Types.LONGVARCHAR, null, true, true, 0, null, 0x3FFFFFFF,
        JetFormat.TEXT_FIELD_UNIT_SIZE),
   /**
    * Unknown data.  Handled like BINARY.