ソースを参照

do not ask me why, but numeric columns are considered variable length, even though they are always the same size


git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@110 f203690c-595d-4dc9-a70b-905162fa7fd2
tags/rel_1_1_7
James Ahlborn 17年前
コミット
2cc11038b9

+ 13
- 4
src/java/com/healthmarketscience/jackcess/Column.java ファイルの表示

throw new IllegalArgumentException("invalid fixed length size"); throw new IllegalArgumentException("invalid fixed length size");
} }
} else if(!getType().isLongValue()) { } else if(!getType().isLongValue()) {
if((getLength() < 0) || (getLength() > getType().getMaxSize())) {
if((getLength() < getType().getMinSize()) ||
(getLength() > getType().getMaxSize())) {
throw new IllegalArgumentException("var length out of range"); throw new IllegalArgumentException("var length out of range");
} }
} }
// this is an "inline" var length field // this is an "inline" var length field
switch(getType()) { switch(getType()) {
case NUMERIC:
// don't ask me why numerics are "var length" columns...
ByteBuffer buffer = ByteBuffer.allocate(getLength());
System.out.println("BUZ NUMERIC " + getLength());
buffer.order(order);
writeNumericValue(buffer, obj);
buffer.flip();
System.out.println("BUZ NUMERIC rem " + buffer.remaining());
return buffer;

case TEXT: case TEXT:
CharSequence text = toCharSequence(obj); CharSequence text = toCharSequence(obj);
int maxChars = getLength() / 2; int maxChars = getLength() / 2;
byte[] encodedData = encodeUncompressedText(text).array(); byte[] encodedData = encodeUncompressedText(text).array();
obj = encodedData; obj = encodedData;
break; break;
case BINARY: case BINARY:
// should already be "encoded" // should already be "encoded"
break; break;
case MONEY: case MONEY:
writeCurrencyValue(buffer, obj); writeCurrencyValue(buffer, obj);
break; break;
case NUMERIC:
writeNumericValue(buffer, obj);
break;
case GUID: case GUID:
writeGUIDValue(buffer, obj); writeGUIDValue(buffer, obj);
break; break;

+ 22
- 11
src/java/com/healthmarketscience/jackcess/DataType.java ファイルの表示

FLOAT((byte) 0x06, Types.FLOAT, 4), FLOAT((byte) 0x06, Types.FLOAT, 4),
DOUBLE((byte) 0x07, Types.DOUBLE, 8), DOUBLE((byte) 0x07, Types.DOUBLE, 8),
SHORT_DATE_TIME((byte) 0x08, Types.TIMESTAMP, 8), SHORT_DATE_TIME((byte) 0x08, Types.TIMESTAMP, 8),
BINARY((byte) 0x09, Types.BINARY, null, true, false, 255, 255),
TEXT((byte) 0x0A, Types.VARCHAR, null, true, false, 50 * 2,
BINARY((byte) 0x09, Types.BINARY, null, true, false, 0, 255, 255),
TEXT((byte) 0x0A, Types.VARCHAR, null, true, false, 0, 50 * 2,
(int)JetFormat.TEXT_FIELD_MAX_LENGTH), (int)JetFormat.TEXT_FIELD_MAX_LENGTH),
OLE((byte) 0x0B, Types.LONGVARBINARY, null, true, true, null, 0xFFFFFF),
MEMO((byte) 0x0C, Types.LONGVARCHAR, null, true, true, null, 0xFFFFFF),
OLE((byte) 0x0B, Types.LONGVARBINARY, null, true, true, 0, null, 0xFFFFFF),
MEMO((byte) 0x0C, Types.LONGVARCHAR, null, true, true, 0, null, 0xFFFFFF),
UNKNOWN_0D((byte) 0x0D), UNKNOWN_0D((byte) 0x0D),
GUID((byte) 0x0F, null, 16), GUID((byte) 0x0F, null, 16),
NUMERIC((byte) 0x10, Types.NUMERIC, 17, false, false, null, null,
// for some reason numeric is "var len" even though it has a fixed size...
NUMERIC((byte) 0x10, Types.NUMERIC, null, true, false, 17, 17, 17,
true, 0, 0, 28, 1, 18, 28); true, 0, 0, 28, 1, 18, 28);


/** Map of SQL types to Access data types */ /** Map of SQL types to Access data types */
private byte _value; private byte _value;
/** Size in bytes of fixed length columns */ /** Size in bytes of fixed length columns */
private Integer _fixedSize; private Integer _fixedSize;
/** default size for var length columns */
/** min in bytes size for var length columns */
private Integer _minSize;
/** default size in bytes for var length columns */
private Integer _defaultSize; private Integer _defaultSize;
/** Max size in bytes */
/** Max size in bytes for var length columns */
private Integer _maxSize; private Integer _maxSize;
/** SQL type equivalent, or null if none defined */ /** SQL type equivalent, or null if none defined */
private Integer _sqlType; private Integer _sqlType;
} }
private DataType(byte value, Integer sqlType, Integer fixedSize) { private DataType(byte value, Integer sqlType, Integer fixedSize) {
this(value, sqlType, fixedSize, false, false, null, null);
this(value, sqlType, fixedSize, false, false, null, null, null);
} }


private DataType(byte value, Integer sqlType, Integer fixedSize, private DataType(byte value, Integer sqlType, Integer fixedSize,
boolean variableLength, boolean variableLength,
boolean longValue, boolean longValue,
Integer minSize,
Integer defaultSize, Integer defaultSize,
Integer maxSize) { Integer maxSize) {
this(value, sqlType, fixedSize, variableLength, longValue, defaultSize,
maxSize, false, null, null, null, null, null, null);
this(value, sqlType, fixedSize, variableLength, longValue,
minSize, defaultSize, maxSize,
false, null, null, null, null, null, null);
} }
private DataType(byte value, Integer sqlType, Integer fixedSize, private DataType(byte value, Integer sqlType, Integer fixedSize,
boolean variableLength, boolean variableLength,
boolean longValue, boolean longValue,
Integer minSize,
Integer defaultSize, Integer defaultSize,
Integer maxSize, Integer maxSize,
boolean hasScalePrecision, boolean hasScalePrecision,
_fixedSize = fixedSize; _fixedSize = fixedSize;
_variableLength = variableLength; _variableLength = variableLength;
_longValue = longValue; _longValue = longValue;
_minSize = minSize;
_defaultSize = defaultSize; _defaultSize = defaultSize;
_maxSize = maxSize; _maxSize = maxSize;
_hasScalePrecision = hasScalePrecision; _hasScalePrecision = hasScalePrecision;
} }
} }


public int getMinSize() {
return _minSize;
}

public int getDefaultSize() { public int getDefaultSize() {
return _defaultSize; return _defaultSize;
} }
throw new SQLException("Unsupported SQL type: " + sqlType); throw new SQLException("Unsupported SQL type: " + sqlType);
} }
} }
} }

+ 3
- 3
src/java/com/healthmarketscience/jackcess/Database.java ファイルの表示

buffer.put((byte) 0x06); //Unknown buffer.put((byte) 0x06); //Unknown
buffer.putShort((short) 0); //Unknown buffer.putShort((short) 0); //Unknown
buffer.putShort(columnNumber); //Column Number buffer.putShort(columnNumber); //Column Number
if (col.getType().isVariableLength()) {
if (col.isVariableLength()) {
buffer.putShort(variableOffset++); buffer.putShort(variableOffset++);
} else { } else {
buffer.putShort((short) 0); buffer.putShort((short) 0);
buffer.put((byte) 0x00); //unused buffer.put((byte) 0x00); //unused
} }
buffer.putShort((short) 0); //Unknown buffer.putShort((short) 0); //Unknown
if (col.getType().isVariableLength()) { //Variable length
if (col.isVariableLength()) { //Variable length
buffer.put((byte) 0x2); buffer.put((byte) 0x2);
} else { } else {
buffer.put((byte) 0x3); buffer.put((byte) 0x3);
} }
buffer.putInt(0); //Unknown, but always 0. buffer.putInt(0); //Unknown, but always 0.
//Offset for fixed length columns //Offset for fixed length columns
if (col.getType().isVariableLength()) {
if (col.isVariableLength()) {
buffer.putShort((short) 0); buffer.putShort((short) 0);
} else { } else {
buffer.putShort(fixedOffset); buffer.putShort(fixedOffset);

読み込み中…
キャンセル
保存