summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Ahlborn <jtahlborn@yahoo.com>2006-07-26 12:50:43 +0000
committerJames Ahlborn <jtahlborn@yahoo.com>2006-07-26 12:50:43 +0000
commita2d427b84c8876943f022bbedce7645e5481d4d3 (patch)
treee433461f5bc5ae9ae1e83477a18f21a1a85a9267
parentcd574523991d35100dc369bf3ac40cb249357049 (diff)
downloadjackcess-a2d427b84c8876943f022bbedce7645e5481d4d3.tar.gz
jackcess-a2d427b84c8876943f022bbedce7645e5481d4d3.zip
read variable length column data on demand
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@73 f203690c-595d-4dc9-a70b-905162fa7fd2
-rw-r--r--src/java/com/healthmarketscience/jackcess/Table.java27
1 files changed, 11 insertions, 16 deletions
diff --git a/src/java/com/healthmarketscience/jackcess/Table.java b/src/java/com/healthmarketscience/jackcess/Table.java
index 5aabd2a..c1bf455 100644
--- a/src/java/com/healthmarketscience/jackcess/Table.java
+++ b/src/java/com/healthmarketscience/jackcess/Table.java
@@ -217,14 +217,12 @@ public class Table {
nullMask.read(_buffer);
short rowVarColumnCount = 0;
- byte[][] varColumnData = null;
short[] varColumnOffsets = null;
short lastVarColumnStart = 0;
// if _maxVarColumnCount is 0, then row info does not include varcol info
if(_maxVarColumnCount > 0) {
_buffer.position(_buffer.limit() - nullMask.byteSize() - 2);
rowVarColumnCount = _buffer.getShort(); // number of variable length columns in this row
- varColumnData = new byte[rowVarColumnCount][]; //Holds variable length column data
//Read in the offsets of each of the variable length columns
varColumnOffsets = new short[rowVarColumnCount];
@@ -234,16 +232,7 @@ public class Table {
varColumnOffsets[i] = _buffer.getShort();
}
}
-
-
- //Read in the actual data for each of the variable length columns
- for (short i = 0; i < rowVarColumnCount; i++) {
- _buffer.position(_rowStart + varColumnOffsets[i]);
- varColumnData[i] = new byte[lastVarColumnStart - varColumnOffsets[i]];
- _buffer.get(varColumnData[i]);
- lastVarColumnStart = varColumnOffsets[i];
- }
-
+
// compute start of fixed data
int dataStart = _rowStart + 2;
@@ -269,10 +258,16 @@ public class Table {
{
if (!isNull)
{
- // Refer to already-read-in variable length data. note,
- // varLenTableIndex is from the *end* of the array...
- columnData = varColumnData[rowVarColumnCount -
- column.getVarLenTableIndex() - 1];
+ // read in var length column data
+ int varDataIdx = (rowVarColumnCount -
+ column.getVarLenTableIndex() - 1);
+ int varDataStart = varColumnOffsets[varDataIdx];
+ int varDataEnd = ((varDataIdx > 0) ?
+ varColumnOffsets[varDataIdx - 1] :
+ lastVarColumnStart);
+ columnData = new byte[varDataEnd - varDataStart];
+ _buffer.position(_rowStart + varDataStart);
+ _buffer.get(columnData);
}
}
if (!isNull && columnData != null &&