git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1375 f203690c-595d-4dc9-a70b-905162fa7fd2tags/jackcess-4.0.2
@@ -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. |
@@ -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_ |
@@ -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); |
@@ -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 |
@@ -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_ |
@@ -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) { |