import org.postgresql.util.*;
/**
- * $Id: Connection.java,v 1.17 2001/06/07 00:09:32 momjian Exp $
+ * $Id: Connection.java,v 1.18 2001/07/15 04:21:26 momjian Exp $
*
* This abstract class is used by org.postgresql.Driver to open either the JDBC1 or
* JDBC2 versions of the Connection class.
public int pid;
public int ckey;
- // This receive_sbuf should be used by the different methods
- // that call pg_stream.ReceiveString() in this Connection, so
- // so we avoid uneccesary new allocations.
- byte receive_sbuf[] = new byte[8192];
-
/**
* This is called by Class.forName() from within org.postgresql.Driver
*/
// The most common one to be thrown here is:
// "User authentication failed"
//
- throw new SQLException(pg_stream.ReceiveString
- (receive_sbuf, 4096, getEncoding()));
+ throw new SQLException(pg_stream.ReceiveString(getEncoding()));
case 'R':
// Get the type of request
break;
case 'E':
case 'N':
- throw new SQLException(pg_stream.ReceiveString
- (receive_sbuf, 4096, getEncoding()));
+ throw new SQLException(pg_stream.ReceiveString(getEncoding()));
default:
throw new PSQLException("postgresql.con.setup");
}
break;
case 'E':
case 'N':
- throw new SQLException(pg_stream.ReceiveString(receive_sbuf, 4096, getEncoding()));
+ throw new SQLException(pg_stream.ReceiveString(getEncoding()));
default:
throw new PSQLException("postgresql.con.setup");
}
{
case 'A': // Asynchronous Notify
pid = pg_stream.ReceiveInteger(4);
- msg = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ msg = pg_stream.ReceiveString(getEncoding());
break;
case 'B': // Binary Data Transfer
if (fields == null)
tuples.addElement(tup);
break;
case 'C': // Command Status
- recv_status = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ recv_status = pg_stream.ReceiveString(getEncoding());
// Now handle the update count correctly.
if(recv_status.startsWith("INSERT") || recv_status.startsWith("UPDATE") || recv_status.startsWith("DELETE") || recv_status.startsWith("MOVE")) {
tuples.addElement(tup);
break;
case 'E': // Error Message
- msg = pg_stream.ReceiveString(receive_sbuf,4096,getEncoding());
+ msg = pg_stream.ReceiveString(getEncoding());
final_error = new SQLException(msg);
hfr = true;
break;
hfr = true;
break;
case 'N': // Error Notification
- addWarning(pg_stream.ReceiveString(receive_sbuf,4096,getEncoding()));
+ addWarning(pg_stream.ReceiveString(getEncoding()));
break;
case 'P': // Portal Name
- String pname = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ String pname = pg_stream.ReceiveString(getEncoding());
break;
case 'T': // MetaData Field Description
if (fields != null)
for (i = 0 ; i < nf ; ++i)
{
- String typname = pg_stream.ReceiveString(receive_sbuf,8192,getEncoding());
+ String typname = pg_stream.ReceiveString(getEncoding());
int typid = pg_stream.ReceiveIntegerR(4);
int typlen = pg_stream.ReceiveIntegerR(2);
int typmod = pg_stream.ReceiveIntegerR(4);
private Socket connection;
private InputStream pg_input;
private BufferedOutputStream pg_output;
+ private byte[] byte_buf = new byte[8*1024];
BytePoolDim1 bytePoolDim1 = new BytePoolDim1();
BytePoolDim2 bytePoolDim2 = new BytePoolDim2();
}
/**
- * Receives a null-terminated string from the backend. Maximum of
- * maxsiz bytes - if we don't see a null, then we assume something
- * has gone wrong.
+ * Receives a null-terminated string from the backend. If we don't see a
+ * null, then we assume something has gone wrong.
*
- * @param maxsiz maximum length of string
- * @return string from back end
- * @exception SQLException if an I/O error occurs
- */
- public String ReceiveString(int maxsiz) throws SQLException
- {
- byte[] rst = bytePoolDim1.allocByte(maxsiz);
- return ReceiveString(rst, maxsiz, null);
- }
-
- /**
- * Receives a null-terminated string from the backend. Maximum of
- * maxsiz bytes - if we don't see a null, then we assume something
- * has gone wrong.
- *
- * @param maxsiz maximum length of string
- * @param encoding the charset encoding to use.
- * @param maxsiz maximum length of string in bytes
- * @return string from back end
- * @exception SQLException if an I/O error occurs
- */
- public String ReceiveString(int maxsiz, String encoding) throws SQLException
- {
- byte[] rst = bytePoolDim1.allocByte(maxsiz);
- return ReceiveString(rst, maxsiz, encoding);
- }
-
- /**
- * Receives a null-terminated string from the backend. Maximum of
- * maxsiz bytes - if we don't see a null, then we assume something
- * has gone wrong.
- *
- * @param rst byte array to read the String into. rst.length must
- * equal to or greater than maxsize.
- * @param maxsiz maximum length of string in bytes
* @param encoding the charset encoding to use.
* @return string from back end
- * @exception SQLException if an I/O error occurs
+ * @exception SQLException if an I/O error occurs, or end of file
*/
- public String ReceiveString(byte rst[], int maxsiz, String encoding)
+ public String ReceiveString(String encoding)
throws SQLException
{
int s = 0;
-
- try
- {
- while (s < maxsiz)
- {
+ byte[] rst = byte_buf;
+ try {
+ int buflen = rst.length;
+ boolean done = false;
+ while (!done) {
+ while (s < buflen) {
int c = pg_input.read();
if (c < 0)
throw new PSQLException("postgresql.stream.eof");
else if (c == 0) {
rst[s] = 0;
+ done = true;
break;
- } else
+ } else {
rst[s++] = (byte)c;
}
- if (s >= maxsiz)
- throw new PSQLException("postgresql.stream.toomuch");
+ if (s >= buflen) { // Grow the buffer
+ buflen = (int)(buflen*2); // 100% bigger
+ byte[] newrst = new byte[buflen];
+ System.arraycopy(rst, 0, newrst, 0, s);
+ rst = newrst;
+ }
+ }
+ }
} catch (IOException e) {
throw new PSQLException("postgresql.stream.ioerror",e);
}
+
String v = null;
if (encoding == null)
v = new String(rst, 0, s);
//DriverManager.println("ReceiveChar() = "+in+" '"+((char)in)+"'");
//if(in!='V') {
//if(in=='E')
- //throw new SQLException(stream.ReceiveString(4096));
+ //throw new SQLException(stream.ReceiveString(conn.getEncoding()));
//throw new SQLException("Fastpath: expected 'V' from backend, got "+((char)in));
//}
//------------------------------
// Error message returned
case 'E':
- throw new PSQLException("postgresql.fp.error",stream.ReceiveString(4096));
+ throw new PSQLException("postgresql.fp.error",stream.ReceiveString(conn.getEncoding()));
//------------------------------
// Notice from backend
case 'N':
- conn.addWarning(stream.ReceiveString(4096));
+ conn.addWarning(stream.ReceiveString(conn.getEncoding()));
break;
//------------------------------