Menu ▾ ▴

Jackcess / News: Recent posts

Jackcess 5.0.2 released

Jackcess 5.0.2 Release

  • Treat a text index in a jet 3 file as read only unless its locale is english. 5.0.1 wrote and looked up such an index with the english order, which a jet 3 file in another locale does not use.
  • Make the case conversions which compare names and keywords independent of the default locale.
  • Read, change and write the name map of a table through Table.getNameMap(). The name map is the data behind the ms access Name AutoCorrect option, and a column rename has to update it. NameMap.findMismatches() lists where the name map and the table disagree.
  • Read the properties of a query through Query.getProperties(), and its name map through Query.getNameMap(). The name map of a query cannot be changed, and its findMismatches() lists the tables and columns the query uses which were renamed since it was saved, which ms access repairs when it next opens the query.
  • Add PropertyMap constants and default types for more of the common database, table, column and query properties.
  • Write a memo property value longer than 255 characters, such as a long default value expression, which ms access saves. A property value which is too long now fails with an InvalidValueException which names the property, instead of a NullPointerException or a corrupt property block.
  • Keep the ddl flag of a property as it is stored in the file. A property whose name has a default ddl flag was read with the flag on, and a save then wrote the flag into the file.
Posted by James Ahlborn 2 days ago

Jackcess 5.0.1 released

Jackcess 5.0.1 Release

  • Write text indexes in the collations which weigh a sequence of characters as a unit: czech and slovak, spanish traditional, hungarian in both its orders, norwegian and danish, croatian, serbian, bosnian and vietnamese.
  • Test what happens to a text index in a collation jackcess cannot write, which no test covered once the collations of this release supported every database in the test data.
  • Write text indexes in the french sublanguages, belgium, canada, switzerland, luxembourg and monaco, which ms access sends to the french collation and which were refused although french itself was written.
  • Write the upper case forms of the characters the general order collations move. Croatian, serbian, bosnian, romanian and indic in that family moved the lower case form alone.
  • Write text indexes in the collations which a whole sort id names rather than a locale: german phone book, which expands the umlauts, georgian modern, and romanian and indic in the access 2010 order.
  • Write text indexes in twelve more collations, which move a few characters against the general legacy order: spanish modern, swedish and finnish, polish, romanian, turkish, slovenian, estonian, latvian, lithuanian, icelandic, ukrainian and macedonian.
  • Find a row whose index entry it shares with another row. One entry can hold several rows, since the entry of a text value folds case, and a lookup read only the first of them.
    Add Write text indexes in the french collation. French weights every character the way the general legacy order does and orders the diacritics of a value from its end.
    Add Write text indexes for the 58 locales which the ms access locale map sends to 1033, which is most of europe: german, greek, italian, dutch, portuguese, russian, arabic, georgian, hindi and their sublanguages. None of them tailors a single character, so the weight table jackcess already has is the whole of the collation.
  • Read and write the collation variant, the third byte of a column's sort order field. The four bytes are the ms access sort id, and the variant separates the collations of one locale, so german phone book used to read as plain german and hungarian technical as plain hungarian.
  • Add Column.getColumnId, the id ms access gave a column when it was created. An id is never renumbered, so a table which has had a column deleted has gaps in its ids.
  • Add Column.isHidden and Column.isSecurityIdentifier for the two column flag bits which were previously unnamed.
  • Add Index.getProperties. An index has a property block of its own, separate from the block of the column access named it after.
  • Add PropertyMap.Property.isSkipHandler for the property flag bit which tells ms access to store the value without running the handler bound to the property name, and a PropertyMap.put which sets both flag bits.
Posted by James Ahlborn 7 days ago

Jackcess 5.0.0 released

Jackcess 5.0.0 Release

  • Update minimum java requirement to java 11. Some code base cleanup and modernization.
  • Removed RuntimeIOException in favor of built in UncheckedIOException.
  • Removed DataType.UNKNOWN_0D. It is not a data type.
  • Renamed DataType.UNKNOWN_11 to DataType.BIG_BINARY, which is what the engine calls it. It is a fixed length binary column longer than the 255 byte BINARY, used only by the Data column of MSysAccessObjects.
Posted by James Ahlborn 2026-09-13

Jackcess 4.0.12 released

Jackcess 4.0.12 Release

  • Determine the type of a complex column from the name of its "type" table, which ms access reserves, rather than by counting the data types of that table's columns. one.
  • Find the foreign key column of a complex column's flat table from the flag ms access sets on it, rather than by looking for the long column which is not the autonumber
  • Check the column name in MSysComplexColumns against the column being loaded, which catches a bad complex id in a column definition
  • Truncate long text index entries the way ms access does, keeping the leading 508 bytes of the key and ending it with a digest of the bytes discarded. Keys longer than 510 bytes were previously written in full, so ms access could not use the index and jackcess could not find the affected rows again.
  • Fix the index code suffix written for "international ext" characters (which include hiragana and katakana). The suffix length grows with the number of characters using those codes, but a fixed length one was always written, so index entries for 8 or more such characters were wrong.
  • Some code base modernization. Note a minor exception widening in OleBlob.
  • Fix database corruption when adding column to table with deleted variable length columns.
  • Add toString to ColumnBuilder, TableBuilder and IndexBuilder.
  • Check that the column counts and sizes in a table definition cover the columns which are actually defined when the table is loaded. A damaged table definition now becomes read-only.
  • Fix the index entry written for a surrogate pair. In the general sort order the weight table gives the high surrogates four separate ranges, one of which has no weight at all, and only the first was implemented, so entries for characters above plane 1 did not match ms access. In the general legacy sort order ms access gives a surrogate no weight at all, so every entry for a supplementary character was wrong there.
  • Write the level of an index page into its page header. The level is the depth of the page below the leaves of the index tree, 0 on a leaf page and one more than its children on a node page. Zero was written on every page, so an index deep enough to need node pages claimed they were all at the level of the leaves.
  • Identify a property map by its name and its block type together. Ms access keeps index properties in their own block and names an index after its column by default, so a table commonly holds a column block and an index block with the same name. Keying on the name alone reported the index properties as the column's, and rewriting the map wrote one block instead of two, which discarded the index properties.
  • Keep the whole property flag byte when a property map is rewritten. Ms access uses it as a bit field: bit 0 is the ddl flag and bit 7 tells the engine to store the value without running the handler bound to the property name. The byte was read as a boolean and written back as 0 or 1, which invented the ddl flag on properties which did not have it and dropped bit 7 from those which did. PropertyMap.Property isDdl now reports bit 0 rather than the whole byte.
  • Give a column added to an existing table an unused column id. Ms access assigns each column an id which it never reuses and never renumbers, so a table which has had a column deleted has gaps in its ids. The physical column number was written as the id, which could repeat an id already in use.
  • Mark an index over a complex column the way ms access does, with a 2 in the byte after the index flags.
  • Use the file formats which ms access stores uncompressed when writing an attachment (jpg, jpeg, gif, png, zip, cab, docx, xlsx, xlsb and pptx), and deflate everything else. The previous list compressed png and office files which ms access leaves alone, and left archives raw which ms access deflates.
    Update Linked databases are no longer resolved automatically. The default LinkResolver now refuses to open linked databases. Applications which use linked databases must configure LinkResolver.UNRESTRICTED (the previous behavior) or a resolver enforcing their own policy, or enable the allowLinkResolution system property. Note that this also affects CustomLinkResolver, whose fallback for non-custom files now denies.
Posted by James Ahlborn 2026-09-12

Jackcess 4.0.11 released

Jackcess 4.0.11 Release

  • Promote the global usage map to a reference map once a database grows beyond what an inline global usage map can represent (~2mb). Large databases previously retained an inline global usage map (a sliding window which no longer described the whole database), which ms access would report as invalid/corrupt during operations such as sorting a large table. Fixes 160
  • Fix possible edge-case corruption when updating indexes.
  • Make text functions locale sensitive.
  • Add optional support via system property for writing "broken" indexes for unsupported sort orders. This enables building the db using jackcess and then later making the db indexes valid using ms access compact and repair.
Posted by James Ahlborn 2026-07-06

Jackcess 4.0.10 released

Jackcess 4.0.10 Release

  • Update commons lang3 dependency version
  • Update apache poi dependency version

Note, 4.0.9 release was skipped while fixing issues due to updating to new sonatype repository.

Posted by James Ahlborn 2025-10-26

Jackcess 4.0.8 released

Jackcess 4.0.8 Release

  • Fix adding fixed length columns to an existing table.
Posted by James Ahlborn 2025-01-05

Jackcess 4.0.7 released

Jackcess 4.0.7 Release

  • Add support for surrogate pairs in text indexes (e.g. emoticons)
Posted by James Ahlborn 2024-06-24

Jackcess 4.0.6 released

Jackcess 4.0.6 Release

  • Make NumberFormatter locale aware, using the currently configured LocaleContext
  • Account for character sizes when copying column lengths
Posted by James Ahlborn 2024-05-12

Jackcess 4.0.5 released

Jackcess 4.0.5 Release

  • 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
Posted by James Ahlborn 2023-01-27

Jackcess 4.0.4 (and 4.0.3) released

Jackcess 4.0.4 (and 4.0.3) Release

  • Fix edge case which can cause table to be considered corrupt
  • Update parent pom to fix release process
Posted by James Ahlborn 2022-10-29

Jackcess 4.0.2 released

Jackcess 4.0.2 Release

  • 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
Posted by James Ahlborn 2022-08-26

Jackcess 4.0.1 released

Jackcess 4.0.1 Release

  • 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.
Posted by James Ahlborn 2021-06-22

Jackcess 4.0.0 released

Jackcess 4.0.0 Release

  • Add Automatic-Module-Name in order to make Jackcess safe to use in the module path in Java9+ 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.
Posted by James Ahlborn 2021-01-21

Jackcess 3.5.1 released

Jackcess 3.5.1 Release

  • Add more static utility methods to DatabaseBuilder to enable more succinct object construction code using static imports
Posted by James Ahlborn 2020-09-11

Jackcess 3.5.0 released

Jackcess 3.5.0 Release

  • 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
Posted by James Ahlborn 2020-07-31

Jackcess 3.0.1 released

Jackcess 3.0.1 Release

  • 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
Posted by James Ahlborn 2019-04-14

Jackcess 3.0.0 released

Jackcess 3.0.0 Release

  • 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
Posted by James Ahlborn 2019-02-09

Jackcess 2.2.3 released

Jackcess 2.2.3 Release

  • Fix parsing of escaped double quotes in expressions
  • Use column label from ResultSetMetaData when importing
Posted by James Ahlborn 2019-02-05

Jackcess 2.2.2 released

Jackcess 2.2.2 Release

  • Fix length in units calculation for Access 97 text fields
Posted by James Ahlborn 2019-01-05

Jackcess 2.2.1 released

Jackcess 2.2.1 Release

  • 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 adapated 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
Posted by James Ahlborn 2018-12-22

Jackcess 2.2.0 released

Jackcess 2.2.0 Release

  • 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).
Posted by James Ahlborn 2018-09-09

Jackcess 2.1.12 released

Jackcess 2.1.12 Release

  • Add some additional property keys and relevant enums for values
  • Create new usage map correctly when adding an index to an existing table
Posted by James Ahlborn 2018-06-26

Jackcess 2.1.11 released

Jackcess 2.1.11 Release

  • Expose the "ddl" attribute on properties. Set the attribute appropriately for known builtin properties.
  • Set ddl flag even if property type is explicitly provided.
Posted by James Ahlborn 2018-03-06

Jackcess 2.1.10 released

Jackcess 2.1.10 Release

  • Add full support for access 2016 databases including the new "Large Number" (aka Bigint) data type
Posted by James Ahlborn 2018-01-19