📄 connectionjdbc2.java
字号:
} /** * Indicates whether fast forward only cursors should be used for forward * only result sets. * * @return <code>true</code> if fast forward cursors are requested */ boolean getUseCursors() { return this.useCursors; } /** * Indicates whether large types (IMAGE and TEXT/NTEXT) should be mapped by * default to LOB types or <code>String</code> and <code>byte[]</code> * respectively. * * @return <code>true</code> if the default mapping should be to LOBs, * <code>false</code> otherwise */ boolean getUseLOBs() { return this.useLOBs; } /** * Transfers the properties to the local instance variables. * * @param info The connection properties Object. * @throws SQLException If an invalid property value is found. */ protected void unpackProperties(Properties info) throws SQLException { serverName = info.getProperty(Messages.get(Driver.SERVERNAME)); portNumber = parseIntegerProperty(info, Driver.PORTNUMBER); serverType = parseIntegerProperty(info, Driver.SERVERTYPE); databaseName = info.getProperty(Messages.get(Driver.DATABASENAME)); instanceName = info.getProperty(Messages.get(Driver.INSTANCE)); domainName = info.getProperty(Messages.get(Driver.DOMAIN)); user = info.getProperty(Messages.get(Driver.USER)); password = info.getProperty(Messages.get(Driver.PASSWORD)); macAddress = info.getProperty(Messages.get(Driver.MACADDRESS)); 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)); 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))); charsetSpecified = serverCharset.length() > 0; 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 { // Sensible minimum for all other versions of TDS packetSize = TdsCore.MIN_PKT_SIZE; } } if (packetSize > TdsCore.MAX_PKT_SIZE) { packetSize = TdsCore.MAX_PKT_SIZE; } packetSize = (packetSize / 512) * 512; loginTimeout = parseIntegerProperty(info, Driver.LOGINTIMEOUT); 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"); } 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 isUseUnicode() { 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 { // 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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -