/**
* <pre>
* This program is free software; you can redistribute it and/or modify it under the terms of
* the GNU AFFERO GENERAL PUBLIC LICENSE as published by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU AFFERO GENERAL PUBLIC LICENSE for more details.
* You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE along with this program;
* if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* </pre>
*/
package com.meidusa.amoeba.mysql.net.packet;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import com.meidusa.amoeba.mysql.jdbc.Messages;
/**
* ����ģʽ��ȡpacket
*
* @author <a href=mailto:piratebase@sina.com>Struct chen</a>
*/
public class BlockedPacketIO {
public static final int readFully(InputStream in, byte[] b, int off, int len) throws IOException {
if (len < 0) {
throw new IndexOutOfBoundsException();
}
int n = 0;
while (n < len) {
int count = in.read(b, off + n, len - n);
if (count < 0) {
throw new EOFException(Messages.getString("MysqlIO.EOF", new Object[] { new Integer(len), new Integer(n) }));
}
n += count;
}
return n;
}
/**
* @return the packet from the server.
* @throws SQLException DOCUMENT ME!
* @throws IOException
*/
public static final MysqlPacketBuffer readFullyPacketBuffer(InputStream mysqlInput) throws IOException {
byte[] packetHeaderBuf = new byte[4];
int lengthRead = readFully(mysqlInput, packetHeaderBuf, 0, 4);
if (lengthRead < 4) {
throw new IOException(Messages.getString("MysqlIO.1")); //$NON-NLS-1$
}
// ���ݰ�����
int packetLength = (packetHeaderBuf[0] & 0xff) + ((packetHeaderBuf[1] & 0xff) << 8) + ((packetHeaderBuf[2] & 0xff) << 16);
// ����������
int bufferLength = packetLength + 4;
// Read data
byte[] buffer = new byte[bufferLength + 1];
System.arraycopy(packetHeaderBuf, 0, buffer, 0, 4);
int numBytesRead = readFully(mysqlInput, buffer, 4, packetLength);
if (numBytesRead != packetLength) {
throw new IOException("Short read, expected " + packetLength + " bytes, only read " + numBytesRead);
}
buffer[bufferLength] = 0;
MysqlPacketBuffer packet = new MysqlPacketBuffer(buffer);
packet.setBufLength(bufferLength + 1);
return packet;
}
}