package com.microsoft.sqlserver.jdbc;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.logging.Level;
final class FailoverInfo {
private String failoverPartner;
private int portNumber;
private String failoverInstance;
private boolean setUpInfocalled;
private boolean useFailoverPartner;
boolean getUseFailoverPartner() {
return useFailoverPartner;
}
FailoverInfo(String failover, SQLServerConnection con, boolean actualFailoverPartner) {
failoverPartner = failover;
useFailoverPartner = actualFailoverPartner;
portNumber = -1;
}
void log(SQLServerConnection con) {
if (con.getConnectionLogger().isLoggable(Level.FINE))
con.getConnectionLogger().fine(con.toString() + " Failover server :" + failoverPartner
+ " Failover partner is primary : " + useFailoverPartner);
}
private void setupInfo(SQLServerConnection con) throws SQLServerException {
if (setUpInfocalled)
return;
if (0 == failoverPartner.length()) {
portNumber = SQLServerConnection.DEFAULTPORT;
} else {
int px = failoverPartner.indexOf('\\');
String instancePort;
String instanceValue;
if (px >= 0) {
if (con.getConnectionLogger().isLoggable(Level.FINE))
con.getConnectionLogger().fine(con.toString() + " Failover server :" + failoverPartner);
instanceValue = failoverPartner.substring(px + 1, failoverPartner.length());
failoverPartner = failoverPartner.substring(0, px);
con.validateMaxSQLLoginName(SQLServerDriverStringProperty.INSTANCE_NAME.toString(), instanceValue);
failoverInstance = instanceValue;
instancePort = con.getInstancePort(failoverPartner, instanceValue);
try {
portNumber = Integer.parseInt(instancePort);
} catch (NumberFormatException e) {
MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_invalidPortNumber"));
Object[] msgArgs = {instancePort};
SQLServerException.makeFromDriverError(con, null, form.format(msgArgs), null, false);
}
} else
portNumber = SQLServerConnection.DEFAULTPORT;
}
setUpInfocalled = true;
}
synchronized ServerPortPlaceHolder failoverPermissionCheck(SQLServerConnection con,
boolean link) throws SQLServerException {
setupInfo(con);
return new ServerPortPlaceHolder(failoverPartner, portNumber, failoverInstance, link);
}
synchronized void failoverAdd(SQLServerConnection connection, boolean actualUseFailoverPartner,
String actualFailoverPartner) throws SQLServerException {
if (useFailoverPartner != actualUseFailoverPartner) {
if (connection.getConnectionLogger().isLoggable(Level.FINE))
connection.getConnectionLogger()
.fine(connection.toString() + " Failover detected. failover partner=" + actualFailoverPartner);
useFailoverPartner = actualUseFailoverPartner;
}
if (!actualUseFailoverPartner && !failoverPartner.equals(actualFailoverPartner)) {
failoverPartner = actualFailoverPartner;
setUpInfocalled = false;
}
}
}
final class ServerPortPlaceHolder implements Serializable {
private static final long serialVersionUID = 7393779415545731523L;
private final String serverName;
private final int port;
private final String instanceName;
private final boolean checkLink;
private final SQLServerConnectionSecurityManager securityManager;
ServerPortPlaceHolder(String name, int conPort, String instance, boolean fLink) {
serverName = name;
port = conPort;
instanceName = instance;
checkLink = fLink;
securityManager = new SQLServerConnectionSecurityManager(serverName, port);
doSecurityCheck();
}
int getPortNumber() {
return port;
}
String getServerName() {
return serverName;
}
String getInstanceName() {
return instanceName;
}
void doSecurityCheck() {
securityManager.checkConnect();
if (checkLink)
securityManager.checkLink();
}
}