package com.taobao.tair.extend.packet.hset.request;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.taobao.tair.comm.Transcoder;
import com.taobao.tair.etc.TairConstant;
import com.taobao.tair.packet.BasePacket;
public class RequestHMsetPacket extends BasePacket {
private final static int HEADER_LEN = 1 + 2 + 2 + 4 + 4 + 4;
private short namespace = 0;
private short version = 0;
private int expire = 0;
private Object key = null;
private Map<Object, Object> field_values
= new HashMap<Object, Object>();
private List<byte[]> bytefieldvalues = new ArrayList<byte[]>();
public RequestHMsetPacket(Transcoder transcoder) {
super(transcoder);
pcode = TairConstant.TAIR_REQ_HMSET_PACKET;
}
public RequestHMsetPacket() {
super();
pcode = TairConstant.TAIR_REQ_HMSET_PACKET;
}
public int encode() {
byte[] keybytes = null;
byte[] fieldbytes = null;
byte[] valuebytes = null;
if(key == null || field_values.isEmpty()) {
return TairConstant.SERIALIZEERROR;
}
try {
keybytes = transcoder.encode(key);
} catch (Throwable e) {
return TairConstant.SERIALIZEERROR;
}
if(keybytes == null) {
return TairConstant.SERIALIZEERROR;
}
if(keybytes.length >= TairConstant.TAIR_KEY_MAX_LENTH) {
return TairConstant.KEYTOLARGE;
}
int fieldvalueslen = 0;
Set<Entry<Object, Object>> fvset = field_values.entrySet();
for(Entry<Object, Object> fv : fvset) {
try {
fieldbytes = transcoder.encode(fv.getKey());
if(fv.getValue() instanceof Long || fv.getValue() instanceof Integer
|| fv.getValue() instanceof Short) {
valuebytes = String.valueOf(fv.getValue()).getBytes();
} else {
valuebytes = transcoder.encode(fv.getValue());
}
} catch (Throwable e) {
return TairConstant.SERIALIZEERROR;
}
if(fieldbytes == null || valuebytes == null) {
return TairConstant.SERIALIZEERROR;
}
if(fieldbytes.length >= TairConstant.TAIR_VALUE_MAX_LENGTH ||
valuebytes.length >= TairConstant.TAIR_VALUE_MAX_LENGTH) {
return TairConstant.VALUETOLARGE;
}
bytefieldvalues.add(fieldbytes);
fieldvalueslen += fieldbytes.length;
bytefieldvalues.add(valuebytes);
fieldvalueslen += valuebytes.length;
}
writePacketBegin(HEADER_LEN + keybytes.length + fieldvalueslen + 4*bytefieldvalues.size());
byteBuffer.put((byte)0);
byteBuffer.putShort(namespace);
byteBuffer.putShort(version);
byteBuffer.putInt(expire);
byteBuffer.putInt(keybytes.length);
byteBuffer.put(keybytes);
byteBuffer.putInt(bytefieldvalues.size());
for(byte[] tfieldbytes : bytefieldvalues) {
byteBuffer.putInt(tfieldbytes.length);
byteBuffer.put(tfieldbytes);
}
writePacketEnd();
return 0;
}
public boolean decode() {
throw new UnsupportedOperationException();
}
public void setNamespace(short namespace) {
this.namespace = namespace;
}
public short getNamespace() {
return this.namespace;
}
public void setVersion(short version) {
this.version = version;
}
public short getVersion() {
return this.version;
}
public void setExpire(int expire) {
this.expire = expire;
}
public int getExpire() {
return this.expire;
}
public void setKey(Object key) {
this.key = key;
}
public Object getKey() {
return this.key;
}
public void addFieldValue(Object field, Object value) {
if (field == null || value == null) {
return;
}
field_values.put(field, value);
}
public Object getValue(Object field) {
if (field == null) {
return null;
}
return field_values.get(field);
}
public void setValues(Map<Object, Object> field_values) {
this.field_values = field_values;
}
public Map<Object, Object> getValues() {
return field_values;
}
}