package com.alibaba.doris.dataserver.action.parser;
import com.alibaba.doris.common.data.ByteWrapper;
import com.alibaba.doris.common.data.Value;
import com.alibaba.doris.common.data.impl.ByteWrapperValueImpl;
import com.alibaba.doris.common.data.util.ByteUtils;
import com.alibaba.doris.dataserver.action.data.ActionData;
import com.alibaba.doris.dataserver.action.data.BaseActionType;
import com.alibaba.doris.dataserver.action.data.CommonActionData;
import com.alibaba.doris.dataserver.net.ByteBufferWrapper;
import com.alibaba.doris.dataserver.net.protocol.text.ProtocolConstant;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class GetActionParser extends BaseActionParser {
public void writeHead(ByteBufferWrapper buffer, ActionData actionData) {
CommonActionData md = (CommonActionData) actionData;
if (md.isSuccess()) {
Value value = md.getValue();
buffer.writeBytes(ProtocolConstant.VALUE);
buffer.writeByte(ProtocolConstant.SPACE);
buffer.writeBytes(md.getKeyBytes());
buffer.writeByte(ProtocolConstant.SPACE);
buffer.writeBytes(ByteUtils.stringToByte(Short.toString(value.getFlag())));
buffer.writeByte(ProtocolConstant.SPACE);
buffer.writeBytes(ByteUtils.stringToByte(Integer.toString((md.getVnode()))));
buffer.writeByte(ProtocolConstant.SPACE);
buffer.writeBytes(ByteUtils.stringToByte(Long.toString(value.getTimestamp())));
buffer.writeByte(ProtocolConstant.SPACE);
if (value instanceof ByteWrapperValueImpl) {
ByteWrapperValueImpl wrapperedValue = (ByteWrapperValueImpl) value;
ByteWrapper byteWrapper = wrapperedValue.getValueByteWrapper();
buffer.writeBytes(ByteUtils.stringToByte(Integer.toString(byteWrapper.getLen())));
buffer.writeBytes(ProtocolConstant.CRLF);
buffer.writeBytes(byteWrapper.getBytes(), byteWrapper.getStartPos(), byteWrapper.getLen());
buffer.writeBytes(ProtocolConstant.CRLF);
} else {
byte[] valueBytes = value.getValueBytes();
buffer.writeBytes(ByteUtils.stringToByte(Integer.toString(valueBytes.length)));
buffer.writeBytes(ProtocolConstant.CRLF);
buffer.writeBytes(valueBytes);
buffer.writeBytes(ProtocolConstant.CRLF);
}
buffer.writeBytes(ProtocolConstant.END);
buffer.writeBytes(ProtocolConstant.CRLF);
} else {
buffer.writeBytes(ProtocolConstant.END);
buffer.writeBytes(ProtocolConstant.CRLF);
}
}
public ActionData readHead(byte[] header, int startPos) {
CommonActionData md = new CommonActionData(BaseActionType.GET);
int[] pos = { startPos };
readKeyBytes(md, header, pos);
readRouteVersion(md, header, pos);
readVnode(md, header, pos);
return md;
}
}