From 748e2e82128b938b95ac74a30ae1315fac167bf8 Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Tue, 5 Apr 2011 13:13:53 +0000 Subject: [PATCH] fix sort order reading in v1997; set col sort order to db default when writing (if unspecified) git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@547 f203690c-595d-4dc9-a70b-905162fa7fd2 --- .../com/healthmarketscience/jackcess/Column.java | 12 +++++++++--- .../com/healthmarketscience/jackcess/Database.java | 12 ++++++++++++ .../com/healthmarketscience/jackcess/JetFormat.java | 7 +++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/java/com/healthmarketscience/jackcess/Column.java b/src/java/com/healthmarketscience/jackcess/Column.java index 420c581..13954cd 100644 --- a/src/java/com/healthmarketscience/jackcess/Column.java +++ b/src/java/com/healthmarketscience/jackcess/Column.java @@ -1747,7 +1747,11 @@ public class Column implements Comparable { JetFormat format) { short value = buffer.getShort(position); - byte version = buffer.get(position + 3); + byte version = 0; + if(format.SIZE_SORT_ORDER == 4) { + version = buffer.get(position + 3); + } + if(value == 0) { // probably a file we wrote, before handling sort order return format.DEFAULT_SORT_ORDER; @@ -1773,8 +1777,10 @@ public class Column implements Comparable { sortOrder = format.DEFAULT_SORT_ORDER; } buffer.putShort(sortOrder.getValue()); - buffer.put((byte)0x00); // unknown - buffer.put(sortOrder.getVersion()); + if(format.SIZE_SORT_ORDER == 4) { + buffer.put((byte)0x00); // unknown + buffer.put(sortOrder.getVersion()); + } } /** diff --git a/src/java/com/healthmarketscience/jackcess/Database.java b/src/java/com/healthmarketscience/jackcess/Database.java index 5c38561..46a148d 100644 --- a/src/java/com/healthmarketscience/jackcess/Database.java +++ b/src/java/com/healthmarketscience/jackcess/Database.java @@ -1057,6 +1057,13 @@ public class Database _format.MAX_COLUMNS_PER_TABLE + " columns"); } + Column.SortOrder dbSortOrder = null; + try { + dbSortOrder = getDefaultSortOrder(); + } catch(IOException e) { + // ignored, just use the jet format default + } + Set colNames = new HashSet(); // next, validate the column definitions for(Column column : columns) { @@ -1065,6 +1072,11 @@ public class Database throw new IllegalArgumentException("duplicate column name: " + column.getName()); } + + // set the sort order to the db default (if unspecified) + if(column.getType().isTextual() && (column.getTextSortOrder() == null)) { + column.setTextSortOrder(dbSortOrder); + } } List autoCols = Table.getAutoNumberColumns(columns); diff --git a/src/java/com/healthmarketscience/jackcess/JetFormat.java b/src/java/com/healthmarketscience/jackcess/JetFormat.java index 173d96c..d1041a5 100644 --- a/src/java/com/healthmarketscience/jackcess/JetFormat.java +++ b/src/java/com/healthmarketscience/jackcess/JetFormat.java @@ -176,6 +176,7 @@ public abstract class JetFormat { public final int OFFSET_PASSWORD; public final int SIZE_PASSWORD; public final int OFFSET_SORT_ORDER; + public final int SIZE_SORT_ORDER; public final int OFFSET_ENCODING_KEY; public final int OFFSET_NEXT_TABLE_DEF_PAGE; public final int OFFSET_NUM_ROWS; @@ -303,6 +304,7 @@ public abstract class JetFormat { OFFSET_PASSWORD = defineOffsetPassword(); SIZE_PASSWORD = defineSizePassword(); OFFSET_SORT_ORDER = defineOffsetSortOrder(); + SIZE_SORT_ORDER = defineSizeSortOrder(); OFFSET_ENCODING_KEY = defineOffsetEncodingKey(); OFFSET_NEXT_TABLE_DEF_PAGE = defineOffsetNextTableDefPage(); OFFSET_NUM_ROWS = defineOffsetNumRows(); @@ -398,6 +400,7 @@ public abstract class JetFormat { protected abstract int defineOffsetPassword(); protected abstract int defineSizePassword(); protected abstract int defineOffsetSortOrder(); + protected abstract int defineSizeSortOrder(); protected abstract int defineOffsetEncodingKey(); protected abstract int defineOffsetNextTableDefPage(); protected abstract int defineOffsetNumRows(); @@ -528,6 +531,8 @@ public abstract class JetFormat { @Override protected int defineOffsetSortOrder() { return 58; } @Override + protected int defineSizeSortOrder() { return 2; } + @Override protected int defineOffsetEncodingKey() { return 62; } @Override protected int defineOffsetNextTableDefPage() { return 4; } @@ -730,6 +735,8 @@ public abstract class JetFormat { @Override protected int defineOffsetSortOrder() { return 110; } @Override + protected int defineSizeSortOrder() { return 4; } + @Override protected int defineOffsetEncodingKey() { return 62; } @Override protected int defineOffsetNextTableDefPage() { return 4; } -- 2.39.5