diff --git a/org/postgresql/Driver.java.in b/org/postgresql/Driver.java.in index 76e0800..f6c69c0 100644 --- a/org/postgresql/Driver.java.in +++ b/org/postgresql/Driver.java.in @@ -10,7 +10,6 @@ package org.postgresql; import java.io.*; import java.sql.*; import java.util.*; -import java.net.InetSocketAddress; import java.net.URL; import java.security.AccessController; @@ -21,6 +20,7 @@ import org.postgresql.util.PSQLException; import org.postgresql.util.PSQLState; import org.postgresql.util.PSQLDriverVersion; import org.postgresql.util.GT; +import org.postgresql.util.HostSpec; import org.postgresql.core.Logger; @@ -390,7 +390,7 @@ public class Driver implements java.sql.Driver * @throws SQLException if the connection could not be made */ private static Connection makeConnection(String url, Properties props) throws SQLException { - return new @JDBCCONNECTCLASS@(address(props), + return new @JDBCCONNECTCLASS@(hostSpecs(props), user(props), database(props), props, url); } @@ -647,15 +647,15 @@ public class Driver implements java.sql.Driver /** * @return the address portion of the URL */ - private static InetSocketAddress[] address(Properties props) + private static HostSpec[] hostSpecs(Properties props) { String[] hosts = props.getProperty("PGHOST").split(","); String[] ports = props.getProperty("PGPORT").split(","); - InetSocketAddress[] addresses = new InetSocketAddress[hosts.length]; - for (int i = 0; i < addresses.length; ++i) { - addresses[i] = new InetSocketAddress(hosts[i], Integer.parseInt(ports[i])); + HostSpec[] hostSpecs = new HostSpec[hosts.length]; + for (int i = 0; i < hostSpecs.length; ++i) { + hostSpecs[i] = new HostSpec(hosts[i], Integer.parseInt(ports[i])); } - return addresses; + return hostSpecs; } /** diff --git a/org/postgresql/core/ConnectionFactory.java b/org/postgresql/core/ConnectionFactory.java index 569d599..a351619 100644 --- a/org/postgresql/core/ConnectionFactory.java +++ b/org/postgresql/core/ConnectionFactory.java @@ -8,10 +8,10 @@ */ package org.postgresql.core; -import java.net.InetSocketAddress; import java.util.Properties; import java.sql.SQLException; +import org.postgresql.util.HostSpec; import org.postgresql.util.PSQLException; import org.postgresql.util.GT; import org.postgresql.util.PSQLState; @@ -42,8 +42,7 @@ public abstract class ConnectionFactory { *

* Currently, protocol versions 3 (7.4+) and 2 (pre-7.4) are supported. * - * @param host the host to connect to - * @param port the port to connect to + * @param hostSpecs at least one host and port to connect to; multiple elements for round-robin failover * @param user the username to authenticate with; may not be null. * @param database the database on the server to connect to; may not be null. * @param info extra properties controlling the connection; @@ -52,7 +51,7 @@ public abstract class ConnectionFactory { * @return the new, initialized, connection * @throws SQLException if the connection could not be established. */ - public static ProtocolConnection openConnection(InetSocketAddress[] address, String user, String database, Properties info, Logger logger) throws SQLException { + public static ProtocolConnection openConnection(HostSpec[] hostSpecs, String user, String database, Properties info, Logger logger) throws SQLException { String protoName = info.getProperty("protocolVersion"); for (int i = 0; i < versions.length; ++i) @@ -62,7 +61,7 @@ public abstract class ConnectionFactory { continue; ConnectionFactory factory = (ConnectionFactory) versions[i][1]; - ProtocolConnection connection = factory.openConnectionImpl(address, user, database, info, logger); + ProtocolConnection connection = factory.openConnectionImpl(hostSpecs, user, database, info, logger); if (connection != null) return connection; } @@ -75,8 +74,7 @@ public abstract class ConnectionFactory { * Implementation of {@link #openConnection} for a particular protocol version. * Implemented by subclasses of {@link ConnectionFactory}. * - * @param host the host to connect to - * @param port the port to connect to + * @param hostSpecs at least one host and port to connect to; multiple elements for round-robin failover * @param user the username to authenticate with; may not be null. * @param database the database on the server to connect to; may not be null. * @param info extra properties controlling the connection; @@ -87,5 +85,5 @@ public abstract class ConnectionFactory { * @throws SQLException if the connection could not be established for a reason other * than protocol version incompatibility. */ - public abstract ProtocolConnection openConnectionImpl(InetSocketAddress[] address, String user, String database, Properties info, Logger logger) throws SQLException; + public abstract ProtocolConnection openConnectionImpl(HostSpec[] hostSpecs, String user, String database, Properties info, Logger logger) throws SQLException; } diff --git a/org/postgresql/core/PGStream.java b/org/postgresql/core/PGStream.java index 3c75ee5..fad4c12 100644 --- a/org/postgresql/core/PGStream.java +++ b/org/postgresql/core/PGStream.java @@ -19,6 +19,7 @@ import java.net.Socket; import java.sql.SQLException; import org.postgresql.util.GT; +import org.postgresql.util.HostSpec; import org.postgresql.util.PSQLState; import org.postgresql.util.PSQLException; @@ -31,7 +32,7 @@ import org.postgresql.util.PSQLException; */ public class PGStream { - private final InetSocketAddress address; + private final HostSpec hostSpec; private final byte[] _int4buf; private final byte[] _int2buf; @@ -48,16 +49,15 @@ public class PGStream * Constructor: Connect to the PostgreSQL back end and return * a stream connection. * - * @param host the hostname to connect to - * @param port the port number that the postmaster is sitting on + * @param hostSpec the host and port to connect to * @exception IOException if an IOException occurs below it. */ - public PGStream(InetSocketAddress address) throws IOException + public PGStream(HostSpec hostSpec) throws IOException { - this.address = address; + this.hostSpec = hostSpec; Socket socket = new Socket(); - socket.connect(address); + socket.connect(new InetSocketAddress(hostSpec.getHost(), hostSpec.getPort())); changeSocket(socket); setEncoding(Encoding.getJVMEncoding("US-ASCII")); @@ -65,8 +65,8 @@ public class PGStream _int4buf = new byte[4]; } - public InetSocketAddress getAddress() { - return address; + public HostSpec getHostSpec() { + return hostSpec; } public Socket getSocket() { diff --git a/org/postgresql/core/ProtocolConnection.java b/org/postgresql/core/ProtocolConnection.java index 153c277..62c0f1b 100644 --- a/org/postgresql/core/ProtocolConnection.java +++ b/org/postgresql/core/ProtocolConnection.java @@ -9,8 +9,8 @@ package org.postgresql.core; import org.postgresql.PGNotification; +import org.postgresql.util.HostSpec; -import java.net.InetSocketAddress; import java.sql.*; import java.util.Set; @@ -40,9 +40,9 @@ public interface ProtocolConnection { static final int TRANSACTION_FAILED = 2; /** - * @return the address this connection is connected to. + * @return the host and port this connection is connected to. */ - InetSocketAddress getAddress(); + HostSpec getHostSpec(); /** * @return the user this connection authenticated as. diff --git a/org/postgresql/core/v2/ConnectionFactoryImpl.java b/org/postgresql/core/v2/ConnectionFactoryImpl.java index 90523a1..a0cfc96 100644 --- a/org/postgresql/core/v2/ConnectionFactoryImpl.java +++ b/org/postgresql/core/v2/ConnectionFactoryImpl.java @@ -15,7 +15,6 @@ import java.sql.SQLException; import java.sql.SQLWarning; import java.io.IOException; import java.net.ConnectException; -import java.net.InetSocketAddress; import org.postgresql.core.*; import org.postgresql.util.PSQLException; @@ -23,6 +22,7 @@ import org.postgresql.util.PSQLState; import org.postgresql.util.UnixCrypt; import org.postgresql.util.MD5Digest; import org.postgresql.util.GT; +import org.postgresql.util.HostSpec; /** * ConnectionFactory implementation for version 2 (pre-7.4) connections. @@ -38,7 +38,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { private static final int AUTH_REQ_MD5 = 5; private static final int AUTH_REQ_SCM = 6; - public ProtocolConnection openConnectionImpl(InetSocketAddress[] addresses, String user, String database, Properties info, Logger logger) throws SQLException { + public ProtocolConnection openConnectionImpl(HostSpec[] hostSpecs, String user, String database, Properties info, Logger logger) throws SQLException { // Extract interesting values from the info properties: // - the SSL setting boolean requireSSL; @@ -70,10 +70,10 @@ public class ConnectionFactoryImpl extends ConnectionFactory { // - the TCP keep alive setting boolean requireTCPKeepAlive = (Boolean.valueOf(info.getProperty("tcpKeepAlive")).booleanValue()); - for (int addr = 0; addr < addresses.length; ++addr) { - InetSocketAddress address = addresses[addr]; + for (int whichHost = 0; whichHost < hostSpecs.length; ++whichHost) { + HostSpec hostSpec = hostSpecs[whichHost]; if (logger.logDebug()) - logger.debug("Trying to establish a protocol version 2 connection to " + address); + logger.debug("Trying to establish a protocol version 2 connection to " + hostSpec); // // Establish a connection. @@ -83,7 +83,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { PGStream newStream = null; try { - newStream = new PGStream(address); + newStream = new PGStream(hostSpec); // Construct and send an ssl startup packet if requested. if (trySSL) @@ -127,7 +127,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { // ConnectException is thrown when the connection cannot be made. // we trap this an return a more meaningful message for the end user - if (addr+1 < addresses.length) { + if (whichHost + 1 < hostSpecs.length) { // still more addresses to try continue; } @@ -146,7 +146,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { } } - if (addr+1 < addresses.length) { + if (whichHost + 1 < hostSpecs.length) { // still more addresses to try continue; } @@ -165,7 +165,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { } } - if (addr+1 < addresses.length) { + if (whichHost + 1 < hostSpecs.length) { // still more addresses to try continue; } @@ -199,7 +199,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { // We have to reconnect to continue. pgStream.close(); - return new PGStream(pgStream.getAddress()); + return new PGStream(pgStream.getHostSpec()); case 'N': if (logger.logDebug()) diff --git a/org/postgresql/core/v2/ProtocolConnectionImpl.java b/org/postgresql/core/v2/ProtocolConnectionImpl.java index 567ad3e..204ad9f 100644 --- a/org/postgresql/core/v2/ProtocolConnectionImpl.java +++ b/org/postgresql/core/v2/ProtocolConnectionImpl.java @@ -11,12 +11,12 @@ package org.postgresql.core.v2; import java.sql.SQLException; import java.sql.SQLWarning; import java.io.IOException; -import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Set; import org.postgresql.PGNotification; import org.postgresql.core.*; +import org.postgresql.util.HostSpec; /** * V2 implementation of ProtocolConnection. @@ -32,8 +32,8 @@ class ProtocolConnectionImpl implements ProtocolConnection { this.executor = new QueryExecutorImpl(this, pgStream, logger); } - public InetSocketAddress getAddress() { - return pgStream.getAddress(); + public HostSpec getHostSpec() { + return pgStream.getHostSpec(); } public String getUser() { @@ -87,7 +87,7 @@ class ProtocolConnectionImpl implements ProtocolConnection { if (logger.logDebug()) logger.debug(" FE=> CancelRequest(pid=" + cancelPid + ",ckey=" + cancelKey + ")"); - cancelStream = new PGStream(pgStream.getAddress()); + cancelStream = new PGStream(pgStream.getHostSpec()); cancelStream.SendInteger4(16); cancelStream.SendInteger2(1234); cancelStream.SendInteger2(5678); diff --git a/org/postgresql/core/v3/ConnectionFactoryImpl.java b/org/postgresql/core/v3/ConnectionFactoryImpl.java index d50c07d..95eaa43 100644 --- a/org/postgresql/core/v3/ConnectionFactoryImpl.java +++ b/org/postgresql/core/v3/ConnectionFactoryImpl.java @@ -14,7 +14,6 @@ import java.util.TimeZone; import java.sql.SQLException; import java.io.IOException; import java.net.ConnectException; -import java.net.InetSocketAddress; import org.postgresql.core.*; import org.postgresql.util.PSQLException; @@ -24,6 +23,7 @@ import org.postgresql.util.ServerErrorMessage; import org.postgresql.util.UnixCrypt; import org.postgresql.util.MD5Digest; import org.postgresql.util.GT; +import org.postgresql.util.HostSpec; /** * ConnectionFactory implementation for version 3 (7.4+) connections. @@ -46,7 +46,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { private static class UnsupportedProtocolException extends IOException { } - public ProtocolConnection openConnectionImpl(InetSocketAddress[] addresses, String user, String database, Properties info, Logger logger) throws SQLException { + public ProtocolConnection openConnectionImpl(HostSpec[] hostSpecs, String user, String database, Properties info, Logger logger) throws SQLException { // Extract interesting values from the info properties: // - the SSL setting boolean requireSSL; @@ -85,11 +85,11 @@ public class ConnectionFactoryImpl extends ConnectionFactory { // // Change by Chris Smith - for (int addr = 0; addr < addresses.length; ++addr) { - InetSocketAddress address = addresses[addr]; + for (int whichHost = 0; whichHost < hostSpecs.length; ++whichHost) { + HostSpec hostSpec = hostSpecs[whichHost]; if (logger.logDebug()) - logger.debug("Trying to establish a protocol version 3 connection to " + address); + logger.debug("Trying to establish a protocol version 3 connection to " + hostSpec); // // Establish a connection. @@ -98,7 +98,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { PGStream newStream = null; try { - newStream = new PGStream(address); + newStream = new PGStream(hostSpec); // Construct and send an ssl startup packet if requested. if (trySSL) @@ -170,7 +170,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { sendStartupPacket(newStream, params, logger); // Do authentication (until AuthenticationOk). - doAuthentication(newStream, address.getHostName(), user, info, logger); + doAuthentication(newStream, hostSpec.getHost(), user, info, logger); // Do final startup. ProtocolConnectionImpl protoConnection = new ProtocolConnectionImpl(newStream, user, database, info, logger); @@ -200,7 +200,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { // Added by Peter Mount // ConnectException is thrown when the connection cannot be made. // we trap this an return a more meaningful message for the end user - if (addr+1 < addresses.length) { + if (whichHost + 1 < hostSpecs.length) { // still more addresses to try continue; } @@ -218,7 +218,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { { } } - if (addr+1 < addresses.length) { + if (whichHost + 1 < hostSpecs.length) { // still more addresses to try continue; } @@ -236,7 +236,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { { } } - if (addr+1 < addresses.length) { + if (whichHost + 1 < hostSpecs.length) { // still more addresses to try continue; } @@ -296,7 +296,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { // We have to reconnect to continue. pgStream.close(); - return new PGStream(pgStream.getAddress()); + return new PGStream(pgStream.getHostSpec()); case 'N': if (logger.logDebug()) diff --git a/org/postgresql/core/v3/ProtocolConnectionImpl.java b/org/postgresql/core/v3/ProtocolConnectionImpl.java index 94214b4..6c40204 100644 --- a/org/postgresql/core/v3/ProtocolConnectionImpl.java +++ b/org/postgresql/core/v3/ProtocolConnectionImpl.java @@ -10,11 +10,11 @@ package org.postgresql.core.v3; import org.postgresql.PGNotification; import org.postgresql.core.*; +import org.postgresql.util.HostSpec; import java.sql.SQLException; import java.sql.SQLWarning; import java.io.IOException; -import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; @@ -37,8 +37,8 @@ class ProtocolConnectionImpl implements ProtocolConnection { this.standardConformingStrings = false; } - public InetSocketAddress getAddress() { - return pgStream.getAddress(); + public HostSpec getHostSpec() { + return pgStream.getHostSpec(); } public String getUser() { @@ -89,7 +89,7 @@ class ProtocolConnectionImpl implements ProtocolConnection { if (logger.logDebug()) logger.debug(" FE=> CancelRequest(pid=" + cancelPid + ",ckey=" + cancelKey + ")"); - cancelStream = new PGStream(pgStream.getAddress()); + cancelStream = new PGStream(pgStream.getHostSpec()); cancelStream.SendInteger4(16); cancelStream.SendInteger2(1234); cancelStream.SendInteger2(5678); diff --git a/org/postgresql/jdbc2/AbstractJdbc2Connection.java b/org/postgresql/jdbc2/AbstractJdbc2Connection.java index d5e38c1..2fb37f4 100644 --- a/org/postgresql/jdbc2/AbstractJdbc2Connection.java +++ b/org/postgresql/jdbc2/AbstractJdbc2Connection.java @@ -13,17 +13,13 @@ import java.sql.*; import java.util.*; import org.postgresql.core.*; -import java.net.InetSocketAddress; import org.postgresql.Driver; import org.postgresql.PGNotification; import org.postgresql.fastpath.Fastpath; import org.postgresql.largeobject.LargeObjectManager; -import org.postgresql.util.PGBinaryObject; -import org.postgresql.util.PSQLState; -import org.postgresql.util.PGobject; -import org.postgresql.util.PSQLException; -import org.postgresql.util.GT; +import org.postgresql.util.*; +import org.postgresql.util.HostSpec; import org.postgresql.copy.*; /** @@ -86,7 +82,7 @@ public abstract class AbstractJdbc2Connection implements BaseConnection // // Ctor. // - protected AbstractJdbc2Connection(InetSocketAddress[] address, String user, String database, Properties info, String url) throws SQLException + protected AbstractJdbc2Connection(HostSpec[] hostSpecs, String user, String database, Properties info, String url) throws SQLException { this.creatingURL = url; @@ -137,7 +133,7 @@ public abstract class AbstractJdbc2Connection implements BaseConnection logger.info(Driver.getVersion()); // Now make the initial connection and set up local state - this.protoConnection = ConnectionFactory.openConnection(address, user, database, info, logger); + this.protoConnection = ConnectionFactory.openConnection(hostSpecs, user, database, info, logger); this.dbVersionNumber = protoConnection.getServerVersion(); this.compatible = info.getProperty("compatible", Driver.MAJORVERSION + "." + Driver.MINORVERSION); diff --git a/org/postgresql/jdbc3/AbstractJdbc3Connection.java b/org/postgresql/jdbc3/AbstractJdbc3Connection.java index da11958..c7738a0 100644 --- a/org/postgresql/jdbc3/AbstractJdbc3Connection.java +++ b/org/postgresql/jdbc3/AbstractJdbc3Connection.java @@ -7,10 +7,10 @@ */ package org.postgresql.jdbc3; -import java.net.InetSocketAddress; import java.util.Properties; import java.sql.*; +import org.postgresql.util.HostSpec; import org.postgresql.util.PSQLException; import org.postgresql.util.PSQLState; import org.postgresql.util.GT; @@ -25,8 +25,8 @@ public abstract class AbstractJdbc3Connection extends org.postgresql.jdbc2.Abstr private int rsHoldability = ResultSet.CLOSE_CURSORS_AT_COMMIT; private int savepointId = 0; - protected AbstractJdbc3Connection(InetSocketAddress[] address, String user, String database, Properties info, String url) throws SQLException { - super(address, user, database, info, url); + protected AbstractJdbc3Connection(HostSpec[] hostSpec, String user, String database, Properties info, String url) throws SQLException { + super(hostSpec, user, database, info, url); } /** diff --git a/org/postgresql/jdbc3/Jdbc3Connection.java b/org/postgresql/jdbc3/Jdbc3Connection.java index 7be70fb..470f04c 100644 --- a/org/postgresql/jdbc3/Jdbc3Connection.java +++ b/org/postgresql/jdbc3/Jdbc3Connection.java @@ -7,11 +7,12 @@ */ package org.postgresql.jdbc3; -import java.net.InetSocketAddress; import java.util.Map; import java.util.Properties; import java.sql.SQLException; +import org.postgresql.util.HostSpec; + /** * This class implements the java.sql.Connection interface for JDBC3. * However most of the implementation is really done in @@ -19,8 +20,8 @@ import java.sql.SQLException; */ public class Jdbc3Connection extends org.postgresql.jdbc3.AbstractJdbc3Connection implements java.sql.Connection { - public Jdbc3Connection(InetSocketAddress[] address,, String user, String database, Properties info, String url) throws SQLException { - super(address, user, database, info, url); + public Jdbc3Connection(HostSpec[] hostSpecs,, String user, String database, Properties info, String url) throws SQLException { + super(hostSpecs, user, database, info, url); } public java.sql.Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException diff --git a/org/postgresql/jdbc3g/AbstractJdbc3gConnection.java b/org/postgresql/jdbc3g/AbstractJdbc3gConnection.java index 61e58b6..1b42c33 100644 --- a/org/postgresql/jdbc3g/AbstractJdbc3gConnection.java +++ b/org/postgresql/jdbc3g/AbstractJdbc3gConnection.java @@ -7,18 +7,18 @@ */ package org.postgresql.jdbc3g; -import java.net.InetSocketAddress; import java.sql.SQLException; import java.util.Properties; import org.postgresql.core.Oid; import org.postgresql.core.TypeInfo; +import org.postgresql.util.HostSpec; public abstract class AbstractJdbc3gConnection extends org.postgresql.jdbc3.AbstractJdbc3Connection { - public AbstractJdbc3gConnection(InetSocketAddress[] address, String user, String database, Properties info, String url) throws SQLException { - super(address, user, database, info, url); + public AbstractJdbc3gConnection(HostSpec[] hostSpecs, String user, String database, Properties info, String url) throws SQLException { + super(hostSpecs, user, database, info, url); TypeInfo types = getTypeInfo(); if (haveMinimumServerVersion("8.3")) { diff --git a/org/postgresql/jdbc3g/Jdbc3gConnection.java b/org/postgresql/jdbc3g/Jdbc3gConnection.java index 4ff2dbc..b8dfe00 100644 --- a/org/postgresql/jdbc3g/Jdbc3gConnection.java +++ b/org/postgresql/jdbc3g/Jdbc3gConnection.java @@ -7,11 +7,12 @@ */ package org.postgresql.jdbc3g; -import java.net.InetSocketAddress; import java.util.Map; import java.util.Properties; import java.sql.SQLException; +import org.postgresql.util.HostSpec; + /** * This class implements the java.sql.Connection interface for JDBC3. * However most of the implementation is really done in @@ -19,8 +20,8 @@ import java.sql.SQLException; */ public class Jdbc3gConnection extends org.postgresql.jdbc3g.AbstractJdbc3gConnection implements java.sql.Connection { - public Jdbc3gConnection(InetSocketAddress[] address, String user, String database, Properties info, String url) throws SQLException { - super(address, user, database, info, url); + public Jdbc3gConnection(HostSpec[] hostSpecs, String user, String database, Properties info, String url) throws SQLException { + super(hostSpecs, user, database, info, url); } public java.sql.Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException diff --git a/org/postgresql/jdbc4/AbstractJdbc4Connection.java b/org/postgresql/jdbc4/AbstractJdbc4Connection.java index 444a582..8a89a80 100644 --- a/org/postgresql/jdbc4/AbstractJdbc4Connection.java +++ b/org/postgresql/jdbc4/AbstractJdbc4Connection.java @@ -7,7 +7,6 @@ */ package org.postgresql.jdbc4; -import java.net.InetSocketAddress; import java.sql.*; import java.util.Map; import java.util.HashMap; @@ -19,6 +18,7 @@ import org.postgresql.core.Oid; import org.postgresql.core.Utils; import org.postgresql.core.TypeInfo; import org.postgresql.util.GT; +import org.postgresql.util.HostSpec; import org.postgresql.util.PSQLState; import org.postgresql.util.PSQLException; import org.postgresql.jdbc2.AbstractJdbc2Array; @@ -27,8 +27,8 @@ abstract class AbstractJdbc4Connection extends org.postgresql.jdbc3g.AbstractJdb { private final Properties _clientInfo; - public AbstractJdbc4Connection(InetSocketAddress[] address, String user, String database, Properties info, String url) throws SQLException { - super(address, user, database, info, url); + public AbstractJdbc4Connection(HostSpec[] hostSpecs, String user, String database, Properties info, String url) throws SQLException { + super(hostSpecs, user, database, info, url); TypeInfo types = getTypeInfo(); if (haveMinimumServerVersion("8.3")) { diff --git a/org/postgresql/jdbc4/Jdbc4Connection.java b/org/postgresql/jdbc4/Jdbc4Connection.java index 06fd289..209b970 100644 --- a/org/postgresql/jdbc4/Jdbc4Connection.java +++ b/org/postgresql/jdbc4/Jdbc4Connection.java @@ -7,11 +7,12 @@ */ package org.postgresql.jdbc4; -import java.net.InetSocketAddress; import java.util.Map; import java.util.Properties; import java.sql.SQLException; +import org.postgresql.util.HostSpec; + /** * This class implements the java.sql.Connection interface for JDBC4. * However most of the implementation is really done in @@ -19,8 +20,8 @@ import java.sql.SQLException; */ public class Jdbc4Connection extends AbstractJdbc4Connection implements java.sql.Connection { - public Jdbc4Connection(InetSocketAddress[] address, String user, String database, Properties info, String url) throws SQLException { - super(address, user, database, info, url); + public Jdbc4Connection(HostSpec[] hostSpecs, String user, String database, Properties info, String url) throws SQLException { + super(hostSpecs, user, database, info, url); } public java.sql.Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException diff --git a/org/postgresql/ssl/jdbc3/AbstractJdbc3MakeSSL.java b/org/postgresql/ssl/jdbc3/AbstractJdbc3MakeSSL.java index b968f17..a5ae634 100644 --- a/org/postgresql/ssl/jdbc3/AbstractJdbc3MakeSSL.java +++ b/org/postgresql/ssl/jdbc3/AbstractJdbc3MakeSSL.java @@ -59,7 +59,7 @@ public class AbstractJdbc3MakeSSL { } } - Socket newConnection = factory.createSocket(stream.getSocket(), stream.getAddress().getHostName(), stream.getAddress().getPort(), true); + Socket newConnection = factory.createSocket(stream.getSocket(), stream.getHostSpec().getHost(), stream.getHostSpec().getPort(), true); stream.changeSocket(newConnection); } diff --git a/org/postgresql/ssl/jdbc4/AbstractJdbc4MakeSSL.java b/org/postgresql/ssl/jdbc4/AbstractJdbc4MakeSSL.java index aed726e..b4ebd89 100644 --- a/org/postgresql/ssl/jdbc4/AbstractJdbc4MakeSSL.java +++ b/org/postgresql/ssl/jdbc4/AbstractJdbc4MakeSSL.java @@ -114,7 +114,7 @@ public class AbstractJdbc4MakeSSL { SSLSocket newConnection; try { - newConnection = (SSLSocket)factory.createSocket(stream.getSocket(), stream.getAddress().getHostName(), stream.getAddress().getPort(), true); + newConnection = (SSLSocket)factory.createSocket(stream.getSocket(), stream.getHostSpec().getHost(), stream.getHostSpec().getPort(), true); newConnection.startHandshake(); //We must invoke manually, otherwise the exceptions are hidden } catch (IOException ex) { @@ -137,16 +137,16 @@ public class AbstractJdbc4MakeSSL { { throw new PSQLException(GT.tr("The HostnameVerifier class provided {0} could not be instantiated.", sslhostnameverifier), PSQLState.CONNECTION_FAILURE, e); } - if (!hvn.verify(stream.getAddress().getHostName(), newConnection.getSession())) + if (!hvn.verify(stream.getHostSpec().getHost(), newConnection.getSession())) { - throw new PSQLException(GT.tr("The hostname {0} could not be verified by hostnameverifier {1}.", new Object[]{stream.getAddress().getHostName(), sslhostnameverifier}), PSQLState.CONNECTION_FAILURE); + throw new PSQLException(GT.tr("The hostname {0} could not be verified by hostnameverifier {1}.", new Object[]{stream.getHostSpec().getHost(), sslhostnameverifier}), PSQLState.CONNECTION_FAILURE); } } else { if ("verify-full".equals(sslmode) && factory instanceof LibPQFactory) { - if (!(((LibPQFactory)factory).verify(stream.getAddress().getHostName(), newConnection.getSession()))) + if (!(((LibPQFactory)factory).verify(stream.getHostSpec().getHost(), newConnection.getSession()))) { - throw new PSQLException(GT.tr("The hostname {0} could not be verified.", stream.getAddress().getHostName()), PSQLState.CONNECTION_FAILURE); + throw new PSQLException(GT.tr("The hostname {0} could not be verified.", stream.getHostSpec().getHost()), PSQLState.CONNECTION_FAILURE); } } diff --git a/org/postgresql/util/HostSpec.java b/org/postgresql/util/HostSpec.java new file mode 100644 index 0000000..42ce462 --- /dev/null +++ b/org/postgresql/util/HostSpec.java @@ -0,0 +1,34 @@ +/*------------------------------------------------------------------------- +* +* Copyright (c) 2012, PostgreSQL Global Development Group +* +* +*------------------------------------------------------------------------- +*/ +package org.postgresql.util; + +/** + * Simple container for host and port. + */ +public class HostSpec { + protected final String host; + protected final int port; + + public HostSpec(String host, int port) + { + this.host = host; + this.port = port; + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + public String toString() { + return host + ":" + port; + } +}