summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJames Ahlborn <jtahlborn@yahoo.com>2006-03-09 02:00:28 +0000
committerJames Ahlborn <jtahlborn@yahoo.com>2006-03-09 02:00:28 +0000
commitfaa4e7b2d5e8e156a4fa9788d1c18388f1290cbf (patch)
tree6be4942861416c1bc72df977b9a32161e47c9134 /src
parentc3d97c09ae918c99c9073bc29174ae07e9a4ae5c (diff)
downloadjackcess-faa4e7b2d5e8e156a4fa9788d1c18388f1290cbf.tar.gz
jackcess-faa4e7b2d5e8e156a4fa9788d1c18388f1290cbf.zip
apply patches from joniles, 1423965, 1427848 (handling var length columns)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@37 f203690c-595d-4dc9-a70b-905162fa7fd2
Diffstat (limited to 'src')
-rw-r--r--src/java/com/healthmarketscience/jackcess/Column.java56
-rw-r--r--src/java/com/healthmarketscience/jackcess/Table.java17
2 files changed, 64 insertions, 9 deletions
diff --git a/src/java/com/healthmarketscience/jackcess/Column.java b/src/java/com/healthmarketscience/jackcess/Column.java
index a6c1519..250c3cf 100644
--- a/src/java/com/healthmarketscience/jackcess/Column.java
+++ b/src/java/com/healthmarketscience/jackcess/Column.java
@@ -273,13 +273,13 @@ public class Column implements Comparable<Column> {
return null;
} else if (_type == DataType.OLE) {
if (data.length > 0) {
- return getLongValue(data);
+ return getLongBinaryValue(data);
} else {
return null;
}
} else if (_type == DataType.MEMO) {
if (data.length > 0) {
- return _format.CHARSET.decode(ByteBuffer.wrap(getLongValue(data))).toString();
+ return getLongStringValue(data);
} else {
return null;
}
@@ -315,16 +315,21 @@ public class Column implements Comparable<Column> {
throw new IOException("Unrecognized data type: " + _type);
}
}
-
+
/**
* @param lvalDefinition Column value that points to an LVAL record
* @return The LVAL data
*/
@SuppressWarnings("fallthrough")
- private byte[] getLongValue(byte[] lvalDefinition) throws IOException {
+ private byte[] getLongBinaryValue(byte[] lvalDefinition) throws IOException {
ByteBuffer def = ByteBuffer.wrap(lvalDefinition);
def.order(ByteOrder.LITTLE_ENDIAN);
short length = def.getShort();
+ // bail out gracefully here as we don't understand the format
+ if (length < 0)
+ {
+ return null;
+ }
byte[] rtn = new byte[length];
short type = def.getShort();
switch (type) {
@@ -355,6 +360,49 @@ public class Column implements Comparable<Column> {
}
/**
+ * @param lvalDefinition Column value that points to an LVAL record
+ * @return The LVAL data
+ */
+ @SuppressWarnings("fallthrough")
+ private String getLongStringValue(byte[] lvalDefinition) throws IOException {
+ ByteBuffer def = ByteBuffer.wrap(lvalDefinition);
+ def.order(ByteOrder.LITTLE_ENDIAN);
+ short length = def.getShort();
+ byte[] rtn = new byte[length];
+ short type = def.getShort();
+ String result;
+ switch (type) {
+ case LONG_VALUE_TYPE_OTHER_PAGE:
+ if (lvalDefinition.length != _format.SIZE_LONG_VALUE_DEF) {
+ throw new IOException("Expected " + _format.SIZE_LONG_VALUE_DEF +
+ " bytes in long value definition, but found " + lvalDefinition.length);
+ }
+ byte rowNum = def.get();
+ int pageNum = ByteUtil.get3ByteInt(def, def.position());
+ ByteBuffer lvalPage = _pageChannel.createPageBuffer();
+ _pageChannel.readPage(lvalPage, pageNum);
+ short offset = lvalPage.getShort(14 +
+ rowNum * _format.SIZE_ROW_LOCATION);
+ lvalPage.position(offset);
+ lvalPage.get(rtn);
+ result = _format.CHARSET.decode(ByteBuffer.wrap(rtn)).toString();
+ break;
+ case LONG_VALUE_TYPE_THIS_PAGE:
+ rtn = new byte[length-2];
+ def.position(14);
+ def.get(rtn);
+ result = new String(rtn);
+ break;
+ case LONG_VALUE_TYPE_OTHER_PAGES:
+ //XXX
+ return null;
+ default:
+ throw new IOException("Unrecognized long value type: " + type);
+ }
+ return result;
+ }
+
+ /**
* Write an LVAL column into a ByteBuffer inline (LONG_VALUE_TYPE_THIS_PAGE)
* @param value Value of the LVAL column
* @return A buffer containing the LVAL definition and the column value
diff --git a/src/java/com/healthmarketscience/jackcess/Table.java b/src/java/com/healthmarketscience/jackcess/Table.java
index a9a6944..575d374 100644
--- a/src/java/com/healthmarketscience/jackcess/Table.java
+++ b/src/java/com/healthmarketscience/jackcess/Table.java
@@ -229,13 +229,20 @@ public class Table {
if (column.getType() == DataType.BOOLEAN) {
value = new Boolean(!isNull); //Boolean values are stored in the null mask
} else {
- if (!column.isVariableLength()) {
+ if (!column.isVariableLength())
+ {
//Read in fixed length column data
- columnData = new byte[column.size()];
+ columnData = new byte[column.getLength()];
_buffer.get(columnData);
- } else if (!isNull) {
- //Refer to already-read-in variable length data
- columnData = varColumnData[varColumnDataIndex--];
+ }
+ else
+ {
+ if (!isNull)
+ {
+ //Refer to already-read-in variable length data
+ columnData = varColumnData[varColumnDataIndex];
+ }
+ --varColumnDataIndex;
}
if (!isNull && columnData != null &&
(columnNames == null || columnNames.contains(column.getName())))