Release notes
Tim McCune
Make NumberFormatter locale aware, using the currently configured
LocaleContext.
Add option to DatabaseBuilder for ignoring broken system catalog
indexes. This is a workaround to allow jackcess to read tables from
the database even if the index is non-functional.
Update parent pom to fix release process.
Fix edge case which can cause table to be considered corrupt.
Add Table methods to get the creation and last modified dates.
Add support for linked odbc tables. TableMetaData provides access to
connection string and local TableDefinition if available.
Ignore trailing spaces when creating text index entries.
Add basic support for access 2019+ dbs.
Add support for extended date/time type in access 2019+ dbs.
Add Automatic-Module-Name in order to make Jackcess safe to use in the
module path in Java 9+ environments.
Make a few classes and constants public in order to facilitate use in
different packages.
Alter access to java.sql classes so that usage is dependent on whether
or not the module is loaded in Java 9+ environments. Tweak a few
methods to no longer throw SQLException.
Add more static utility methods to DatabaseBuilder to enable more
succinct object construction code using static imports.
Add support for Access 97 general collation order, enabling indexes to
be used with Access 97 dbs.
Add Stream support to all interfaces which are Iterable.
Enabled expression evaluation by default.
Change the default DateTimeType to LOCAL_DATE_TIME.
Add support for Predicate value patterns in cursor find methods. Add
PatternColumnPredicate for creating Predicate instances which can
match values using various pattern syntaxes.
Add ColumnFormatter utility which can apply Column "Format" property
for display of column values.
Add Database.newTableMetaDataIterable() which enables iterating
through table names without loading the entire collection into memory
at once.
Jackcess now requires a Java 8+ runtime. As part of this update, all
dependencies have been updated to their latest versions.
Add support for Java 8 Temporal types. Date/time fields will now
accept as input most Temporal types (e.g. LocalDate, LocalTime,
LocalDateTime, etc). Additionally, date/time fields can optionally be
changed to output LocalDateTime instead of Date. This behavior is
configurable on a per-Database basis by setting the DateTimeType for
the database. All Date based APIs now have a parallel LocalDateTime
API. Note that only one of those will work depending on how
the Database is configured. The legacy Date support will be the
default initially, but is deprecated and may be removed in the future.
Add support for Path. Existing File based APIs now have parallel
versions which utilize Path.
The Apache commons-lang dependency has been replaced with
commons-lang3.
Fix parsing of escaped double quotes in expressions.
Use column label from ResultSetMetaData when importing.
Fix length in units calculation for Access 97 text fields.
Implement the majority of the missing standard functions:
FormatCurrency, FormatDateTime, FormatNumber, FormatPercent, Val,
DateAdd, DateDiff, DatePart, MonthName, WeekdayName, DDB, IPmt, PPmt,
Rate, SLN, SYD, Format, Replace, StrConv. (Note that the internal API
for the expr package has changed in an incompatible way. However,
since the API is still experimental, this was deemed acceptable for a
minor version.). Note that many of the financial functions were
copied and adpated from the Apache POI and UCanAccess projects (which
are both under the Apache License 2.0).
Implement more type coercion methods for expressions. Add support for
hex/oct integer strings. Add support for number strings with commas.
Add support for coercing numeric String to a date/time value. Add
support for date/time values with implicit (current) year.
Ignore column validators for read-only dbs. This will avoid
irrelevant failures when reading databases which have invalid column
properties.
Implement support for optional expression evaluation. When enabled,
expressions will be evaluated for default values, calculated fields,
field validators, and record validators.
Default values will now be respected when expression evaluation is
enabled (currently disabled by default).
Add some additional property keys and relevant enums for values.
Create new usage map correctly when adding an index to an existing
table.
Expose the "ddl" attribute on properties. Set the attribute
appropriately for known builtin properties.
Set ddl flag even if property type is explicitly provided.
Add full support for access 2016 databases including the new "Large
Number" (aka Bigint) data type.
Handle more advanced query join constructs.
Fix writing of property maps without any properties.
Fix parsing of certain internal-use queries (such as those used as the
data source for the fields in a form).
Add option to specify relationship name, thanks to Gord Thompson.
Implement support for partial index lookups. Efficient IndexCursor
lookups can now be done with multi-column indexes using only some of
the columns in the index.
Cover the GENERIC_JET4 format in unit tests, thanks to Gord Thompson.
Allow inserting negative auto number fields, thanks to Gord Thompson.
Add CustomLinkResolver which facilitates loading linked tables from
files which are not access databases.
When opening a database for a format which is read-only, automatically
open the channel as read-only (instead of throwing an exception if
readOnly is false).
Add support for global usage maps which are reference type maps.
Change multi-value complex columns so that they return all relevant
column properties.
Add some initial support for Table metadata modification. Columns and
Indexes can now be added to an existing table (using
ColumnBuilder.addToTable and IndexBuilder.addToTable respectively).
Add the ability to create Relationships using RelationshipBuilder.
With this support finally brings the ability to create foreign key
indexes (aka integrity enforcement in Relationships).
Fix missing column names in AppendQuery SQL strings.
Add Database.getTableMetaData method to enable getting basic info
about a Table (by name) without actually loading it.
Allow null values in foreign key fields when enforcing referential
integrity.
Add support for cascade null on delete relationships.
Add support for the required flag for an index.
Throw a prettier exception when maxing out the row size during row
creation.
Add FileFormat.GENERIC_JET4 in order to support getting the file
format for jet4 databases with no AccessVersion property (e.g. those
created programmatically using ADOX).
Add some utility methods (DatabaseBuilder.createDateFormat and
DatabaseBuilder.toCompatibleCalendar) for handling Dates in an Access
compatible manner.
New site style!
Handle reading null calculated values.
Fix handling of dateTimes before the access epoch.
Load linked table info from system table when reading databases with
unsupported sort orders.
Allow optional direct insert/update of autonumber values. This is
disabled by default, but can be selectively enabled per-jvm (using
system property), per-database, and per-table.
OpenHMS relicenses to Apache License, 2.0!
Make ColumnBuilder.setMaxLength do the right thing regardless of
column type.
Handle input String boolean values.
Added Database.isLinkedTable method to identify if the given Table is
linked to the database.
Added TableIterableBuilder for advanced Table iteration. This allows
selectively including different table types when iterating the tables
in a Database.
Lowered the log level for certain warnings related to system tables
which do not generally affect jackcess functionality.
Added contextual information to many errors and warnings.
Implement support for indexes on BINARY fields.
Remove useless warning for fixed length columns lengths with longer
length. Cleanup some other stuff related to copying existing columns
in ColumnBuilder.
Add newer sql type to access type mappings if the jvm supports them.
Fix table name quoting for append and make table queries.
Don't double quote already quoted identifiers.
Better validation of identifier names (disallow invalid characters
according to Access naming rules).
Unicode compression support was not correct for all possibly
compressed characters.
Currency columns will now return an accurate scale and precision.
IndexCursor can early exit when searching based on indexed values.
Fix regression where empty memo values are returned as null.
Add Cursor.findRow(RowId) for moving to a specific Table row using
only the RowId.
Add support for reading and writing calculated column values.
Jackcess will not evaluate the actual expressions, but the column
values can be written directly.
Add the ability to set properties in DatabaseBuilder, TableBuilder,
and ColumnBuilder.
Add the ability to create tables with calculated fields.
Add ColumnValidator interface which allows column values to be easily
manipulated/validated as they are written into the database.
Fix NullPointerException in RowImpl.toString() when value is null.
Rework row add/update so that constraint violations do not leave
behind partially written rows.
Add ConstraintViolationException to distinguish exceptions due to
violating database constraints from other random errors.
Add initial support for creating/parsing ole content.
Ignore invalid column usage map definitions.
Make reading long value columns more lenient (MEMO/OLE).
Add support for modifying PropertyMaps.
Brand new API! This release is not backwards compatible with 1.x
releases. See Migration Guide at https://jackcess.sourceforge.io/jackcess-2.html
for more details.
Ignore invalid column usage map definitions.
Make reading long value columns more lenient (MEMO/OLE).
Fix reading of Properties with multiple value blocks.
Remove extra object flags before checking query type.
Implement handling of usagemaps for long value (MEMO/OLE) columns.
Fix partial page updates when using CodecHandlers which can only do
full page encoding.
Add more methods to Database for retrieving Relationships.
Implement attachment decoding, thanks to Lorenzo Carrara.
Do not unicode compress strings which are longer than 1024 chars.
Add info to the Column to support MEMO columns which are HYPERLINKS.
Add optional support for enforcing foreign-key constraints/cascading.
This is disabled by default (for backwards compatibility), but can be
controlled globally via a system property and/or on a per-Database
basis using setEnforceForeignKeys() method.
Add some more functionality to Joiner to facilitate integrity
enforcement (hasRows and deleteRows).
Added DatabaseBuilder for more convenient and flexible Database
open/create.
Added the MemFileChannel (and associated support in DatabaseBuilder)
to enable working with Database files completely in memory.
Fix some more edge cases in date/time conversions.
Add osgi header information to the manifest.
Add ImportUtil.toColumns to enable more advanced Table creation
implementations.
Fix NPE when running unit tests with db format MSISAM.
Fix writing partial pages when CodecHandler is in use. Note, this fix
involves a backwards incompatible change to the CodecHandler interface
(Jackcess Encrypt 1.0.3 or later is compatible with this version of
Jackcess).
Add initial support for linked tables. Linked tables will now be
loaded by the normal Database.getTable method. Linked tables can be
created using the new Database.createLinkedTable method. Linked table
resolution can be customized per Database by supplying a custom
LinkResolver.
Rename and refactor the Cursor find methods to improve usability.
Add support for reading/writing complex column data (version history,
attachments, multi-value columns).
Fix problem with creating tables with indexes where ms access could
not open the created table.
Fix problem with reading row from table with deleted/added columns.
Reuse previously written memo/ole values when updating other values in
a row in order to reduce unnecessary data duplication.
Allow ImportFilter and ExportFilter to return null from filterRow() to
indicate that a row should be skipped.
Add option to import file without headers to existing table.
Add ImportUtil.Builder and ExportUtil.Builder to simplify
import/export operations.
Try multiple classloaders when loading resources as streams.
Add the Joiner utility and some new methods to IndexCursor to make it
easier to join tables using pre-defined (index backed) relationships.
Enable basic handling of unsupported data types as binary content.
Add methods to approximate table size.
Add Database.getSystemTableNames to enable retrieving the list of
system/hidden tables.
Fix issue with reading Access 97 database with large number of fields.
Refactor table loading to use indexes. Do not load all table names at
database startup (should make startup faster).
Add support for reading properties blobs. Add methods for accessing
database, summary, and user-defined properties from the Database. Add
methods to Table and Column for accessing their respective properties.
Add support for Access 2010, including new "General" sort order
(support for super-long text index entries still needs work).
Access expects a row to be at least big enough to hold all fixed
values, even if they are null.
Add Index.getReferencedIndex for retrieving the referenced Index for a
foreign key index.
Add support for writing all fixed length column types into variable
length fields.
More fixes related to reading and interpreting index information.
Handle multiple logical indexes backed by the same index data.
Interpret foreign key constraint information.
Allow MSISAM files to be written (experimental).
Add support for creating indexes when creating a new table. Normal
indexes and primary key indexes are currently supported. Foreign key
indexes are not yet supported.
Add support for specifying a quote character on import from flat
files.
Add support for reading database password.
Add support for plugging in implementations of various page
encoding/decoding algorithms. See the <a href="https://jackcessencrypt.sourceforge.io/">Jackcess Encrypt</a>
project for a CodecProvider implementation which supports a few of the
Access encodings. (thanks to Vladimir Berezniker).
Implement some tweaks which allow jackcess to be used on the Android
platform. See the <a href="faq.html#android">FAQ</a> for more
details. (thanks to Miha Pirnat).
Allow output column order in tables to be configured.
Add support for custom column value matching when finding rows using a
Cursor.
Ignore usagemap inconsistencies in certain (safe) situations.
Add ExportUtil and associated utilities for exporting tables to flat
files (thanks to F. Gerbig).
Fix some places where table/columns names were not being handled
case-insensitively.
Make Database.escapeIdentifier public; add methods to TableBuilder and
ColumnBuilder to optionally escape names.
Add support for overriding charset and timezone used when
reading/writing database.
Add support for reading Access 97 (jet format 3) databases (thanks to
F. Gerbig).
Add support for access 2002/2003/2007 databases.
Enable "large" index support by default. It can still be disabled via
a variety of means, see the Database javadoc for more details.
Fix BigIndexTest to work in IDE's w/out sys.prop.
Further improvements to date handling.
Handle more binary/character input types (Blob, Clob, InputStream,
Reader), based on user submitted patch.
Refactor import/copy methods from Database into ImportUtil. Allow
reuse of existing tables. make behavior/naming of copy and import
methods consistent. (ideas from submitted patch).
Set overflow info in header row, not in last data row.
Add support for indexing strings containing any characters from BMP 0.
Add support for updating GUID indexes and for auto-number GUID
fields.
Add support for updating rows in a table.
Support reading/writing fixed length text fields.
Add Query reading support.
Be more forgiving for input column length.
Add ErrorHandler utility for customizing error handling during row
parsing.
Add RowFilter contributed by Patricia Donaldson.
Add Database.getSystemTable method for accessing system tables.
Fix simple index handling of tail index pages.
Reserve minimum space for memo/ole fields so that greedy inline row
usage does not cause spurious write failures for wide tables.
Better column type translation for very large MEMO/OLE types in the
Database.copyTable logic.
Add some more limit checking into table creation based on what access
supports (max rows per table, max identifier lengths).
Share out-of-line long value pages in order to generate more compact
database files.
Add primitive support for writing unicode compressed text columns.
Add compression code for possible future use; add compression unit
tests.
Fix writing of large memo/ole fields. Apparently Access does not like
long value fields longer than 4076 bytes.
Reduce maximum row size to what Access considers valid.
Need to store auto-number values back into row so that indexes can be
updated correctly.
Access seems to limit data pages to a max of 255 rows.
Added experimental support for "large" indexes. The current support
is optional. It can be enabled via a variety of means, see the
Database javadoc for more details.
More fixes for index parsing. Believe index names are now correctly
matched up with indexes.
Simplify comparison algorithms for RowId and Index.Entry using type
attributes.
Expand the characters supported in index updates to all of the
ISO-8859-1 character set.
Fix bug caused by sign extension when reading single-byte row numbers.
Modify Index update support so that it honors the "unique" and
"ignoreNulls" properties for the Index.
Add support for reading table relationships.
Fix creation of tables with auto-number columns.
Completely fix problems with sporadic usage map corruption.
Add some soft buffer caching in various places to avoid excessive
buffer reallocation.
Add some builder-style utilities for table creation (ColumnBuilder,
TableBuilder).
Resolve more edge cases around date handling.
Fix writing of large memo/ole fields. Apparently Access does not like
"inline" fields longer than 64 bytes.
Fix generation of security access control entries. Use userIds
already existing in the database file instead of hard-coded userIds,
if possible.
Support reading inline usage maps with more than 512 pages.
Fix some problems with sporadic usage map corruption.
Move from cvs to subversion.
Add index based table traversal support to Cursor with optional
sub-range narrowing. Add position save/restore, row find, and a
variety of other features.
Move table iteration out of Table and into Cursor. First stage in
offering more complicated table access.
Update table row count correctly on row deletion or bulk row addition,
bug #1681954.
Add experimental support for auto-number columns, feature request
#1565216.
Move project to maven2 and change project groupId to
com.healthmarketscience.jackcess.
Add support for writing large table definitions, bug #1675522.
Fix handling of usage maps for large tables, bug #1748827.
Fixed some edge cases for reading numeric columns, bug #1672071.
Additional info in DataType to support better type validation
(scale/precision range). Add "unit size" concept.
Add CLOB support in JDBC handling. Add general support for large
types (BLOB/CLOB).
Enhance Database.copyTable/importReader to allow for better control
over column definitions and row values through the ImportFilter.
Change default type translation to handle large and variable length
types better.
Refactored DataType class, cleaned up a lot of "custom" data type code
springled throughout the codebase.
Added sanity checking on table creation (check column/table properties
for validity).
Clean up index reading/writing of text columns, add support for more
characters
Support reading 'compressed' indexes (fix 1563654)
Implement "overflow" row reading.
Allow multi-page long value reading.
Implement multi-page long value writing.
Fix decimal data type writing.
Add support for opening files read-only (fix 1545857)
Handle more tables with more index slots than actual indexes (fix bug
1530312)
Clean up reading/writing 3-byte ints; long value length is 3-bytes
(fix bug 1449812)
Fix handling of skipped rows
When reading multi-page table def, flip buffer before parsing (fix bug
1306970)
Treat table names as case insensitive; use stored table names when
instantiating tables
Make Database and Table Iterable
Use uppercase names when adding text columns to indexes, which fixes
long standing problem with table names starting with lowercase
characters (and other situations where tables could not be opened in
Access). Remove hack which forced every table name to have uppercase
first character.
Clean up compressed text handling.
Implement reading multi-page long binary values
Add support for currency columns (thanks to James Schopp).
Handle tables with no variable length columns correctly.
Handle reading with deleted columns.
Read information on primary keys and include in Index.
Fix some issues around reading indexes.
Add write support for numeric/GUID columns.
Added getRowCount(), getName(), updated toString() on Table.
Missing break in switch condition.
Fixes
to reading/writing MEMO/OLE columns.
Made exceptions thrown when opening empty or nonexistent files more
specific.
Apply patch from Jon Iles for handilng variable length columns.
Apply patch from Jon Iles for handling dates.
Apply patch from Jon Iles for reading GUIDs.
Fix parsing of NUMERIC type.
Applied Jon Iles' patch to allow large table definitions to be read.
Fixed bug where writing null values into fixed-width columns was
failing.
Fixed bug in reading index count from table definition. Skip overflow
rows.
JDK 1.5 upgrades
Applied Mitchell Friedman's patch for support of additional JDBC data
types.
Added support for deleted rows.
Initial release