/*
* Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software;Designed and Developed mainly by many Chinese
* opensource volunteers. you can redistribute it and/or modify it under the
* terms of the GNU General Public License version 2 only, as published by the
* Free Software Foundation.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Any questions about this component can be directed to it's project Web address
* https://code.google.com/p/opencloudb/.
*
*/
package org.opencloudb.mysql;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* @author mycat
*/
public class StreamUtil {
private static final long NULL_LENGTH = -1;
private static final byte[] EMPTY_BYTES = new byte[0];
public static final void read(InputStream in, byte[] b, int offset, int length) throws IOException {
for (int got = 0; length > 0;) {
got = in.read(b, offset, length);
if (got < 0) {
throw new EOFException();
}
offset += got;
length -= got;
}
}
public static final byte read(InputStream in) throws IOException {
int got = in.read();
if (got < 0) {
throw new EOFException();
}
return (byte) (got & 0xff);
}
public static final int readUB2(InputStream in) throws IOException {
byte[] b = new byte[2];
read(in, b, 0, b.length);
int i = b[0] & 0xff;
i |= (b[1] & 0xff) << 8;
return i;
}
public static final int readUB3(InputStream in) throws IOException {
byte[] b = new byte[3];
read(in, b, 0, b.length);
int i = b[0] & 0xff;
i |= (b[1] & 0xff) << 8;
i |= (b[2] & 0xff) << 16;
return i;
}
public static final int readInt(InputStream in) throws IOException {
byte[] b = new byte[4];
read(in, b, 0, b.length);
int i = b[0] & 0xff;
i |= (b[1] & 0xff) << 8;
i |= (b[2] & 0xff) << 16;
i |= (b[3] & 0xff) << 24;
return i;
}
public static final float readFloat(InputStream in) throws IOException {
return Float.intBitsToFloat(readInt(in));
}
public static final long readUB4(InputStream in) throws IOException {
byte[] b = new byte[4];
read(in, b, 0, b.length);
long l = (long) (b[0] & 0xff);
l |= (long) (b[1] & 0xff) << 8;
l |= (long) (b[2] & 0xff) << 16;
l |= (long) (b[3] & 0xff) << 24;
return l;
}
public static final long readLong(InputStream in) throws IOException {
byte[] b = new byte[8];
read(in, b, 0, b.length);
long l = (long) (b[0] & 0xff);
l |= (long) (b[1] & 0xff) << 8;
l |= (long) (b[2] & 0xff) << 16;
l |= (long) (b[3] & 0xff) << 24;
l |= (long) (b[4] & 0xff) << 32;
l |= (long) (b[5] & 0xff) << 40;
l |= (long) (b[6] & 0xff) << 48;
l |= (long) (b[7] & 0xff) << 56;
return l;
}
public static final double readDouble(InputStream in) throws IOException {
return Double.longBitsToDouble(readLong(in));
}
public static final byte[] readWithLength(InputStream in) throws IOException {
int length = (int) readLength(in);
if (length <= 0) {
return EMPTY_BYTES;
}
byte[] b = new byte[length];
read(in, b, 0, b.length);
return b;
}
public static final void write(OutputStream out, byte b) throws IOException {
out.write(b & 0xff);
}
public static final void writeUB2(OutputStream out, int i) throws IOException {
byte[] b = new byte[2];
b[0] = (byte) (i & 0xff);
b[1] = (byte) (i >>> 8);
out.write(b);
}
public static final void writeUB3(OutputStream out, int i) throws IOException {
byte[] b = new byte[3];
b[0] = (byte) (i & 0xff);
b[1] = (byte) (i >>> 8);
b[2] = (byte) (i >>> 16);
out.write(b);
}
public static final void writeInt(OutputStream out, int i) throws IOException {
byte[] b = new byte[4];
b[0] = (byte) (i & 0xff);
b[1] = (byte) (i >>> 8);
b[2] = (byte) (i >>> 16);
b[3] = (byte) (i >>> 24);
out.write(b);
}
public static final void writeFloat(OutputStream out, float f) throws IOException {
writeInt(out, Float.floatToIntBits(f));
}
public static final void writeUB4(OutputStream out, long l) throws IOException {
byte[] b = new byte[4];
b[0] = (byte) (l & 0xff);
b[1] = (byte) (l >>> 8);
b[2] = (byte) (l >>> 16);
b[3] = (byte) (l >>> 24);
out.write(b);
}
public static final void writeLong(OutputStream out, long l) throws IOException {
byte[] b = new byte[8];
b[0] = (byte) (l & 0xff);
b[1] = (byte) (l >>> 8);
b[2] = (byte) (l >>> 16);
b[3] = (byte) (l >>> 24);
b[4] = (byte) (l >>> 32);
b[5] = (byte) (l >>> 40);
b[6] = (byte) (l >>> 48);
b[7] = (byte) (l >>> 56);
out.write(b);
}
public static final void writeDouble(OutputStream out, double d) throws IOException {
writeLong(out, Double.doubleToLongBits(d));
}
public static final long readLength(InputStream in) throws IOException {
int length = in.read();
if (length < 0)
throw new EOFException();
switch (length) {
case 251:
return NULL_LENGTH;
case 252:
return readUB2(in);
case 253:
return readUB3(in);
case 254:
return readLong(in);
default:
return length;
}
}
public static final void writeLength(OutputStream out, long length) throws IOException {
if (length < 251) {
out.write((byte) length);
} else if (length < 0x10000L) {
out.write((byte) 252);
writeUB2(out, (int) length);
} else if (length < 0x1000000L) {
out.write((byte) 253);
writeUB3(out, (int) length);
} else {
out.write((byte) 254);
writeLong(out, length);
}
}
public static final void writeWithNull(OutputStream out, byte[] src) throws IOException {
out.write(src);
out.write((byte) 0);
}
public static final void writeWithLength(OutputStream out, byte[] src) throws IOException {
int length = src.length;
if (length < 251) {
out.write((byte) length);
} else if (length < 0x10000L) {
out.write((byte) 252);
writeUB2(out, length);
} else if (length < 0x1000000L) {
out.write((byte) 253);
writeUB3(out, length);
} else {
out.write((byte) 254);
writeLong(out, length);
}
out.write(src);
}
}