提交 dbca79d7 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Use own constants in Data

上级 36aa52bc
......@@ -76,22 +76,44 @@ public class Data {
*/
public static final int LENGTH_LONG = 8;
/**
* Storage type for ValueRow.
*/
private static final int ROW = 27;
private static final int INT_0_15 = 32;
private static final int LONG_0_7 = 48;
private static final int DECIMAL_0_1 = 56;
private static final int DECIMAL_SMALL_0 = 58;
private static final int DECIMAL_SMALL = 59;
private static final int DOUBLE_0_1 = 60;
private static final int FLOAT_0_1 = 62;
private static final int BOOLEAN_FALSE = 64;
private static final int BOOLEAN_TRUE = 65;
private static final int INT_NEG = 66;
private static final int LONG_NEG = 67;
private static final int STRING_0_31 = 68;
private static final byte NULL = 0;
private static final byte BYTE = 2;
private static final byte SHORT = 3;
private static final byte INT = 4;
private static final byte LONG = 5;
private static final byte DECIMAL = 6;
private static final byte DOUBLE = 7;
private static final byte FLOAT = 8;
private static final byte TIME = 9;
private static final byte DATE = 10;
private static final byte TIMESTAMP = 11;
private static final byte BYTES = 12;
private static final byte STRING = 13;
private static final byte STRING_IGNORECASE = 14;
private static final byte BLOB = 15;
private static final byte CLOB = 16;
private static final byte ARRAY = 17;
private static final byte RESULT_SET = 18;
private static final byte JAVA_OBJECT = 19;
private static final byte UUID = 20;
private static final byte STRING_FIXED = 21;
private static final byte GEOMETRY = 22;
private static final byte TIMESTAMP_TZ = 24;
private static final byte ENUM = 25;
private static final byte INTERVAL = 26;
private static final byte ROW = 27;
private static final byte INT_0_15 = 32;
private static final byte LONG_0_7 = 48;
private static final byte DECIMAL_0_1 = 56;
private static final byte DECIMAL_SMALL_0 = 58;
private static final byte DECIMAL_SMALL = 59;
private static final byte DOUBLE_0_1 = 60;
private static final byte FLOAT_0_1 = 62;
private static final byte BOOLEAN_FALSE = 64;
private static final byte BOOLEAN_TRUE = 65;
private static final byte INT_NEG = 66;
private static final byte LONG_NEG = 67;
private static final byte STRING_0_31 = 68;
private static final int BYTES_0_31 = 100;
private static final int LOCAL_TIME = 132;
private static final int LOCAL_DATE = 133;
......@@ -421,32 +443,32 @@ public class Data {
public void writeValue(Value v) {
int start = pos;
if (v == ValueNull.INSTANCE) {
data[pos++] = 0;
data[pos++] = NULL;
return;
}
int type = v.getValueType();
switch (type) {
case Value.BOOLEAN:
writeByte((byte) (v.getBoolean() ? BOOLEAN_TRUE : BOOLEAN_FALSE));
writeByte(v.getBoolean() ? BOOLEAN_TRUE : BOOLEAN_FALSE);
break;
case Value.BYTE:
writeByte((byte) type);
writeByte(BYTE);
writeByte(v.getByte());
break;
case Value.SHORT:
writeByte((byte) type);
writeByte(SHORT);
writeShortInt(v.getShort());
break;
case Value.ENUM:
case Value.INT: {
int x = v.getInt();
if (x < 0) {
writeByte((byte) INT_NEG);
writeByte(INT_NEG);
writeVarInt(-x);
} else if (x < 16) {
writeByte((byte) (INT_0_15 + x));
} else {
writeByte((byte) type);
writeByte(type == Value.INT ? INT : ENUM);
writeVarInt(x);
}
break;
......@@ -454,12 +476,12 @@ public class Data {
case Value.LONG: {
long x = v.getLong();
if (x < 0) {
writeByte((byte) LONG_NEG);
writeByte(LONG_NEG);
writeVarLong(-x);
} else if (x < 8) {
writeByte((byte) (LONG_0_7 + x));
} else {
writeByte((byte) type);
writeByte(LONG);
writeVarLong(x);
}
break;
......@@ -467,7 +489,7 @@ public class Data {
case Value.DECIMAL: {
BigDecimal x = v.getBigDecimal();
if (BigDecimal.ZERO.equals(x)) {
writeByte((byte) DECIMAL_0_1);
writeByte(DECIMAL_0_1);
} else if (BigDecimal.ONE.equals(x)) {
writeByte((byte) (DECIMAL_0_1 + 1));
} else {
......@@ -476,15 +498,15 @@ public class Data {
int bits = b.bitLength();
if (bits <= 63) {
if (scale == 0) {
writeByte((byte) DECIMAL_SMALL_0);
writeByte(DECIMAL_SMALL_0);
writeVarLong(b.longValue());
} else {
writeByte((byte) DECIMAL_SMALL);
writeByte(DECIMAL_SMALL);
writeVarInt(scale);
writeVarLong(b.longValue());
}
} else {
writeByte((byte) type);
writeByte(DECIMAL);
writeVarInt(scale);
byte[] bytes = b.toByteArray();
writeVarInt(bytes.length);
......@@ -503,7 +525,7 @@ public class Data {
writeVarLong(millis);
writeVarLong(nanos);
} else {
writeByte((byte) type);
writeByte(TIME);
writeVarLong(DateTimeUtils.getTimeLocalWithoutDst(v.getTime()));
}
break;
......@@ -513,7 +535,7 @@ public class Data {
long x = ((ValueDate) v).getDateValue();
writeVarLong(x);
} else {
writeByte((byte) type);
writeByte(DATE);
long x = DateTimeUtils.getTimeLocalWithoutDst(v.getDate());
writeVarLong(x / MILLIS_PER_MINUTE);
}
......@@ -532,7 +554,7 @@ public class Data {
writeVarLong(nanos);
} else {
Timestamp ts = v.getTimestamp();
writeByte((byte) type);
writeByte(TIMESTAMP);
writeVarLong(DateTimeUtils.getTimeLocalWithoutDst(ts));
writeVarInt(ts.getNanos() % 1_000_000);
}
......@@ -540,7 +562,7 @@ public class Data {
}
case Value.TIMESTAMP_TZ: {
ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v;
writeByte((byte) type);
writeByte(TIMESTAMP_TZ);
writeVarLong(ts.getDateValue());
writeVarLong(ts.getTimeNanos());
writeVarInt(ts.getTimeZoneOffsetMins());
......@@ -549,7 +571,7 @@ public class Data {
case Value.GEOMETRY:
// fall though
case Value.JAVA_OBJECT: {
writeByte((byte) type);
writeByte(type == Value.GEOMETRY ? GEOMETRY : JAVA_OBJECT);
byte[] b = v.getBytesNoCopy();
int len = b.length;
writeVarInt(len);
......@@ -563,14 +585,14 @@ public class Data {
writeByte((byte) (BYTES_0_31 + len));
write(b, 0, len);
} else {
writeByte((byte) type);
writeByte(BYTES);
writeVarInt(len);
write(b, 0, len);
}
break;
}
case Value.UUID: {
writeByte((byte) type);
writeByte(UUID);
ValueUuid uuid = (ValueUuid) v;
writeLong(uuid.getHigh());
writeLong(uuid.getLow());
......@@ -583,14 +605,17 @@ public class Data {
writeByte((byte) (STRING_0_31 + len));
writeStringWithoutLength(s, len);
} else {
writeByte((byte) type);
writeByte(STRING);
writeString(s);
}
break;
}
case Value.STRING_IGNORECASE:
writeByte(STRING_IGNORECASE);
writeString(v.getString());
break;
case Value.STRING_FIXED:
writeByte((byte) type);
writeByte(STRING_FIXED);
writeString(v.getString());
break;
case Value.DOUBLE: {
......@@ -600,9 +625,9 @@ public class Data {
} else {
long d = Double.doubleToLongBits(x);
if (d == ValueDouble.ZERO_BITS) {
writeByte((byte) DOUBLE_0_1);
writeByte(DOUBLE_0_1);
} else {
writeByte((byte) type);
writeByte(DOUBLE);
writeVarLong(Long.reverse(d));
}
}
......@@ -615,9 +640,9 @@ public class Data {
} else {
int f = Float.floatToIntBits(x);
if (f == ValueFloat.ZERO_BITS) {
writeByte((byte) FLOAT_0_1);
writeByte(FLOAT_0_1);
} else {
writeByte((byte) type);
writeByte(FLOAT);
writeVarInt(Integer.reverse(f));
}
}
......@@ -625,7 +650,7 @@ public class Data {
}
case Value.BLOB:
case Value.CLOB: {
writeByte((byte) type);
writeByte(type == Value.BLOB ? BLOB : CLOB);
if (v instanceof ValueLob) {
ValueLob lob = (ValueLob) v;
byte[] small = lob.getSmall();
......@@ -663,7 +688,7 @@ public class Data {
}
case Value.ARRAY:
case Value.ROW: {
writeByte((byte) (type == Value.ARRAY ? Value.ARRAY : /* Special storage type for ValueRow */ ROW));
writeByte(type == Value.ARRAY ? ARRAY : ROW);
Value[] list = ((ValueCollectionBase) v).getList();
writeVarInt(list.length);
for (Value x : list) {
......@@ -672,7 +697,7 @@ public class Data {
break;
}
case Value.RESULT_SET: {
writeByte((byte) type);
writeByte(RESULT_SET);
ResultInterface result = ((ValueResultSet) v).getResult();
result.reset();
int columnCount = result.getVisibleColumnCount();
......@@ -705,7 +730,7 @@ public class Data {
if (interval.isNegative()) {
ordinal = ~ordinal;
}
writeByte((byte) Value.INTERVAL_YEAR);
writeByte(INTERVAL);
writeByte((byte) ordinal);
writeVarLong(interval.getLeading());
break;
......@@ -723,7 +748,7 @@ public class Data {
if (interval.isNegative()) {
ordinal = ~ordinal;
}
writeByte((byte) Value.INTERVAL_YEAR);
writeByte(INTERVAL);
writeByte((byte) ordinal);
writeVarLong(interval.getLeading());
writeVarLong(interval.getRemaining());
......@@ -732,7 +757,7 @@ public class Data {
default:
if (JdbcUtils.customDataTypesHandler != null) {
byte[] b = v.getBytesNoCopy();
writeByte(CUSTOM_DATA_TYPE);
writeByte((byte) CUSTOM_DATA_TYPE);
writeVarInt(type);
writeVarInt(b.length);
write(b, 0, b.length);
......@@ -752,7 +777,7 @@ public class Data {
public Value readValue() {
int type = data[pos++] & 255;
switch (type) {
case Value.NULL:
case NULL:
return ValueNull.INSTANCE;
case BOOLEAN_TRUE:
return ValueBoolean.TRUE;
......@@ -760,16 +785,16 @@ public class Data {
return ValueBoolean.FALSE;
case INT_NEG:
return ValueInt.get(-readVarInt());
case Value.ENUM:
case Value.INT:
case ENUM:
case INT:
return ValueInt.get(readVarInt());
case LONG_NEG:
return ValueLong.get(-readVarLong());
case Value.LONG:
return ValueLong.get(readVarLong());
case Value.BYTE:
case BYTE:
return ValueByte.get(readByte());
case Value.SHORT:
case SHORT:
return ValueShort.get(readShortInt());
case DECIMAL_0_1:
return (ValueDecimal) ValueDecimal.ZERO;
......@@ -781,7 +806,7 @@ public class Data {
int scale = readVarInt();
return ValueDecimal.get(BigDecimal.valueOf(readVarLong(), scale));
}
case Value.DECIMAL: {
case DECIMAL: {
int scale = readVarInt();
int len = readVarInt();
byte[] buff = Utils.newBytes(len);
......@@ -792,7 +817,7 @@ public class Data {
case LOCAL_DATE: {
return ValueDate.fromDateValue(readVarLong());
}
case Value.DATE: {
case DATE: {
long x = readVarLong() * MILLIS_PER_MINUTE;
return ValueDate.fromMillis(DateTimeUtils.getTimeUTCWithoutDst(x));
}
......@@ -800,7 +825,7 @@ public class Data {
long nanos = readVarLong() * 1_000_000 + readVarLong();
return ValueTime.fromNanos(nanos);
}
case Value.TIME:
case TIME:
// need to normalize the year, month and day
return ValueTime.fromMillis(
DateTimeUtils.getTimeUTCWithoutDst(readVarLong()));
......@@ -809,42 +834,42 @@ public class Data {
long nanos = readVarLong() * 1_000_000 + readVarLong();
return ValueTimestamp.fromDateValueAndNanos(dateValue, nanos);
}
case Value.TIMESTAMP: {
case TIMESTAMP: {
return ValueTimestamp.fromMillisNanos(
DateTimeUtils.getTimeUTCWithoutDst(readVarLong()),
readVarInt() % 1_000_000);
}
case Value.TIMESTAMP_TZ: {
case TIMESTAMP_TZ: {
long dateValue = readVarLong();
long nanos = readVarLong();
short tz = (short) readVarInt();
return ValueTimestampTimeZone.fromDateValueAndNanos(dateValue, nanos, tz);
}
case Value.BYTES: {
case BYTES: {
int len = readVarInt();
byte[] b = Utils.newBytes(len);
read(b, 0, len);
return ValueBytes.getNoCopy(b);
}
case Value.GEOMETRY: {
case GEOMETRY: {
int len = readVarInt();
byte[] b = Utils.newBytes(len);
read(b, 0, len);
return ValueGeometry.get(b);
}
case Value.JAVA_OBJECT: {
case JAVA_OBJECT: {
int len = readVarInt();
byte[] b = Utils.newBytes(len);
read(b, 0, len);
return ValueJavaObject.getNoCopy(null, b, handler);
}
case Value.UUID:
case UUID:
return ValueUuid.get(readLong(), readLong());
case Value.STRING:
case STRING:
return ValueString.get(readString());
case Value.STRING_IGNORECASE:
case STRING_IGNORECASE:
return ValueStringIgnoreCase.get(readString());
case Value.STRING_FIXED:
case STRING_FIXED:
return ValueStringFixed.get(readString());
case FLOAT_0_1:
return ValueFloat.ZERO;
......@@ -854,24 +879,22 @@ public class Data {
return ValueDouble.ZERO;
case DOUBLE_0_1 + 1:
return ValueDouble.ONE;
case Value.DOUBLE:
return ValueDouble.get(Double.longBitsToDouble(
Long.reverse(readVarLong())));
case Value.FLOAT:
return ValueFloat.get(Float.intBitsToFloat(
Integer.reverse(readVarInt())));
case Value.BLOB:
case Value.CLOB: {
case DOUBLE:
return ValueDouble.get(Double.longBitsToDouble(Long.reverse(readVarLong())));
case FLOAT:
return ValueFloat.get(Float.intBitsToFloat(Integer.reverse(readVarInt())));
case BLOB:
case CLOB: {
int smallLen = readVarInt();
if (smallLen >= 0) {
byte[] small = Utils.newBytes(smallLen);
read(small, 0, smallLen);
return ValueLobDb.createSmallLob(type, small);
return ValueLobDb.createSmallLob(type == BLOB ? Value.BLOB : Value.CLOB, small);
} else if (smallLen == -3) {
int tableId = readVarInt();
long lobId = readVarLong();
long precision = readVarLong();
return ValueLobDb.create(type, handler, tableId,
return ValueLobDb.create(type == BLOB ? Value.BLOB : Value.CLOB, handler, tableId,
lobId, null, precision);
} else {
int tableId = readVarInt();
......@@ -886,14 +909,14 @@ public class Data {
}
if (smallLen == -2) {
String filename = readString();
return ValueLob.openUnlinked(type, handler, tableId,
return ValueLob.openUnlinked(type == BLOB ? Value.BLOB : Value.CLOB, handler, tableId,
objectId, precision, compression, filename);
}
return ValueLob.openLinked(type, handler, tableId,
return ValueLob.openLinked(type == BLOB ? Value.BLOB : Value.CLOB, handler, tableId,
objectId, precision, compression);
}
}
case Value.ARRAY:
case ARRAY:
case ROW: // Special storage type for ValueRow
{
int len = readVarInt();
......@@ -901,9 +924,9 @@ public class Data {
for (int i = 0; i < len; i++) {
list[i] = readValue();
}
return type == Value.ARRAY ? ValueArray.get(list) : ValueRow.get(list);
return type == ARRAY ? ValueArray.get(list) : ValueRow.get(list);
}
case Value.RESULT_SET: {
case RESULT_SET: {
SimpleResult rs = new SimpleResult();
int columns = readVarInt();
for (int i = 0; i < columns; i++) {
......@@ -918,7 +941,7 @@ public class Data {
}
return ValueResultSet.get(rs);
}
case Value.INTERVAL_YEAR: {
case INTERVAL: {
int ordinal = readByte();
boolean negative = ordinal < 0;
if (negative) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论