📄 datapage.java
字号:
break;
case Value.LONG:
writeLong(v.getLong());
break;
case Value.DECIMAL:
String s = v.getString();
writeString(s);
break;
case Value.TIME:
writeLong(v.getTimeNoCopy().getTime());
break;
case Value.DATE:
writeLong(v.getDateNoCopy().getTime());
break;
case Value.TIMESTAMP: {
Timestamp ts = v.getTimestampNoCopy();
writeLong(ts.getTime());
writeInt(ts.getNanos());
break;
}
case Value.JAVA_OBJECT:
case Value.BYTES: {
byte[] b = v.getBytesNoCopy();
writeInt(b.length);
write(b, 0, b.length);
break;
}
case Value.UUID: {
ValueUuid uuid = (ValueUuid) v;
writeLong(uuid.getHigh());
writeLong(uuid.getLow());
break;
}
case Value.STRING:
case Value.STRING_IGNORECASE:
case Value.STRING_FIXED:
writeString(v.getString());
break;
case Value.DOUBLE:
writeLong(Double.doubleToLongBits(v.getDouble()));
break;
case Value.FLOAT:
writeInt(Float.floatToIntBits(v.getFloat()));
break;
case Value.BLOB:
case Value.CLOB: {
ValueLob lob = (ValueLob) v;
lob.convertToFileIfRequired(handler);
byte[] small = lob.getSmall();
if (small == null) {
// -2 for historical reasons (-1 didn't store precision)
int type = -2;
if (!lob.isLinked()) {
type = -3;
}
writeInt(type);
writeInt(lob.getTableId());
writeInt(lob.getObjectId());
writeLong(lob.getPrecision());
writeByte((byte) (lob.useCompression() ? 1 : 0));
if (type == -3) {
writeString(lob.getFileName());
}
} else {
writeInt(small.length);
write(small, 0, small.length);
}
break;
}
case Value.ARRAY: {
Value[] list = ((ValueArray) v).getList();
writeInt(list.length);
for (int i = 0; i < list.length; i++) {
writeValue(list[i]);
}
break;
}
default:
throw Message.getInternalError("type=" + v.getType());
}
if (SysProperties.CHECK2) {
if (pos - start != getValueLen(v)) {
throw Message
.getInternalError("value size error: got " + (pos - start) + " expected " + getValueLen(v));
}
}
}
public int getValueLen(Value v) throws SQLException {
if (v == ValueNull.INSTANCE) {
return 1;
}
switch (v.getType()) {
case Value.BOOLEAN:
case Value.BYTE:
case Value.SHORT:
case Value.INT:
return 1 + getIntLen();
case Value.LONG:
return 1 + getLongLen(v.getLong());
case Value.DOUBLE:
return 1 + getLongLen(Double.doubleToLongBits(v.getDouble()));
case Value.FLOAT:
return 1 + getIntLen();
case Value.STRING:
case Value.STRING_IGNORECASE:
case Value.STRING_FIXED:
return 1 + getStringLen(v.getString());
case Value.DECIMAL:
return 1 + getStringLen(v.getString());
case Value.JAVA_OBJECT:
case Value.BYTES: {
int len = v.getBytesNoCopy().length;
return 1 + getIntLen() + len;
}
case Value.UUID: {
ValueUuid uuid = (ValueUuid) v;
return 1 + getLongLen(uuid.getHigh()) + getLongLen(uuid.getLow());
}
case Value.TIME:
return 1 + getLongLen(v.getTimeNoCopy().getTime());
case Value.DATE:
return 1 + getLongLen(v.getDateNoCopy().getTime());
case Value.TIMESTAMP: {
Timestamp ts = v.getTimestampNoCopy();
return 1 + getLongLen(ts.getTime()) + getIntLen();
}
case Value.BLOB:
case Value.CLOB: {
int len = 1;
ValueLob lob = (ValueLob) v;
lob.convertToFileIfRequired(handler);
byte[] small = lob.getSmall();
if (small != null) {
len += getIntLen() + small.length;
} else {
len += getIntLen() + getIntLen() + getIntLen() + getLongLen(lob.getPrecision()) + 1;
if (!lob.isLinked()) {
len += getStringLen(lob.getFileName());
}
}
return len;
}
case Value.ARRAY: {
Value[] list = ((ValueArray) v).getList();
int len = 1 + getIntLen();
for (int i = 0; i < list.length; i++) {
len += getValueLen(list[i]);
}
return len;
}
default:
throw Message.getInternalError("type=" + v.getType());
}
}
public Value readValue() throws SQLException {
int dataType = data[pos++];
if (dataType == '-') {
return ValueNull.INSTANCE;
}
dataType = (dataType - 'a');
switch (dataType) {
case Value.BOOLEAN:
return ValueBoolean.get(readInt() == 1);
case Value.BYTE:
return ValueByte.get((byte) readInt());
case Value.SHORT:
return ValueShort.get((short) readInt());
case Value.INT:
return ValueInt.get(readInt());
case Value.LONG:
return ValueLong.get(readLong());
case Value.DECIMAL:
return ValueDecimal.get(new BigDecimal(readString()));
case Value.DATE:
return ValueDate.getNoCopy(new Date(readLong()));
case Value.TIME:
// need to normalize the year, month and day
return ValueTime.get(new Time(readLong()));
case Value.TIMESTAMP: {
Timestamp ts = new Timestamp(readLong());
ts.setNanos(readInt());
return ValueTimestamp.getNoCopy(ts);
}
case Value.JAVA_OBJECT: {
int len = readInt();
byte[] b = new byte[len];
read(b, 0, len);
return ValueJavaObject.getNoCopy(b);
}
case Value.BYTES: {
int len = readInt();
byte[] b = new byte[len];
read(b, 0, len);
return ValueBytes.getNoCopy(b);
}
case Value.UUID:
return ValueUuid.get(readLong(), readLong());
case Value.STRING:
return ValueString.get(readString());
case Value.STRING_IGNORECASE:
return ValueStringIgnoreCase.get(readString());
case Value.STRING_FIXED:
return ValueStringFixed.get(readString());
case Value.DOUBLE:
return ValueDouble.get(Double.longBitsToDouble(readLong()));
case Value.FLOAT:
return ValueFloat.get(Float.intBitsToFloat(readInt()));
case Value.BLOB:
case Value.CLOB: {
int smallLen = readInt();
if (smallLen >= 0) {
byte[] small = new byte[smallLen];
read(small, 0, smallLen);
return ValueLob.createSmallLob(dataType, small);
} else {
int tableId = readInt();
int objectId = readInt();
long precision = 0;
boolean compression = false;
// -2 is for historical reasons (-1 didn't store precision)
if (smallLen == -2 || smallLen == -3) {
precision = readLong();
compression = readByte() == 1;
}
ValueLob lob = ValueLob.open(dataType, handler, tableId, objectId, precision, compression);
if (smallLen == -3) {
lob.setFileName(readString());
}
return lob;
}
}
case Value.ARRAY: {
int len = readInt();
Value[] list = new Value[len];
for (int i = 0; i < len; i++) {
list[i] = readValue();
}
return ValueArray.get(list);
}
default:
throw Message.getInternalError("type=" + dataType);
}
}
public void fillAligned() {
// TODO datapage: fillAligned should not use a fixed constant '2'
// 0..6 > 8, 7..14 > 16, 15..22 > 24, ...
fill(MathUtils.roundUp(pos + 2, Constants.FILE_BLOCK_SIZE));
}
public void setPos(int pos) {
this.pos = pos;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -