package com.microsoft.sqlserver.jdbc;
import java.util.HashMap;
import java.util.logging.Level;
final class FailoverMapSingleton {
private static int initialHashmapSize = 5;
private static HashMap<String, FailoverInfo> failoverMap = new HashMap<>(initialHashmapSize);
private FailoverMapSingleton() {
}
private static String concatPrimaryDatabase(String primary, String instance, String database) {
StringBuilder buf = new StringBuilder();
buf.append(primary);
if (null != instance) {
buf.append("\\");
buf.append(instance);
}
buf.append(";");
buf.append(database);
return buf.toString();
}
static FailoverInfo getFailoverInfo(SQLServerConnection connection, String primaryServer, String instance,
String database) {
synchronized (FailoverMapSingleton.class) {
if (failoverMap.isEmpty()) {
return null;
} else {
String mapKey = concatPrimaryDatabase(primaryServer, instance, database);
if (connection.getConnectionLogger().isLoggable(Level.FINER))
connection.getConnectionLogger()
.finer(connection.toString() + " Looking up info in the map using key: " + mapKey);
FailoverInfo fo = failoverMap.get(mapKey);
if (null != fo)
fo.log(connection);
return fo;
}
}
}
static void putFailoverInfo(SQLServerConnection connection, String primaryServer, String instance, String database,
FailoverInfo actualFailoverInfo, boolean actualuseFailover,
String failoverPartner) throws SQLServerException {
FailoverInfo fo;
synchronized (FailoverMapSingleton.class) {
if (null == (fo = getFailoverInfo(connection, primaryServer, instance, database))) {
if (connection.getConnectionLogger().isLoggable(Level.FINE))
connection.getConnectionLogger().fine(connection.toString() + " Failover map add server: "
+ primaryServer + "; database:" + database + "; Mirror:" + failoverPartner);
failoverMap.put(concatPrimaryDatabase(primaryServer, instance, database), actualFailoverInfo);
} else
fo.failoverAdd(connection, actualuseFailover, failoverPartner);
}
}
}