From 611b3cd61a3771613449d6082be6c18585e0cc24 Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Wed, 17 Mar 2010 04:21:49 +0000 Subject: [PATCH] fix handling of numeric column indexes for v2007 databases git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/newformats@449 f203690c-595d-4dc9-a70b-905162fa7fd2 --- .../healthmarketscience/jackcess/Index.java | 26 ++++++++++++++----- .../jackcess/JetFormat.java | 15 ++++++++++- .../jackcess/IndexCodesTest.java | 2 +- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/java/com/healthmarketscience/jackcess/Index.java b/src/java/com/healthmarketscience/jackcess/Index.java index b629049..f72377a 100644 --- a/src/java/com/healthmarketscience/jackcess/Index.java +++ b/src/java/com/healthmarketscience/jackcess/Index.java @@ -1540,17 +1540,31 @@ public abstract class Index implements Comparable { boolean isNegative = ((valueBytes[0] & 0x80) != 0); // bit twiddling rules: - // isAsc && !isNeg => setReverseSignByte - // isAsc && isNeg => flipBytes, setReverseSignByte - // !isAsc && !isNeg => flipBytes, setReverseSignByte - // !isAsc && isNeg => setReverseSignByte + // isAsc && !isNeg => setReverseSignByte => FF 00 00 ... + // isAsc && isNeg => flipBytes, setReverseSignByte => 00 FF FF ... + // !isAsc && !isNeg => flipBytes, setReverseSignByte => FF FF FF ... + // !isAsc && isNeg => setReverseSignByte => 00 00 00 ... + // v2007 bit twiddling rules: + // isAsc && !isNeg => setSignByte 0xFF => FF 00 00 ... + // isAsc && isNeg => setSignByte 0xFF, flipBytes => 00 FF FF ... + // !isAsc && !isNeg => setSignByte 0xFF => FF 00 00 ... + // !isAsc && isNeg => setSignByte 0xFF, flipBytes => 00 FF FF ... + + boolean alwaysRevFirstByte = getColumn().getFormat().REVERSE_FIRST_BYTE_IN_DESC_NUMERIC_INDEXES; + if(alwaysRevFirstByte) { + // reverse the sign byte (before any byte flipping) + valueBytes[0] = (byte)0xFF; + } + if(isNegative == isAscending()) { flipBytes(valueBytes); } - // reverse the sign byte (after any previous byte flipping) - valueBytes[0] = (isNegative ? (byte)0x00 : (byte)0xFF); + if(!alwaysRevFirstByte) { + // reverse the sign byte (after any previous byte flipping) + valueBytes[0] = (isNegative ? (byte)0x00 : (byte)0xFF); + } bout.write(valueBytes); } diff --git a/src/java/com/healthmarketscience/jackcess/JetFormat.java b/src/java/com/healthmarketscience/jackcess/JetFormat.java index afb1804..62ce992 100644 --- a/src/java/com/healthmarketscience/jackcess/JetFormat.java +++ b/src/java/com/healthmarketscience/jackcess/JetFormat.java @@ -130,6 +130,8 @@ public abstract class JetFormat { public final int MAX_TABLE_NAME_LENGTH; public final int MAX_COLUMN_NAME_LENGTH; public final int MAX_INDEX_NAME_LENGTH; + + public final boolean REVERSE_FIRST_BYTE_IN_DESC_NUMERIC_INDEXES; public final Charset CHARSET; @@ -230,7 +232,8 @@ public abstract class JetFormat { MAX_TABLE_NAME_LENGTH = defineMaxTableNameLength(); MAX_COLUMN_NAME_LENGTH = defineMaxColumnNameLength(); MAX_INDEX_NAME_LENGTH = defineMaxIndexNameLength(); - + + REVERSE_FIRST_BYTE_IN_DESC_NUMERIC_INDEXES = defineReverseFirstByteInDescNumericIndexes(); CHARSET = defineCharset(); } @@ -305,6 +308,8 @@ public abstract class JetFormat { protected abstract Charset defineCharset(); + protected abstract boolean defineReverseFirstByteInDescNumericIndexes(); + @Override public String toString() { return _name; @@ -448,6 +453,9 @@ public abstract class JetFormat { @Override protected int defineMaxIndexNameLength() { return 64; } + @Override + protected boolean defineReverseFirstByteInDescNumericIndexes() { return false; } + @Override protected Charset defineCharset() { return Charset.forName("UTF-16LE"); } } @@ -462,5 +470,10 @@ public abstract class JetFormat { private Jet5Format() { super("VERSION_5"); } + + @Override + protected boolean defineReverseFirstByteInDescNumericIndexes() { return true; } + } + } diff --git a/test/src/java/com/healthmarketscience/jackcess/IndexCodesTest.java b/test/src/java/com/healthmarketscience/jackcess/IndexCodesTest.java index 217a566..0e1efd7 100644 --- a/test/src/java/com/healthmarketscience/jackcess/IndexCodesTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/IndexCodesTest.java @@ -126,7 +126,7 @@ public class IndexCodesTest extends TestCase { } } fail("testDB: " + testDB + ";\nCould not find expected row " + expectedRow + " starting at " + - entryToString(startPos)); // @todo fails with v2007 on row2 + entryToString(startPos)); } -- 2.39.5