All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.postgresql.core.ConnectionFactory Maven / Gradle / Ivy

/*-------------------------------------------------------------------------
*
* Copyright (c) 2004-2011, PostgreSQL Global Development Group
* Copyright (c) 2004, Open Cloud Limited.
*
*
*-------------------------------------------------------------------------
*/
package org.postgresql.core;

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;

/**
 * Handles protocol-specific connection setup.
 *
 * @author Oliver Jowett ([email protected])
 */
public abstract class ConnectionFactory {
    /**
     * Protocol version to implementation instance map.
     * If no protocol version is specified, instances are
     * tried in order until an exception is thrown or a non-null
     * connection is returned.
     */
    private static final Object[][] versions = {
                { "3", new org.postgresql.core.v3.ConnectionFactoryImpl() },
                { "2", new org.postgresql.core.v2.ConnectionFactoryImpl() },
            };

    /**
     * Establishes and initializes a new connection.
     *

* If the "protocolVersion" property is specified, only that protocol * version is tried. Otherwise, all protocols are tried in order, falling * back to older protocols as necessary. *

* Currently, protocol versions 3 (7.4+) and 2 (pre-7.4) are supported. * * @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; * notably, "password" if present supplies the password to authenticate with. * @param logger the logger to use for this connection * @return the new, initialized, connection * @throws SQLException if the connection could not be established. */ 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) { String versionProtoName = (String) versions[i][0]; if (protoName != null && !protoName.equals(versionProtoName)) continue; ConnectionFactory factory = (ConnectionFactory) versions[i][1]; ProtocolConnection connection = factory.openConnectionImpl(hostSpecs, user, database, info, logger); if (connection != null) return connection; } throw new PSQLException(GT.tr("A connection could not be made using the requested protocol {0}.", protoName), PSQLState.CONNECTION_UNABLE_TO_CONNECT); } /** * Implementation of {@link #openConnection} for a particular protocol version. * Implemented by subclasses of {@link ConnectionFactory}. * * @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; * notably, "password" if present supplies the password to authenticate with. * @param logger the logger to use for this connection * @return the new, initialized, connection, or null if this protocol * version is not supported by the server. * @throws SQLException if the connection could not be established for a reason other * than protocol version incompatibility. */ public abstract ProtocolConnection openConnectionImpl(HostSpec[] hostSpecs, String user, String database, Properties info, Logger logger) throws SQLException; }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy