in tablestore/src/main/java/com/alicloud/openservices/tablestore/core/protocol/PlainBufferBuilder.java [226:273]
public static void writePrimaryKeyValue(PrimaryKeyValue value, PlainBufferOutputStream output) throws IOException {
if (value.isInfMin()) {
output.writeRawLittleEndian32(1);
output.writeRawByte(PlainBufferConsts.VT_INF_MIN);
return;
}
if (value.isInfMax()) {
output.writeRawLittleEndian32(1);
output.writeRawByte(PlainBufferConsts.VT_INF_MAX);
return;
}
if (value.isPlaceHolderForAutoIncr()) {
output.writeRawLittleEndian32(1);
output.writeRawByte(PlainBufferConsts.VT_AUTO_INCREMENT);
return;
}
switch (value.getType()) {
case STRING: {
byte[] rawData = value.asStringInBytes();
final int prefixLength = PlainBufferOutputStream.LITTLE_ENDIAN_32_SIZE + 1; // length + type + length
output.writeRawLittleEndian32(prefixLength + rawData.length); // length + type + value
output.writeRawByte(PlainBufferConsts.VT_STRING);
output.writeRawLittleEndian32(rawData.length);
output.writeBytes(rawData);
break;
}
case INTEGER: {
output.writeRawLittleEndian32(1 + PlainBufferOutputStream.LITTLE_ENDIAN_64_SIZE);
output.writeRawByte(PlainBufferConsts.VT_INTEGER);
output.writeRawLittleEndian64(value.asLong());
break;
}
case BINARY: {
byte[] rawData = value.asBinary();
final int prefixLength = PlainBufferOutputStream.LITTLE_ENDIAN_32_SIZE + 1; // length + type + length
output.writeRawLittleEndian32(prefixLength + rawData.length); // length + type + value
output.writeRawByte(PlainBufferConsts.VT_BLOB);
output.writeRawLittleEndian32(rawData.length);
output.writeBytes(rawData);
break;
}
default:
throw new IOException("Bug: unsupported primary key type: " + value.getType());
}
}