|
What this is
Other links
The source code
/*
* MM JDBC Drivers for MySQL
*
* $Id: Buffer.java,v 1.1.1.1 1998/08/24 16:37:38 mmatthew Exp $
*
* Copyright (C) 1998 Mark Matthews <mmatthew@worldserver.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* See the COPYING file located in the top-level-directory of
* the archive of this library for complete text of license.
*/
package org.gjt.mm.mysql;
import java.io.*;
import java.net.*;
import java.util.*;
import java.sql.*;
/**
* Buffer contains code to read and write packets from/to the MySQL server.
*
* @author Mark Matthews <mmatthew@worldserver.com>
* @version $Id$
*/
class Buffer
{
byte[] buf;
int buf_length = 0;
int pos = 0;
int send_length = 0;
static long NULL_LENGTH = -1;
Buffer(byte[] buf)
{
this.buf = buf;
buf_length = buf.length;
}
Buffer(int size)
{
buf = new byte[size];
buf_length = buf.length;
pos = MysqlIO.HEADER_LENGTH;
}
final void setBytes(byte[] buf)
{
send_length = buf_length;
System.arraycopy(buf, 0, this.buf, 0, buf_length);
}
final byte readByte()
{
return buf[pos++];
}
final int readInt()
{
return (int)(ub(buf[pos++])+(256*ub(buf[pos++])));
}
final int readLongInt()
{
return (int)(ub(buf[pos++])+(256*ub(buf[pos++]))+(256*256*ub(buf[pos++])));
}
final long readLong()
{
return (long)(ub(buf[pos++])+(256*ub(buf[pos++]))+(256*256*ub(buf[pos++]))+(256*256*256*ub(buf[pos++])));
}
final long readLongLong()
{
return ((ub(buf[pos++])) +
(ub(buf[pos++]) << 8) +
(ub(buf[pos++]) << 16) +
(ub(buf[pos++]) << 24)) +
((ub(buf[pos++]) ) +
(ub(buf[pos++]) << 8) +
(ub(buf[pos++]) << 16) +
(ub(buf[pos++]) << 24)
<< 32 );
}
// Read n bytes depending
final int readnBytes()
{
switch(ub(buf[pos++])) {
case 1 : return ub(buf[pos++]);
case 2 : return this.readInt();
case 3 : return this.readLongInt();
case 4 : return (int)this.readLong();
default : return 255;
}
}
final long readLength()
{
switch(ub(buf[pos])) {
case 251 : {pos++; return (long) 0; }
case 252 : {pos++; return (long) readInt();}
case 253 : {pos++; return (long) readLongInt();}
case 254 : {pos++; return (long) readLong();}
default : return (long) ub(buf[pos++]);
}
}
// For MySQL servers > 3.22.5
final long newReadLength()
{
switch(ub(buf[pos])) {
case 251 : {pos++; return (long) 0; }
case 252 : {pos++; return (long) readInt();}
case 253 : {pos++; return (long) readLongInt();}
case 254 : {pos++; return (long) readLongLong();} // changed for 64 bit lengths
default : return (long) ub(buf[pos++]);
}
}
final long readFieldLength()
{
switch(ub(buf[pos])) {
case 251 : {pos++; return NULL_LENGTH; }
case 252 : {pos++; return (long) readInt();}
case 253 : {pos++; return (long) readLongInt();}
case 254 : {pos++; return (long) readLong();}
default : return (long) ub(buf[pos++]);
}
}
// Read null-terminated string (native)
final byte[] readByteArray()
{
return getNullTerminatedBytes();
}
// Read given-length string (native)
final byte[] readLenByteArray()
{
long len = this.readFieldLength();
if (len == NULL_LENGTH) {
return null;
}
if (len == 0) {
return new byte[0];
}
return getBytes((int)len);
}
//
// Read a null-terminated string
//
// To avoid alloc'ing a new byte array, we
// do this by hand, rather than calling getNullTerminatedBytes()
//
final String readString()
{
int i = pos;
int len = 0;
while(buf[i] != 0 && i < buf_length) {
len++;
i++;
}
String S = new String(buf, pos, len);
pos += (len + 1); // update cursor
return S;
}
//
// Read given-length string
//
// To avoid alloc'ing a byte array that will
// quickly be thrown away, we do this by
// hand instead of calling getBytes()
//
final String readLenString()
{
long len = this.readFieldLength();
if (len == NULL_LENGTH) {
return null;
}
if (len == 0) {
return "";
}
String S = new String(buf, pos, (int)len);
pos += len; // update cursor
return S;
}
//
// Read a given-length array of bytes
//
final byte[] getBytes(int len)
{
byte[] b = new byte[len];
System.arraycopy(buf, pos, b, 0, len);
pos += len; // update cursor
return b;
}
//
// Read a null-terminated array of bytes
//
final byte[] getNullTerminatedBytes()
{
int i = pos;
int len = 0;
while(buf[i] != 0 && i < buf_length) {
len++;
i++;
}
byte[] b = new byte[len];
System.arraycopy(buf, pos, b, 0, len);
pos += (len + 1); // update cursor
return b;
}
final boolean isLastDataPacket()
{
return ((buf_length <= 2) && (ub(buf[0]) == 254));
}
final void clear()
{
pos = MysqlIO.HEADER_LENGTH;
}
final void writeByte(byte b)
{
buf[pos++]=b;
}
final void writeInt(int i)
{
int r;
r=i % 256;
buf[pos++] = (byte)r;
i = i / 256;
buf[pos++] = (byte)i;
}
final void writeLongInt(int i)
{
int r;
r=i % 256;
buf[pos++] = (byte)r;
i = i / 256;
r = i % 256;
buf[pos++] = (byte)r;
i = i / 256;
buf[pos++] = (byte)i;
}
final void writeLong(long i)
{
long r;
r = i % 256;
buf[pos++]=(byte)r;
i = i / 256;
r = i % 256;
buf[pos++] = (byte)r;
i = i / 256;
r = i % 256;
buf[pos++] = (byte)r;
i = i / 256;
buf[pos++] = (byte)i;
}
// Write null-terminated string
final void writeString(String S)
{
writeStringNoNull(S);
buf[pos++] = 0;
}
// Write string, with no termination
final void writeStringNoNull(String S)
{
byte[] b = S.getBytes();
int len = b.length;
System.arraycopy(b, 0, buf, pos, len);
pos += len;
}
// Write a String using the specified character
// encoding
final void writeStringNoNull(String S, String Encoding)
throws java.io.UnsupportedEncodingException
{
byte[] b = S.getBytes(Encoding);
int len = b.length;
System.arraycopy(b, 0, buf, pos, len);
pos += len;
}
// Write a byte array
final void writeBytesNoNull(byte[] Bytes)
{
int len = Bytes.length;
System.arraycopy(Bytes, 0, buf, pos, len);
pos += len;
}
final static int ub(byte b)
{
return b < 0 ? (int)(256 + b) : b;
}
final void dump()
{
int p = 0;
int rows = buf_length / 8;
for (int i = 0; i < rows; i++) {
int ptemp = p;
for (int j = 0; j < 8; j++) {
String HexVal = Integer.toHexString((int)buf[ptemp]);
if (HexVal.length() == 1) {
HexVal = "0" + HexVal;
}
System.out.print(HexVal + " ");
ptemp++;
}
System.out.print(" ");
for (int j = 0; j < 8; j++) {
if (buf[p] > 32 && buf[p] < 127) {
System.out.print((char)buf[p] + " ");
}
else {
System.out.print(". ");
}
p++;
}
System.out.println();
}
int n = 0;
for (int i = p; i < buf_length; i++) {
String HexVal = Integer.toHexString((int)buf[i]);
if (HexVal.length() == 1) {
HexVal = "0" + HexVal;
}
System.out.print(HexVal + " ");
n++;
}
for (int i = n; i < 8; i++) {
System.out.print(" ");
}
System.out.print(" ");
for (int i = p; i < buf_length; i++) {
if (buf[i] > 32 && buf[i] < 127) {
System.out.print((char)buf[i] + " ");
}
else {
System.out.print(". ");
}
}
System.out.println();
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.