]> source.dussan.org Git - jackcess.git/commitdiff
Add basic support for access 2019+ dbs.
authorJames Ahlborn <jtahlborn@yahoo.com>
Fri, 4 Jun 2021 22:32:31 +0000 (22:32 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Fri, 4 Jun 2021 22:32:31 +0000 (22:32 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1364 f203690c-595d-4dc9-a70b-905162fa7fd2

src/changes/changes.xml
src/main/java/com/healthmarketscience/jackcess/Database.java
src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
src/main/java/com/healthmarketscience/jackcess/impl/JetFormat.java
src/main/resources/com/healthmarketscience/jackcess/empty2019.accdb [new file with mode: 0755]
src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java

index 7fbba3efe23282cb3dae36173bfc96a171cd4583..e263ce48c8355e15370ec42929d1af8dc05b59dd 100644 (file)
@@ -8,6 +8,9 @@
       <action dev="jahlborn" type="fix">
         Ignore trailing spaces when creating text index entries.
       </action>
+      <action dev="jahlborn" type="update">
+        Add basic support for access 2019+ dbs.
+      </action>
     </release>
     <release version="4.0.0" date="2021-01-20">
       <action dev="jahlborn" type="update">
index 7e9dd85ec08623e056b46b6e78f5fe3a77769b35..7b93c5e44f03945143517d691968a62d0f1ea22f 100644 (file)
@@ -164,6 +164,8 @@ public interface Database extends Iterable<Table>, Closeable, Flushable
     V2010(".accdb"),
     /** A database which was created by MS Access 2016+ */
     V2016(".accdb"),
+    /** A database which was created by MS Access 2019+ (Office 365) */
+    V2019(".accdb"),
     /** A database which was created by MS Money */
     MSISAM(".mny");
 
index 1ff129e68e7000d5887d76379e63768986fcc0f6..7af0b87c0384f66624187bd3f9c3818d74343e6f 100644 (file)
@@ -123,6 +123,7 @@ public class DatabaseImpl implements Database, DateTimeContext
     addFileFormatDetails(FileFormat.V2007, "empty2007", JetFormat.VERSION_12);
     addFileFormatDetails(FileFormat.V2010, "empty2010", JetFormat.VERSION_14);
     addFileFormatDetails(FileFormat.V2016, "empty2016", JetFormat.VERSION_16);
+    addFileFormatDetails(FileFormat.V2019, "empty2019", JetFormat.VERSION_17);
     addFileFormatDetails(FileFormat.MSISAM, null, JetFormat.VERSION_MSISAM);
   }
 
@@ -189,7 +190,7 @@ public class DatabaseImpl implements Database, DateTimeContext
   private static final int DB_PARENT_ID = 0xF000000;
 
   /** the maximum size of any of the included "empty db" resources */
-  private static final long MAX_EMPTYDB_SIZE = 370000L;
+  private static final long MAX_EMPTYDB_SIZE = 440000L;
 
   /** this object is a "system" object */
   static final int SYSTEM_OBJECT_FLAG = 0x80000000;
index 8a3aa64a369f2aee38b0a82f0d3a85c20a725963..ff3c00f36be848a99b39a128409404624427e51d 100644 (file)
@@ -59,8 +59,10 @@ public abstract class JetFormat {
   private static final byte CODE_VERSION_12 = 0x2;
   /** Version code for Jet version 14.0 */
   private static final byte CODE_VERSION_14 = 0x3;
-  /** Version code for Jet version 16.7 */
+  /** Version code for Jet version 16.0 */
   private static final byte CODE_VERSION_16 = 0x5;
+  /** Version code for Jet version 17.0 */
+  private static final byte CODE_VERSION_17 = 0x6;
 
   /** location of the engine name in the header */
   public static final int OFFSET_ENGINE_NAME = 0x4;
@@ -127,6 +129,9 @@ public abstract class JetFormat {
     private static final Map<String,Database.FileFormat> POSSIBLE_VERSION_16 =
       Collections.singletonMap((String)null, Database.FileFormat.V2016);
 
+    private static final Map<String,Database.FileFormat> POSSIBLE_VERSION_17 =
+      Collections.singletonMap((String)null, Database.FileFormat.V2019);
+
     private static final Map<String,Database.FileFormat> POSSIBLE_VERSION_MSISAM =
       Collections.singletonMap((String)null, Database.FileFormat.MSISAM);
 
@@ -160,8 +165,10 @@ public abstract class JetFormat {
   public static final JetFormat VERSION_12 = new Jet12Format();
   /** the JetFormat constants for the Jet database version "14.0" */
   public static final JetFormat VERSION_14 = new Jet14Format();
-  /** the JetFormat constants for the Jet database version "16.7" */
+  /** the JetFormat constants for the Jet database version "16.0" */
   public static final JetFormat VERSION_16 = new Jet16Format();
+  /** the JetFormat constants for the Jet database version "17.0" */
+  public static final JetFormat VERSION_17 = new Jet17Format();
 
   //These constants are populated by this class's constructor.  They can't be
   //populated by the subclass's constructor because they are final, and Java
@@ -306,6 +313,8 @@ public abstract class JetFormat {
       return VERSION_14;
     } else if (version == CODE_VERSION_16) {
       return VERSION_16;
+    } else if (version == CODE_VERSION_17) {
+      return VERSION_17;
     }
     throw new IOException("Unsupported " +
                           ((version < CODE_VERSION_3) ? "older" : "newer") +
@@ -1093,12 +1102,16 @@ public abstract class JetFormat {
     }
   }
 
-  private static final class Jet16Format extends Jet14Format {
+  private static class Jet16Format extends Jet14Format {
 
     private Jet16Format() {
       super("VERSION_16");
     }
 
+    private Jet16Format(String name) {
+      super(name);
+    }
+
     @Override
     public boolean isSupportedDataType(DataType type) {
       return true;
@@ -1115,4 +1128,21 @@ public abstract class JetFormat {
     }
   }
 
+  private static final class Jet17Format extends Jet16Format {
+
+    private Jet17Format() {
+      super("VERSION_17");
+    }
+
+    @Override
+    public boolean isSupportedDataType(DataType type) {
+      return true;
+    }
+
+    @Override
+    protected Map<String,Database.FileFormat> getPossibleFileFormats() {
+      return PossibleFileFormats.POSSIBLE_VERSION_17;
+    }
+  }
+
 }
diff --git a/src/main/resources/com/healthmarketscience/jackcess/empty2019.accdb b/src/main/resources/com/healthmarketscience/jackcess/empty2019.accdb
new file mode 100755 (executable)
index 0000000..e1bdbed
Binary files /dev/null and b/src/main/resources/com/healthmarketscience/jackcess/empty2019.accdb differ
index d127f9fa01817b9fadefb92b042dc2b6461d5efc..aa90a417db83363c19d8e3191401f4500c8adb03 100644 (file)
@@ -773,6 +773,13 @@ public class DatabaseTest extends TestCase
           sysTables.add("f_12D7448B56564D8AAE333BCC9B3718E5_Data");
           sysTables.add("MSysResources");
         }
+        if(fileFormat.ordinal() >= FileFormat.V2019.ordinal()) {
+          sysTables.remove("f_12D7448B56564D8AAE333BCC9B3718E5_Data");
+          sysTables.add("f_8FA5340F56044616AE380F64A2FEC135_Data");
+          sysTables.add("MSysWSDPCacheComplexColumnMapping");
+          sysTables.add("MSysWSDPChangeTokenMapping");
+          sysTables.add("MSysWSDPRelationshipMapping");
+        }
       }
 
       assertEquals(sysTables, db.getSystemTableNames());