1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-11 10:01:57 +03:00

New stuff from Peter Mount for jdbc.

This commit is contained in:
Bruce Momjian
1998-09-03 02:31:38 +00:00
parent c37adac74e
commit 35a945f2b5
8 changed files with 198 additions and 198 deletions

View File

@ -34,6 +34,9 @@ public class Connection implements java.sql.Connection
// This is set by postgresql.Statement.setMaxRows()
protected int maxrows = 0; // maximum no. of rows; 0 = unlimited
// This is a cache of the DatabaseMetaData instance for this connection
protected DatabaseMetaData metadata;
private String PG_HOST;
private int PG_PORT;
private String PG_USER;
@ -44,17 +47,6 @@ public class Connection implements java.sql.Connection
public boolean CONNECTION_OK = true;
public boolean CONNECTION_BAD = false;
//private static final int STARTUP_LEN = 288; // Length of a startup packet
// These are defined in src/include/libpq/pqcomm.h
//private int STARTUP_CODE = STARTUP_USER;
//private static final int STARTUP_USER = 7; // User auth
//private static final int STARTUP_KRB4 = 10; // Kerberos 4 (unused)
//private static final int STARTUP_KRB5 = 11; // Kerberos 5 (unused)
//private static final int STARTUP_HBA = 12; // Host Based
//private static final int STARTUP_NONE = 13; // Unauthenticated (unused)
//private static final int STARTUP_PASS = 14; // Password auth
private boolean autoCommit = true;
private boolean readOnly = false;
@ -88,12 +80,6 @@ public class Connection implements java.sql.Connection
// be across all connections, which could be to different backends.
protected Hashtable fieldCache = new Hashtable();
// This is used by Field to cache oid -> names.
// It's here, because it's shared across this connection only.
// Hence it cannot be static within the Field class, because it would then
// be across all connections, which could be to different backends.
protected Hashtable fieldCache = new Hashtable();
/**
* This is the current date style of the backend
*/
@ -150,8 +136,6 @@ public class Connection implements java.sql.Connection
*/
public Connection(String host, int port, Properties info, String database, String url, Driver d) throws SQLException
{
//int len = STARTUP_LEN; // Length of a startup packet
// Throw an exception if the user or password properties are missing
// This occasionally occurs when the client uses the properties version
// of getConnection(), and is a common question on the email lists
@ -169,30 +153,15 @@ public class Connection implements java.sql.Connection
PG_HOST = new String(host);
PG_STATUS = CONNECTION_BAD;
// Pre 6.3 code
// This handles the auth property. Any value begining with p enables
// password authentication, while anything begining with i enables
// ident (RFC 1413) authentication. Any other values default to trust.
//
// Also, the postgresql.auth system property can be used to change the
// local default, if the auth property is not present.
//
//String auth = info.getProperty("auth",System.getProperty("postgresql.auth","trust")).toLowerCase();
//if(auth.startsWith("p")) {
//// Password authentication
//STARTUP_CODE=STARTUP_PASS;
//} else if(auth.startsWith("i")) {
//// Ident (RFC 1413) authentication
//STARTUP_CODE=STARTUP_HBA;
//} else {
//// Anything else defaults to trust authentication
//STARTUP_CODE=STARTUP_USER;
//}
// Now make the initial connection
try
{
pg_stream = new PG_Stream(host, port);
} catch (ConnectException cex) {
// Added by Peter Mount <peter@retep.org.uk>
// ConnectException is thrown when the connection cannot be made.
// we trap this an return a more meaningful message for the end user
throw new SQLException ("Connection refused. Check that the hostname and port is correct, and that the postmaster is running with the -i flag, which enables TCP/IP networking.");
} catch (IOException e) {
throw new SQLException ("Connection failed: " + e.toString());
}
@ -200,30 +169,17 @@ public class Connection implements java.sql.Connection
// Now we need to construct and send a startup packet
try
{
// Pre 6.3 code
//pg_stream.SendInteger(len, 4); len -= 4;
//pg_stream.SendInteger(STARTUP_CODE, 4); len -= 4;
//pg_stream.Send(database.getBytes(), 64); len -= 64;
//pg_stream.Send(PG_USER.getBytes(), len);
//
//// Send the password packet if required
//if(STARTUP_CODE == STARTUP_PASS) {
//len=STARTUP_LEN;
//pg_stream.SendInteger(len, 4); len -= 4;
//pg_stream.SendInteger(STARTUP_PASS, 4); len -= 4;
//pg_stream.Send(PG_USER.getBytes(), PG_USER.length());
//len-=PG_USER.length();
//pg_stream.SendInteger(0,1); len -= 1;
//pg_stream.Send(PG_PASSWORD.getBytes(), len);
//}
// Ver 6.3 code
pg_stream.SendInteger(4+4+SM_DATABASE+SM_USER+SM_OPTIONS+SM_UNUSED+SM_TTY,4);
pg_stream.SendInteger(PG_PROTOCOL_LATEST_MAJOR,2);
pg_stream.SendInteger(PG_PROTOCOL_LATEST_MINOR,2);
pg_stream.Send(database.getBytes(),SM_DATABASE);
// This last send includes the unused fields
pg_stream.Send(PG_USER.getBytes(),SM_USER+SM_OPTIONS+SM_UNUSED+SM_TTY);
// The last send includes the unused fields
// now flush the startup packets to the backend
pg_stream.flush();
// Now get the response from the backend, either an error message
// or an authentication request
@ -233,6 +189,12 @@ public class Connection implements java.sql.Connection
switch(beresp)
{
case 'E':
// An error occured, so pass the error message to the
// user.
//
// The most common one to be thrown here is:
// "User authentication failed"
//
throw new SQLException(pg_stream.ReceiveString(4096));
case 'R':
@ -267,7 +229,7 @@ public class Connection implements java.sql.Connection
pg_stream.SendInteger(5+PG_PASSWORD.length(),4);
pg_stream.Send(PG_PASSWORD.getBytes());
pg_stream.SendInteger(0,1);
//pg_stream.SendPacket(PG_PASSWORD.getBytes());
pg_stream.flush();
break;
case AUTH_REQ_CRYPT:
@ -276,11 +238,11 @@ public class Connection implements java.sql.Connection
pg_stream.SendInteger(5+crypted.length(),4);
pg_stream.Send(crypted.getBytes());
pg_stream.SendInteger(0,1);
//pg_stream.SendPacket(UnixCrypt.crypt(salt,PG_PASSWORD).getBytes());
pg_stream.flush();
break;
default:
throw new SQLException("Authentication type "+areq+" not supported");
throw new SQLException("Authentication type "+areq+" not supported. Check that you have configured the pg_hba.conf file to include the client's IP address or Subnet, and is using a supported authentication scheme.");
}
break;
@ -511,7 +473,9 @@ public class Connection implements java.sql.Connection
*/
public java.sql.DatabaseMetaData getMetaData() throws SQLException
{
return new DatabaseMetaData(this);
if(metadata==null)
metadata = new DatabaseMetaData(this);
return metadata;
}
/**
@ -631,8 +595,6 @@ public class Connection implements java.sql.Connection
*/
public void addWarning(String msg)
{
//PrintStream log = DriverManager.getLogStream();
//if(log!=null)
DriverManager.println(msg);
// Add the warning to the chain
@ -691,6 +653,7 @@ public class Connection implements java.sql.Connection
buf = sql.getBytes();
pg_stream.Send(buf);
pg_stream.SendChar(0);
pg_stream.flush();
} catch (IOException e) {
throw new SQLException("I/O Error: " + e.toString());
}
@ -726,6 +689,7 @@ public class Connection implements java.sql.Connection
pg_stream.SendChar('Q');
pg_stream.SendChar(' ');
pg_stream.SendChar(0);
pg_stream.flush();
} catch (IOException e) {
throw new SQLException("I/O Error: " + e.toString());
}
@ -964,6 +928,8 @@ public class Connection implements java.sql.Connection
return ((Serialize)o).fetch(Integer.parseInt(value));
}
} catch(SQLException sx) {
// rethrow the exception. Done because we capture any others next
sx.fillInStackTrace();
throw sx;
} catch(Exception ex) {
throw new SQLException("Failed to create object for "+type+": "+ex);
@ -999,14 +965,17 @@ public class Connection implements java.sql.Connection
// If so, then call it's fetch method.
if(x instanceof Serialize)
return ((Serialize)x).store(o);
// Thow an exception because the type is unknown
throw new SQLException("The object could not be stored. Check that any tables required have already been created in the database.");
} catch(SQLException sx) {
// rethrow the exception. Done because we capture any others next
sx.fillInStackTrace();
throw sx;
} catch(Exception ex) {
throw new SQLException("Failed to store object: "+ex);
}
// should never be reached
return 0;
}
/**
@ -1045,10 +1014,12 @@ public class Connection implements java.sql.Connection
private static final String defaultObjectTypes[][] = {
{"box", "postgresql.geometric.PGbox"},
{"circle", "postgresql.geometric.PGcircle"},
{"line", "postgresql.geometric.PGline"},
{"lseg", "postgresql.geometric.PGlseg"},
{"path", "postgresql.geometric.PGpath"},
{"point", "postgresql.geometric.PGpoint"},
{"polygon", "postgresql.geometric.PGpolygon"}
{"polygon", "postgresql.geometric.PGpolygon"},
{"money", "postgresql.util.PGmoney"}
};
// This initialises the objectTypes hashtable