]> source.dussan.org Git - jackcess.git/commitdiff
Add Table methods to access the creation and last modified dates
authorJames Ahlborn <jtahlborn@yahoo.com>
Wed, 7 Jul 2021 01:27:00 +0000 (01:27 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Wed, 7 Jul 2021 01:27:00 +0000 (01:27 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1375 f203690c-595d-4dc9-a70b-905162fa7fd2

src/changes/changes.xml
src/main/java/com/healthmarketscience/jackcess/Table.java
src/main/java/com/healthmarketscience/jackcess/impl/ColumnImpl.java
src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java
src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java

index 371419451accdb73f9f5aaa487d0329532523f1c..6698a2dd3f0b2175c4ee2f02873850067c941de9 100644 (file)
@@ -4,6 +4,11 @@
     <author email="javajedi@users.sf.net">Tim McCune</author>
   </properties>
   <body>
+    <release version="4.0.2" date="TBD">
+      <action dev="jahlborn" type="update">
+        Add Table methods to access the creation and last modified dates.
+      </action>
+    </release>
     <release version="4.0.1" date="2021-06-21">
       <action dev="jahlborn" type="fix">
         Ignore trailing spaces when creating text index entries.
index 9eb2b1576a29195b8ea660816ea086edeecfe18d..5462e8089b26a522f9eac215a617d78a08970d25 100644 (file)
@@ -17,6 +17,7 @@ limitations under the License.
 package com.healthmarketscience.jackcess;
 
 import java.io.IOException;
+import java.time.LocalDateTime;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -133,6 +134,21 @@ public interface Table extends Iterable<Row>
    */
   public PropertyMap getProperties() throws IOException;
 
+  /**
+   * @return the created date for this table if available
+   * @usage _general_method_
+   */
+  public LocalDateTime getCreatedDate() throws IOException;
+
+  /**
+   * Note: jackcess <i>does not automatically update the modified date of a
+   * Table</i>.
+   *
+   * @return the last updated date for this table if available
+   * @usage _general_method_
+   */
+  public LocalDateTime getUpdatedDate() throws IOException;
+
   /**
    * @return All of the Indexes on this table (unmodifiable List)
    * @usage _intermediate_method_
index 8387258600596c143227ac0a6f513d8c78a0a030..8eec0ea55ceec60c12675e6b174f83d16e445e48 100644 (file)
@@ -1143,7 +1143,7 @@ public class ColumnImpl implements Column, Comparable<ColumnImpl>, DateTimeConte
     return dtc.getDateTimeFactory().toDateDouble(value, dtc);
   }
 
-  private static LocalDateTime toLocalDateTime(
+  static LocalDateTime toLocalDateTime(
       Object value, DateTimeContext dtc) {
     if(value instanceof TemporalAccessor) {
       return temporalToLocalDateTime((TemporalAccessor)value, dtc);
index b3f37688e2b94240634f6c7ac1e5a5cc9866c2aa..80799ef2780712f38444052336756ff6d6d77ebe 100644 (file)
@@ -32,6 +32,7 @@ import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -257,6 +258,10 @@ public class DatabaseImpl implements Database, DateTimeContext
   /** the columns to read when getting object propertyes */
   private static Collection<String> SYSTEM_CATALOG_PROPS_COLUMNS =
     new HashSet<String>(Arrays.asList(CAT_COL_ID, CAT_COL_PROPS));
+  /** the columns to read when grabbing dates */
+  private static Collection<String> SYSTEM_CATALOG_DATE_COLUMNS =
+    new HashSet<String>(Arrays.asList(CAT_COL_ID,
+                                      CAT_COL_DATE_CREATE, CAT_COL_DATE_UPDATE));
 
   /** regex matching characters which are invalid in identifier names */
   private static final Pattern INVALID_IDENTIFIER_CHARS =
@@ -1535,6 +1540,24 @@ public class DatabaseImpl implements Database, DateTimeContext
             objectId, SYSTEM_CATALOG_PROPS_COLUMNS), owner);
   }
 
+  LocalDateTime getCreateDateForObject(int objectId) throws IOException {
+    return getDateForObject(objectId, CAT_COL_DATE_CREATE);
+  }
+
+  LocalDateTime getUpdateDateForObject(int objectId) throws IOException {
+    return getDateForObject(objectId, CAT_COL_DATE_UPDATE);
+  }
+
+  private LocalDateTime getDateForObject(int objectId, String dateCol)
+    throws IOException {
+    Row row = _tableFinder.getObjectRow(objectId, SYSTEM_CATALOG_DATE_COLUMNS);
+    if(row == null) {
+      return null;
+    }
+    Object date = row.get(dateCol);
+    return ((date != null) ? ColumnImpl.toLocalDateTime(date, this) : null);
+  }
+
   private Integer getDbParentId() throws IOException {
     if(_dbParentId == null) {
       // need the parent id of the databases objects
index eafa376868320d60a016813e86bf79ba8e8f00ec..d05f640fd6fc078cc5d27ac598f6fcb3253a8acb 100644 (file)
@@ -22,6 +22,7 @@ import java.io.StringWriter;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import java.time.LocalDateTime;
 import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -476,6 +477,16 @@ public class TableImpl implements Table, PropertyMaps.Owner
     return _props;
   }
 
+  @Override
+  public LocalDateTime getCreatedDate() throws IOException {
+    return getDatabase().getCreateDateForObject(_tableDefPageNumber);
+  }
+
+  @Override
+  public LocalDateTime getUpdatedDate() throws IOException {
+    return getDatabase().getUpdateDateForObject(_tableDefPageNumber);
+  }
+
   /**
    * @return all PropertyMaps for this table (and columns)
    * @usage _advanced_method_
index aa90a417db83363c19d8e3191401f4500c8adb03..5f5a4886560bffd57dfcf7e90147b03b488a1631 100644 (file)
@@ -1090,6 +1090,25 @@ public class DatabaseTest extends TestCase
     }
   }
 
+  public void testTableDates() throws Exception {
+    for (final TestDB testDB : SUPPORTED_DBS_TEST_FOR_READ) {
+      Table table = open(testDB).getTable("Table1");
+      String expectedCreateDate = null;
+      String expectedUpdateDate = null;
+      if(testDB.getExpectedFileFormat() == FileFormat.V1997) {
+        expectedCreateDate = "2010-03-05T14:48:26.420";
+        expectedUpdateDate = "2010-03-05T14:48:26.607";
+      } else {
+        expectedCreateDate = "2004-05-28T17:51:48.701";
+        expectedUpdateDate = "2006-07-24T09:56:19.701";
+      }
+      System.out.println("FOO " + testDB.getExpectedFileFormat() + " " +
+                         table.getCreatedDate() + " " +
+                         table.getUpdatedDate());
+      assertEquals(expectedCreateDate, table.getCreatedDate().toString());
+      assertEquals(expectedUpdateDate, table.getUpdatedDate().toString());
+    }
+  }
   private static void checkRawValue(String expected, Object val)
   {
     if(expected != null) {