package com.alibaba.otter.canal.parse.driver.mysql.utils;
import java.io.IOException;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.otter.canal.parse.driver.mysql.packets.HeaderPacket;
import com.alibaba.otter.canal.parse.driver.mysql.packets.IPacket;
import com.alibaba.otter.canal.parse.driver.mysql.packets.PacketWithHeaderPacket;
public class ChannelBufferHelper {
protected transient final Logger logger = LoggerFactory.getLogger(ChannelBufferHelper.class);
public final HeaderPacket assembleHeaderPacket(ChannelBuffer buffer) {
HeaderPacket header = new HeaderPacket();
byte[] headerBytes = new byte[MSC.HEADER_PACKET_LENGTH];
buffer.readBytes(headerBytes);
header.fromBytes(headerBytes);
return header;
}
public final PacketWithHeaderPacket assembleBodyPacketWithHeader(ChannelBuffer buffer, HeaderPacket header,
PacketWithHeaderPacket body) throws IOException {
if (body.getHeader() == null) {
body.setHeader(header);
}
logger.debug("body packet type:{}", body.getClass());
logger.debug("read body packet with packet length: {} ", header.getPacketBodyLength());
byte[] packetBytes = new byte[header.getPacketBodyLength()];
logger.debug("readable bytes before reading body:{}", buffer.readableBytes());
buffer.readBytes(packetBytes);
body.fromBytes(packetBytes);
logger.debug("body packet: {}", body);
return body;
}
public final ChannelBuffer createHeaderWithPacketNumberPlusOne(int bodyLength, byte packetNumber) {
HeaderPacket header = new HeaderPacket();
header.setPacketBodyLength(bodyLength);
header.setPacketSequenceNumber((byte) (packetNumber + 1));
return ChannelBuffers.wrappedBuffer(header.toBytes());
}
public final ChannelBuffer createHeader(int bodyLength, byte packetNumber) {
HeaderPacket header = new HeaderPacket();
header.setPacketBodyLength(bodyLength);
header.setPacketSequenceNumber(packetNumber);
return ChannelBuffers.wrappedBuffer(header.toBytes());
}
public final ChannelBuffer buildChannelBufferFromCommandPacket(IPacket packet) throws IOException {
byte[] bodyBytes = packet.toBytes();
ChannelBuffer header = createHeader(bodyBytes.length, (byte) 0);
return ChannelBuffers.wrappedBuffer(header, ChannelBuffers.wrappedBuffer(bodyBytes));
}
}