📄 connectionjdbc2.java
字号:
appName = info.getProperty(Messages.get(Driver.APPNAME));
progName = info.getProperty(Messages.get(Driver.PROGNAME));
wsid = info.getProperty(Messages.get(Driver.WSID));
serverCharset = info.getProperty(Messages.get(Driver.CHARSET));
language = info.getProperty(Messages.get(Driver.LANGUAGE));
bindAddress = info.getProperty(Messages.get(Driver.BINDADDRESS));
lastUpdateCount = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.LASTUPDATECOUNT)));
useUnicode = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.SENDSTRINGPARAMETERSASUNICODE)));
namedPipe = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.NAMEDPIPE)));
tcpNoDelay = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.TCPNODELAY)));
useCursors = (serverType == Driver.SQLSERVER)
&& "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.USECURSORS)));
useLOBs = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.USELOBS)));
useMetadataCache = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.CACHEMETA)));
xaEmulation = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.XAEMULATION)));
useJCIFS = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.USEJCIFS)));
charsetSpecified = serverCharset.length() > 0;
useNTLMv2 = "true".equalsIgnoreCase(
info.getProperty(Messages.get(Driver.USENTLMV2)));
//note:mdb in certain cases (e.g. NTLMv2) the domain name must be
// all upper case for things to work.
if( domainName != null )
domainName = domainName.toUpperCase();
Integer parsedTdsVersion =
DefaultProperties.getTdsVersion(info.getProperty(Messages.get(Driver.TDS)));
if (parsedTdsVersion == null) {
throw new SQLException(Messages.get("error.connection.badprop",
Messages.get(Driver.TDS)), "08001");
}
tdsVersion = parsedTdsVersion.intValue();
packetSize = parseIntegerProperty(info, Driver.PACKETSIZE);
if (packetSize < TdsCore.MIN_PKT_SIZE) {
if (tdsVersion >= Driver.TDS70) {
// Default of 0 means let the server specify packet size
packetSize = (packetSize == 0) ? 0 : TdsCore.DEFAULT_MIN_PKT_SIZE_TDS70;
} else if (tdsVersion == Driver.TDS42) {
// Sensible minimum for older versions of TDS
packetSize = TdsCore.MIN_PKT_SIZE;
} // else for TDS 5 can auto negotiate
}
if (packetSize > TdsCore.MAX_PKT_SIZE) {
packetSize = TdsCore.MAX_PKT_SIZE;
}
packetSize = (packetSize / 512) * 512;
loginTimeout = parseIntegerProperty(info, Driver.LOGINTIMEOUT);
socketTimeout = parseIntegerProperty(info, Driver.SOTIMEOUT);
lobBuffer = parseLongProperty(info, Driver.LOBBUFFER);
maxStatements = parseIntegerProperty(info, Driver.MAXSTATEMENTS);
statementCache = new ProcedureCache(maxStatements);
prepareSql = parseIntegerProperty(info, Driver.PREPARESQL);
if (prepareSql < 0) {
prepareSql = 0;
} else if (prepareSql > 3) {
prepareSql = 3;
}
// For Sybase use equivalent of sp_executesql.
if (tdsVersion < Driver.TDS70 && prepareSql == TdsCore.PREPARE) {
prepareSql = TdsCore.EXECUTE_SQL;
}
// For SQL 6.5 sp_executesql not available so use stored procedures.
if (tdsVersion < Driver.TDS50 && prepareSql == TdsCore.EXECUTE_SQL) {
prepareSql = TdsCore.TEMPORARY_STORED_PROCEDURES;
}
ssl = info.getProperty(Messages.get(Driver.SSL));
batchSize = parseIntegerProperty(info, Driver.BATCHSIZE);
if (batchSize < 0) {
throw new SQLException(Messages.get("error.connection.badprop",
Messages.get(Driver.BATCHSIZE)), "08001");
}
bufferDir = new File(info.getProperty(Messages.get(Driver.BUFFERDIR)));
if (!bufferDir.isDirectory()) {
if (!bufferDir.mkdirs()) {
throw new SQLException(Messages.get("error.connection.badprop",
Messages.get(Driver.BUFFERDIR)), "08001");
}
}
bufferMaxMemory = parseIntegerProperty(info, Driver.BUFFERMAXMEMORY);
if (bufferMaxMemory < 0) {
throw new SQLException(Messages.get("error.connection.badprop",
Messages.get(Driver.BUFFERMAXMEMORY)), "08001");
}
bufferMinPackets = parseIntegerProperty(info, Driver.BUFFERMINPACKETS);
if (bufferMinPackets < 1) {
throw new SQLException(Messages.get("error.connection.badprop",
Messages.get(Driver.BUFFERMINPACKETS)), "08001");
}
}
/**
* Parse a string property value into an integer value.
*
* @param info The connection properties object.
* @param key The message key used to retrieve the property name.
* @return The integer value of the string property value.
* @throws SQLException If the property value can't be parsed.
*/
private static int parseIntegerProperty(final Properties info, final String key)
throws SQLException {
final String propertyName = Messages.get(key);
try {
return Integer.parseInt(info.getProperty(propertyName));
} catch (NumberFormatException e) {
throw new SQLException(
Messages.get("error.connection.badprop", propertyName), "08001");
}
}
/**
* Parse a string property value into a long value.
*
* @param info The connection properties object.
* @param key The message key used to retrieve the property name.
* @return The long value of the string property value.
* @throws SQLException If the property value can't be parsed.
*/
private static long parseLongProperty(final Properties info, final String key)
throws SQLException {
final String propertyName = Messages.get(key);
try {
return Long.parseLong(info.getProperty(propertyName));
} catch (NumberFormatException e) {
throw new SQLException(
Messages.get("error.connection.badprop", propertyName), "08001");
}
}
/**
* Retrieve the Java charset to use for encoding.
*
* @return the Charset name as a <code>String</code>
*/
protected String getCharset() {
return charsetInfo.getCharset();
}
/**
* Retrieve the multibyte status of the current character set.
*
* @return <code>boolean</code> true if a multi byte character set
*/
protected boolean isWideChar() {
return charsetInfo.isWideChars();
}
/**
* Retrieve the <code>CharsetInfo</code> instance used by this connection.
*
* @return the default <code>CharsetInfo</code> for this connection
*/
protected CharsetInfo getCharsetInfo() {
return charsetInfo;
}
/**
* Retrieve the sendParametersAsUnicode flag.
*
* @return <code>boolean</code> true if parameters should be sent as unicode.
*/
protected boolean getUseUnicode() {
return this.useUnicode;
}
/**
* Retrieve the Sybase capability data.
*
* @return Capability bit mask as an <code>int</code>.
*/
protected boolean getSybaseInfo(int flag) {
return (this.sybaseInfo & flag) != 0;
}
/**
* Set the Sybase capability data.
*
* @param mask The capability bit mask.
*/
protected void setSybaseInfo(int mask) {
this.sybaseInfo = mask;
}
/**
* Called by the protocol to change the current character set.
*
* @param charset the server character set name
*/
protected void setServerCharset(final String charset) throws SQLException {
// If the user specified a charset, ignore environment changes
if (charsetSpecified) {
Logger.println("Server charset " + charset +
". Ignoring as user requested " + serverCharset + '.');
return;
}
if (!charset.equals(serverCharset)) {
loadCharset(charset);
if (Logger.isActive()) {
Logger.println("Set charset to " + serverCharset + '/'
+ charsetInfo);
}
}
}
/**
* Load the Java charset to match the server character set.
*
* @param charset the server character set
*/
private void loadCharset(String charset) throws SQLException {
// MS SQL Server's iso_1 is Cp1252 not ISO-8859-1!
if (getServerType() == Driver.SQLSERVER
&& charset.equalsIgnoreCase("iso_1")) {
charset = "Cp1252";
}
// Do not default to any charset; if the charset is not found we want
// to know about it
CharsetInfo tmp = CharsetInfo.getCharset(charset);
if (tmp == null) {
throw new SQLException(
Messages.get("error.charset.nomapping", charset), "2C000");
}
loadCharset(tmp, charset);
serverCharset = charset;
}
/**
* Load the Java charset to match the server character set.
*
* @param ci the <code>CharsetInfo</code> to load
*/
private void loadCharset(CharsetInfo ci, String ref) throws SQLException {
try {
"This is a test".getBytes(ci.getCharset());
charsetInfo = ci;
} catch (UnsupportedEncodingException ex) {
throw new SQLException(
Messages.get("error.charset.invalid", ref,
ci.getCharset()),
"2C000");
}
socket.setCharsetInfo(charsetInfo);
}
/**
* Discovers the server charset for server versions that do not send
* <code>ENVCHANGE</code> packets on login ack, by executing a DB
* vendor/version specific query.
* <p>
* Will throw an <code>SQLException</code> if used on SQL Server 7.0 or
* 2000; the idea is that the charset should already be determined from
* <code>ENVCHANGE</code> packets for these DB servers.
* <p>
* Should only be called from the constructor.
*
* @return the default server charset
* @throws SQLException if an error condition occurs
*/
private String determineServerCharset() throws SQLException {
String queryStr = null;
switch (serverType) {
case Driver.SQLSERVER:
if (databaseProductVersion.indexOf("6.5") >= 0) {
queryStr = SQL_SERVER_65_CHARSET_QUERY;
} else {
// This will never happen. Versions 7.0 and 2000 of SQL
// Server always send ENVCHANGE packets, even over TDS 4.2.
throw new SQLException(
"Please use TDS protocol version 7.0 or higher");
}
break;
case Driver.SYBASE:
// There's no need to check for versions here
queryStr = SYBASE_SERVER_CHARSET_QUERY;
break;
}
Statement stmt = this.createStatement();
ResultSet rs = stmt.executeQuery(queryStr);
rs.next();
String charset = rs.getString(1);
rs.close();
stmt.close();
return charset;
}
/**
* Set the default collation for this connection.
* <p>
* Set by a SQL Server 2000 environment change packet. The collation
* consists of the following fields:
* <ul>
* <li>bits 0-19 - The locale eg 0x0409 for US English which maps to code
* page 1252 (Latin1_General).
* <li>bits 20-31 - Reserved.
* <li>bits 32-39 - Sort order (csid from syscharsets)
* </ul>
* If the sort order is non-zero it determines the character set, otherwise
* the character set is determined by the locale id.
*
* @param collation The new collation.
*/
void setCollation(byte[] collation) throws SQLException {
String strCollation = "0x" + Support.toHex(collation);
// If the user specified a charset, ignore environment changes
if (charsetSpecified) {
Logger.println("Server collation " + strCollation +
". Ignoring as user requested " + serverCharset + '.');
return;
}
CharsetInfo tmp = CharsetInfo.getCharset(collation);
loadCharset(tmp, strCollation);
this.collation = collation;
if (Logger.isActive()) {
Logger.println("Set collation to " + strCollation + '/'
+ charsetInfo);
}
}
/**
* Retrieve the SQL Server 2000 default collation.
*
* @return The collation as a <code>byte[5]</code>.
*/
byte[] getCollation() {
return this.collation;
}
/**
* Retrieves whether a specific charset was requested on creation. If this
* is the case, all character data should be encoded/decoded using that
* charset.
*/
boolean isCharsetSpecified() {
return charsetSpecified;
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -