From e7b9a0948c392f0693a6864729245fb921cb563e Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 11:52:52 -0800 Subject: [PATCH 01/13] fixed sonar --- .../com/microsoft/sqlserver/jdbc/DDC.java | 133 ++++------ .../sqlserver/jdbc/DLLException.java | 6 +- .../microsoft/sqlserver/jdbc/DataTypes.java | 2 +- .../sqlserver/jdbc/FailOverInfo.java | 2 +- .../sqlserver/jdbc/FailOverMapSingleton.java | 3 +- .../microsoft/sqlserver/jdbc/IOBuffer.java | 249 ++++++++---------- .../sqlserver/jdbc/ISQLServerBulkRecord.java | 2 +- .../jdbc/ISQLServerCallableStatement.java | 2 + .../sqlserver/jdbc/ISQLServerConnection.java | 8 +- .../sqlserver/jdbc/ISQLServerDataSource.java | 8 + .../sqlserver/jdbc/SQLServerBulkCopy.java | 90 ++++--- ...umnEncryptionCertificateStoreProvider.java | 4 +- .../sqlserver/jdbc/SQLServerConnection.java | 4 +- .../sqlserver/jdbc/fedauth/FedauthTest.java | 6 +- 14 files changed, 241 insertions(+), 278 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java b/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java index 8c88d4e765..abf2d74110 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java @@ -201,7 +201,7 @@ static final Object convertLongToObject(long longVal, JDBCType jdbcType, SSType * @return the byte array containing the big-endian encoded value. */ static final byte[] convertIntToBytes(int intValue, int valueLength) { - byte bytes[] = new byte[valueLength]; + byte[] bytes = new byte[valueLength]; for (int i = valueLength; i-- > 0;) { bytes[i] = (byte) (intValue & 0xFF); intValue >>= 8; @@ -258,7 +258,7 @@ static final Object convertFloatToObject(float floatVal, JDBCType jdbcType, Stre * @return the byte array containing the big-endian encoded value. */ static final byte[] convertLongToBytes(long longValue) { - byte bytes[] = new byte[8]; + byte[] bytes = new byte[8]; for (int i = 8; i-- > 0;) { bytes[i] = (byte) (longValue & 0xFF); longValue >>= 8; @@ -564,7 +564,7 @@ static final Object convertStringToObject(String stringVal, Charset charset, JDB return parseStringIntoLDT(stringVal.trim()); case DATE: return java.sql.Date.valueOf(getDatePart(stringVal.trim())); - case TIME: { + case TIME: // Accepted character formats for conversion to java.sql.Time are: // hh:mm:ss[.nnnnnnnnn] // YYYY-MM-DD hh:mm:ss[.nnnnnnnnn] @@ -582,7 +582,6 @@ static final Object convertStringToObject(String stringVal, Charset charset, JDB cal.add(Calendar.MILLISECOND, 1); cal.set(TDS.BASE_YEAR_1970, Calendar.JANUARY, 1); return new java.sql.Time(cal.getTimeInMillis()); - } case BINARY: return stringVal.getBytes(charset); @@ -924,7 +923,7 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca // Set the calendar value according to the specified local time zone and constituent // date (days since base date) and time (ticks since midnight) parts. switch (ssType) { - case TIME: { + case TIME: // Set the calendar to the specified value. Lenient calendar behavior will update // individual fields according to standard Gregorian leap year rules, which are sufficient // for all TIME values. @@ -940,11 +939,10 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca subSecondNanos = (int) (ticksSinceMidnight % Nanos.PER_SECOND); break; - } case DATE: case DATETIME2: - case DATETIMEOFFSET: { + case DATETIMEOFFSET: // For dates after the standard Julian-Gregorian calendar change date, // the calendar value can be accurately set using a straightforward // (and measurably better performing) assignment. @@ -1012,10 +1010,8 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca subSecondNanos = (int) (ticksSinceMidnight % Nanos.PER_SECOND); break; - } case DATETIME: // and SMALLDATETIME - { // For Yukon (and earlier) data types DATETIME and SMALLDATETIME, there is no need to // change the Gregorian cutover because the earliest representable value (1/1/1753) // is after the historically standard cutover date (10/15/1582). @@ -1030,7 +1026,6 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca subSecondNanos = (int) ((ticksSinceMidnight * Nanos.PER_MILLISECOND) % Nanos.PER_SECOND); break; - } default: MessageFormat form = new MessageFormat( @@ -1043,9 +1038,9 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca // Convert the calendar value (in local time) to the desired Java object type. switch (jdbcType.category) { case BINARY: - case SQL_VARIANT: { + case SQL_VARIANT: switch (ssType) { - case DATE: { + case DATE: // Per JDBC spec, the time part of java.sql.Date values is initialized to midnight // in the specified local time zone. cal.set(Calendar.HOUR_OF_DAY, 0); @@ -1053,14 +1048,12 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return new java.sql.Date(cal.getTimeInMillis()); - } case DATETIME: - case DATETIME2: { + case DATETIME2: java.sql.Timestamp ts = new java.sql.Timestamp(cal.getTimeInMillis()); ts.setNanos(subSecondNanos); return ts; - } case DATETIMEOFFSET: { // Per driver spec, conversion to DateTimeOffset is only supported from @@ -1074,12 +1067,12 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca // milliseconds precision results in no loss of precision. assert 0 == localMillisOffset % (60 * 1000); - java.sql.Timestamp ts = new java.sql.Timestamp(cal.getTimeInMillis()); - ts.setNanos(subSecondNanos); - return microsoft.sql.DateTimeOffset.valueOf(ts, localMillisOffset / (60 * 1000)); + java.sql.Timestamp ts1 = new java.sql.Timestamp(cal.getTimeInMillis()); + ts1.setNanos(subSecondNanos); + return microsoft.sql.DateTimeOffset.valueOf(ts1, localMillisOffset / (60 * 1000)); } - case TIME: { + case TIME: // Per driver spec, values of sql server data types types (including TIME) which have greater // than millisecond precision are rounded, not truncated, to the nearest millisecond when // converting to java.sql.Time. Since the milliseconds value in the calendar is truncated, @@ -1094,7 +1087,6 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca cal.set(TDS.BASE_YEAR_1970, Calendar.JANUARY, 1); return new java.sql.Time(cal.getTimeInMillis()); - } default: MessageFormat form = new MessageFormat( @@ -1102,9 +1094,8 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca throw new SQLServerException(form.format(new Object[] {ssType.name(), jdbcType}), null, 0, null); } - } - case DATE: { + case DATE: // Per JDBC spec, the time part of java.sql.Date values is initialized to midnight // in the specified local time zone. cal.set(Calendar.HOUR_OF_DAY, 0); @@ -1112,9 +1103,8 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return new java.sql.Date(cal.getTimeInMillis()); - } - case TIME: { + case TIME: // Per driver spec, values of sql server data types types (including TIME) which have greater // than millisecond precision are rounded, not truncated, to the nearest millisecond when // converting to java.sql.Time. Since the milliseconds value in the calendar is truncated, @@ -1129,18 +1119,16 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca cal.set(TDS.BASE_YEAR_1970, Calendar.JANUARY, 1); return new java.sql.Time(cal.getTimeInMillis()); - } - case TIMESTAMP: { - java.sql.Timestamp ts = new java.sql.Timestamp(cal.getTimeInMillis()); - ts.setNanos(subSecondNanos); + case TIMESTAMP: + java.sql.Timestamp ts2 = new java.sql.Timestamp(cal.getTimeInMillis()); + ts2.setNanos(subSecondNanos); if (jdbcType == JDBCType.LOCALDATETIME) { - return ts.toLocalDateTime(); + return ts2.toLocalDateTime(); } - return ts; - } + return ts2; - case DATETIMEOFFSET: { + case DATETIMEOFFSET: // Per driver spec, conversion to DateTimeOffset is only supported from // DATETIMEOFFSET SQL Server values. assert SSType.DATETIMEOFFSET == ssType; @@ -1155,26 +1143,22 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca java.sql.Timestamp ts = new java.sql.Timestamp(cal.getTimeInMillis()); ts.setNanos(subSecondNanos); return microsoft.sql.DateTimeOffset.valueOf(ts, localMillisOffset / (60 * 1000)); - } - case CHARACTER: { + case CHARACTER: switch (ssType) { - case DATE: { + case DATE: return String.format(Locale.US, "%1$tF", // yyyy-mm-dd cal); - } - case TIME: { + case TIME: return String.format(Locale.US, "%1$tT%2$s", // hh:mm:ss[.nnnnnnn] cal, fractionalSecondsString(subSecondNanos, fractionalSecondsScale)); - } - case DATETIME2: { + case DATETIME2: return String.format(Locale.US, "%1$tF %1$tT%2$s", // yyyy-mm-dd hh:mm:ss[.nnnnnnn] cal, fractionalSecondsString(subSecondNanos, fractionalSecondsScale)); - } - case DATETIMEOFFSET: { + case DATETIMEOFFSET: // The offset part of a DATETIMEOFFSET value is precise only to the minute, // but TimeZone returns the raw offset as precise to the millisecond. assert 0 == localMillisOffset % (60 * 1000); @@ -1186,12 +1170,9 @@ static final Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, Ca cal, fractionalSecondsString(subSecondNanos, fractionalSecondsScale), (localMillisOffset >= 0) ? '+' : '-', unsignedMinutesOffset / 60, unsignedMinutesOffset % 60); - } case DATETIME: // and SMALLDATETIME - { return (new java.sql.Timestamp(cal.getTimeInMillis())).toString(); - } default: MessageFormat form = new MessageFormat( @@ -1199,7 +1180,6 @@ cal, fractionalSecondsString(subSecondNanos, fractionalSecondsScale), throw new SQLServerException(form.format(new Object[] {ssType.name(), jdbcType}), null, 0, null); } - } default: MessageFormat form = new MessageFormat( @@ -1219,46 +1199,42 @@ private static Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, LocalDateTime ldt; switch (ssType) { - case TIME: { + case TIME: ldt = LocalDateTime.of(TDS.BASE_LOCAL_DATE_1900, LocalTime.ofNanoOfDay(ticksSinceMidnight)); subSecondNanos = (int) (ticksSinceMidnight % Nanos.PER_SECOND); break; - } case DATE: case DATETIME2: - case DATETIMEOFFSET: { - LocalDate ld = TDS.BASE_LOCAL_DATE.plusDays(daysSinceBaseDate); + case DATETIMEOFFSET: + LocalDate ld1 = TDS.BASE_LOCAL_DATE.plusDays(daysSinceBaseDate); // If the target is java.sql.Date or a datetime column is used to hold a timeless date, don't add the time component. if (ticksSinceMidnight == 0) { - ldt = LocalDateTime.of(ld, LocalTime.MIN); + ldt = LocalDateTime.of(ld1, LocalTime.MIN); subSecondNanos = 0; } else { - ldt = LocalDateTime.of(ld, LocalTime.ofNanoOfDay(ticksSinceMidnight)); + ldt = LocalDateTime.of(ld1, LocalTime.ofNanoOfDay(ticksSinceMidnight)); subSecondNanos = (int) (ticksSinceMidnight % Nanos.PER_SECOND); } break; - } case DATETIME: // and SMALLDATETIME - { - LocalDate ld = TDS.BASE_LOCAL_DATE_1900.plusDays(daysSinceBaseDate); + LocalDate ld2 = TDS.BASE_LOCAL_DATE_1900.plusDays(daysSinceBaseDate); // If the target is java.sql.Date or a datetime column is used to hold a timeless date, don't add the time component. if (ticksSinceMidnight == 0) { - ldt = LocalDateTime.of(ld, LocalTime.MIN); + ldt = LocalDateTime.of(ld2, LocalTime.MIN); subSecondNanos = 0; } else { long nanoOfDay = ticksSinceMidnight * Nanos.PER_MILLISECOND; if (nanoOfDay > LocalTime.MAX.toNanoOfDay()) { - ldt = LocalDateTime.of(ld, LocalTime.MIN).plusNanos(nanoOfDay); + ldt = LocalDateTime.of(ld2, LocalTime.MIN).plusNanos(nanoOfDay); } else { - ldt = LocalDateTime.of(ld, LocalTime.ofNanoOfDay(nanoOfDay)); + ldt = LocalDateTime.of(ld2, LocalTime.ofNanoOfDay(nanoOfDay)); } subSecondNanos = (int) (nanoOfDay % Nanos.PER_SECOND); } break; - } default: MessageFormat form = new MessageFormat( @@ -1268,27 +1244,24 @@ private static Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, switch (jdbcType.category) { case BINARY: - case SQL_VARIANT: { + case SQL_VARIANT: switch (ssType) { - case DATE: { + case DATE: return java.sql.Date.valueOf(ldt.toLocalDate()); - } case DATETIME: - case DATETIME2: { + case DATETIME2: java.sql.Timestamp ts = java.sql.Timestamp.valueOf(ldt); ts.setNanos(subSecondNanos); return ts; - } - case TIME: { + case TIME: if (subSecondNanos % Nanos.PER_MILLISECOND >= Nanos.PER_MILLISECOND / 2) { ldt = ldt.plusNanos(1000000); } java.sql.Time t = java.sql.Time.valueOf(ldt.toLocalTime()); t.setTime(t.getTime() + (ldt.getNano() / Nanos.PER_MILLISECOND)); return t; - } default: MessageFormat form = new MessageFormat( @@ -1296,22 +1269,19 @@ private static Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, throw new SQLServerException(form.format(new Object[] {ssType.name(), jdbcType}), null, 0, null); } - } - case DATE: { + case DATE: return java.sql.Date.valueOf(ldt.toLocalDate()); - } - case TIME: { + case TIME: if (subSecondNanos % Nanos.PER_MILLISECOND >= Nanos.PER_MILLISECOND / 2) { ldt = ldt.plusNanos(1000000); } java.sql.Time t = java.sql.Time.valueOf(ldt.toLocalTime()); t.setTime(t.getTime() + (ldt.getNano() / Nanos.PER_MILLISECOND)); return t; - } - case TIMESTAMP: { + case TIMESTAMP: if (jdbcType == JDBCType.LOCALDATETIME) { return ldt; } @@ -1319,30 +1289,24 @@ private static Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, java.sql.Timestamp ts = java.sql.Timestamp.valueOf(ldt); ts.setNanos(subSecondNanos); return ts; - } - case CHARACTER: { + case CHARACTER: switch (ssType) { - case DATE: { + case DATE: return String.format(Locale.US, "%1$tF", // yyyy-mm-dd java.sql.Timestamp.valueOf(ldt)); - } - case TIME: { + case TIME: return String.format(Locale.US, "%1$tT%2$s", // hh:mm:ss[.nnnnnnn] ldt, fractionalSecondsString(subSecondNanos, fractionalSecondsScale)); - } - case DATETIME2: { + case DATETIME2: return String.format(Locale.US, "%1$tF %1$tT%2$s", // yyyy-mm-dd hh:mm:ss[.nnnnnnn] java.sql.Timestamp.valueOf(ldt), fractionalSecondsString(subSecondNanos, fractionalSecondsScale)); - } case DATETIME: // and SMALLDATETIME - { return (java.sql.Timestamp.valueOf(ldt)).toString(); - } default: MessageFormat form = new MessageFormat( @@ -1350,7 +1314,6 @@ private static Object convertTemporalToObject(JDBCType jdbcType, SSType ssType, throw new SQLServerException(form.format(new Object[] {ssType.name(), jdbcType}), null, 0, null); } - } default: MessageFormat form = new MessageFormat( @@ -1436,7 +1399,7 @@ static String convertReaderToString(Reader reader, int readerLength) throws SQLS // Set up the buffer into which blocks of characters are read from the Reader. This buffer // should be no larger than the Reader value's size (if known). For known very large values, // limit the buffer's size to reduce this function's memory requirements. - char charArray[] = new char[(DataTypes.UNKNOWN_STREAM_LENGTH != readerLength + char[] charArray = new char[(DataTypes.UNKNOWN_STREAM_LENGTH != readerLength && readerLength < 4000) ? readerLength : 4000]; // Loop and read characters, chunk into StringBuilder until EOS. @@ -1529,7 +1492,7 @@ public int read(byte[] b) throws IOException { } @Override - public int read(byte b[], int offset, int maxBytes) throws IOException { + public int read(byte[] b, int offset, int maxBytes) throws IOException { int bytesRead = containedStream.read(b, offset, maxBytes); if (bytesRead > 0) { assert offset + bytesRead <= b.length; @@ -1612,7 +1575,7 @@ public int read(byte[] b) throws IOException { @Override public int read(byte b[], int offset, int maxBytes) throws IOException { - char tempBufferToHoldCharDataForConversion[] = new char[maxBytes]; + char[] tempBufferToHoldCharDataForConversion = new char[maxBytes]; int charsRead = containedReader.read(tempBufferToHoldCharDataForConversion); if (charsRead > 0) { diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/DLLException.java b/src/main/java/com/microsoft/sqlserver/jdbc/DLLException.java index ee7cda940e..9e1d9e34c8 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/DLLException.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/DLLException.java @@ -60,15 +60,15 @@ int getErrCode() { return this.errCode; } - String GetParam1() { + String getParam1() { return this.param1; } - String GetParam2() { + String getParam2() { return this.param2; } - String GetParam3() { + String getParam3() { return this.param3; } diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java b/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java index 487705dde8..2e8a4a1088 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java @@ -73,7 +73,7 @@ enum TDSType { private static final int MAXELEMENTS = 256; private static final TDSType[] VALUES = values(); - private static final TDSType valuesTypes[] = new TDSType[MAXELEMENTS]; + private static final TDSType[] valuesTypes = new TDSType[MAXELEMENTS]; byte byteValue() { return (byte) intValue; diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/FailOverInfo.java b/src/main/java/com/microsoft/sqlserver/jdbc/FailOverInfo.java index e0c769c38c..940e5dc97b 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/FailOverInfo.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/FailOverInfo.java @@ -31,7 +31,7 @@ boolean getUseFailoverPartner() { return useFailoverPartner; } - FailoverInfo(String failover, SQLServerConnection con, boolean actualFailoverPartner) { + FailoverInfo(String failover, boolean actualFailoverPartner) { failoverPartner = failover; useFailoverPartner = actualFailoverPartner; portNumber = -1; // init to -1 to make sure that the user of this class calls the failover check before getting diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/FailOverMapSingleton.java b/src/main/java/com/microsoft/sqlserver/jdbc/FailOverMapSingleton.java index 76fb5f5da8..85afc11d74 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/FailOverMapSingleton.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/FailOverMapSingleton.java @@ -56,8 +56,7 @@ static FailoverInfo getFailoverInfo(SQLServerConnection connection, String prima // failover server name provided // by the server. The map is only populated if the server sends failover info. static void putFailoverInfo(SQLServerConnection connection, String primaryServer, String instance, String database, - FailoverInfo actualFailoverInfo, boolean actualuseFailover, - String failoverPartner) throws SQLServerException { + FailoverInfo actualFailoverInfo, boolean actualuseFailover, String failoverPartner) { FailoverInfo fo; LOCK.lock(); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index fdb063b13a..3e3f3df278 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -26,7 +26,6 @@ import java.net.SocketAddress; import java.net.SocketException; import java.net.SocketTimeoutException; -import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.SelectionKey; @@ -1195,7 +1194,7 @@ private int readInternal(byte[] b, int offset, int maxBytes) throws IOException if (logger.isLoggable(Level.FINER)) logger.finer(super.toString() + " " + e.getMessage()); - logger.finer(toString() + " Reading bytes threw exception:" + e.getMessage()); + logger.finer(super.toString() + " Reading bytes threw exception:" + e.getMessage()); throw e; } } @@ -1403,7 +1402,7 @@ public int getPort() { } @Override - public int getReceiveBufferSize() throws SocketException { + public synchronized int getReceiveBufferSize() throws SocketException { return tdsChannel.tcpSocket.getReceiveBufferSize(); } @@ -1418,7 +1417,7 @@ public boolean getReuseAddress() throws SocketException { } @Override - public int getSendBufferSize() throws SocketException { + public synchronized int getSendBufferSize() throws SocketException { return tdsChannel.tcpSocket.getSendBufferSize(); } @@ -1428,7 +1427,7 @@ public int getSoLinger() throws SocketException { } @Override - public int getSoTimeout() throws SocketException { + public synchronized int getSoTimeout() throws SocketException { return tdsChannel.tcpSocket.getSoTimeout(); } @@ -1499,19 +1498,19 @@ public void connect(SocketAddress endpoint, int timeout) throws IOException { // Ignore calls to methods that would otherwise allow the SSL socket // to directly manipulate the underlying TCP socket @Override - public void close() throws IOException { + public synchronized void close() throws IOException { if (logger.isLoggable(Level.FINER)) logger.finer(logContext + " Ignoring close"); } @Override - public void setReceiveBufferSize(int size) throws SocketException { + public synchronized void setReceiveBufferSize(int size) throws SocketException { if (logger.isLoggable(Level.FINER)) logger.finer(toString() + " Ignoring setReceiveBufferSize size:" + size); } @Override - public void setSendBufferSize(int size) throws SocketException { + public synchronized void setSendBufferSize(int size) throws SocketException { if (logger.isLoggable(Level.FINER)) logger.finer(toString() + " Ignoring setSendBufferSize size:" + size); } @@ -1529,7 +1528,7 @@ public void setSoLinger(boolean on, int linger) throws SocketException { } @Override - public void setSoTimeout(int timeout) throws SocketException { + public synchronized void setSoTimeout(int timeout) throws SocketException { tdsChannel.tcpSocket.setSoTimeout(timeout); } @@ -2465,7 +2464,7 @@ Socket findSocket(String hostName, int portNumber, int timeoutInMilliSeconds, bo if (logger.isLoggable(Level.FINER)) { StringBuilder loggingString = new StringBuilder(this.toString()); loggingString.append(" Total no of InetAddresses: "); - loggingString.append(inetAddrs.length); + loggingString.append((inetAddrs != null) ? inetAddrs.length : 0); loggingString.append(". They are: "); for (InetAddress inetAddr : inetAddrs) { @@ -2475,7 +2474,7 @@ Socket findSocket(String hostName, int portNumber, int timeoutInMilliSeconds, bo logger.finer(loggingString.toString()); } - if (inetAddrs.length > IP_ADDRESS_LIMIT) { + if (inetAddrs != null && inetAddrs.length > IP_ADDRESS_LIMIT) { MessageFormat form = new MessageFormat( SQLServerException.getErrString("R_ipAddressLimitWithMultiSubnetFailover")); Object[] msgArgs = {Integer.toString(IP_ADDRESS_LIMIT)}; @@ -2485,7 +2484,7 @@ Socket findSocket(String hostName, int portNumber, int timeoutInMilliSeconds, bo conn.terminate(SQLServerException.DRIVER_ERROR_UNSUPPORTED_CONFIG, errorStr); } - if (inetAddrs.length == 1) { + if (inetAddrs != null && inetAddrs.length == 1) { // Single address so do not start any threads return getConnectedSocket(inetAddrs[0], portNumber, timeoutInMilliSeconds); } @@ -3156,11 +3155,9 @@ public void updateSelectedException(IOException ex, String traceId) { updatedException = true; } - if (updatedException) { - if (logger.isLoggable(Level.FINER)) { - logger.finer("The selected exception is updated to the following: ExceptionType:" + ex.getClass() - + "; ExceptionMessage:" + ex.getMessage() + "; by the following thread:" + traceId); - } + if (updatedException && logger.isLoggable(Level.FINER)) { + logger.finer("The selected exception is updated to the following: ExceptionType:" + ex.getClass() + + "; ExceptionMessage:" + ex.getMessage() + "; by the following thread:" + traceId); } } @@ -3334,9 +3331,6 @@ SharedTimer getSharedTimer() throws SQLServerException { private int packetNum = 0; // Bytes for sending decimal/numeric data - private final static int BYTES4 = 4; - private final static int BYTES8 = 8; - private final static int BYTES12 = 12; private final static int BYTES16 = 16; public final static int BIGDECIMAL_MAX_LENGTH = 0x11; @@ -3381,7 +3375,7 @@ boolean checkIfTdsMessageTypeIsBatchOrRPC() { void preparePacket() throws SQLServerException { if (tdsChannel.isLoggingPackets()) { Arrays.fill(logBuffer.array(), (byte) 0xFE); - ((Buffer) logBuffer).clear(); + logBuffer.clear(); } // Write a placeholder packet header. This will be replaced @@ -3399,13 +3393,12 @@ void writeMessageHeader() throws SQLServerException { if ((TDS.PKT_QUERY == tdsMessageType || TDS.PKT_DTC == tdsMessageType || TDS.PKT_RPC == tdsMessageType)) { boolean includeTraceHeader = false; int totalHeaderLength = TDS.MESSAGE_HEADER_LENGTH; - if (TDS.PKT_QUERY == tdsMessageType || TDS.PKT_RPC == tdsMessageType) { - if (con.isDenaliOrLater() && Util.isActivityTraceOn() - && !ActivityCorrelator.getCurrent().isSentToServer()) { - includeTraceHeader = true; - totalHeaderLength += TDS.TRACE_HEADER_LENGTH; - } + if ((TDS.PKT_QUERY == tdsMessageType || TDS.PKT_RPC == tdsMessageType) && (con.isDenaliOrLater() + && Util.isActivityTraceOn() && !ActivityCorrelator.getCurrent().isSentToServer())) { + includeTraceHeader = true; + totalHeaderLength += TDS.TRACE_HEADER_LENGTH; } + writeInt(totalHeaderLength); // allHeaders.TotalLength (DWORD) writeInt(TDS.MARS_HEADER_LENGTH); // MARS header length (DWORD) writeShort((short) 2); // allHeaders.HeaderType(MARS header) (USHORT) @@ -3459,8 +3452,8 @@ void startMessage(TDSCommand command, byte tdsMessageType) throws SQLServerExcep streamByteBuffer = new byte[4 * currentPacketSize]; } - ((Buffer) socketBuffer).position(((Buffer) socketBuffer).limit()); - ((Buffer) stagingBuffer).clear(); + socketBuffer.position(socketBuffer.limit()); + stagingBuffer.clear(); preparePacket(); writeMessageHeader(); @@ -3502,7 +3495,7 @@ void writeByte(byte value) throws SQLServerException { if (dataIsLoggable) logBuffer.put(value); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 1); + logBuffer.position(logBuffer.position() + 1); } } else { valueBytes[0] = value; @@ -3528,7 +3521,7 @@ void writeChar(char value) throws SQLServerException { if (dataIsLoggable) logBuffer.putChar(value); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 2); + logBuffer.position(logBuffer.position() + 2); } } else { Util.writeShort((short) value, valueBytes, 0); @@ -3543,7 +3536,7 @@ void writeShort(short value) throws SQLServerException { if (dataIsLoggable) logBuffer.putShort(value); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 2); + logBuffer.position(logBuffer.position() + 2); } } else { Util.writeShort(value, valueBytes, 0); @@ -3558,7 +3551,7 @@ void writeInt(int value) throws SQLServerException { if (dataIsLoggable) logBuffer.putInt(value); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 4); + logBuffer.position(logBuffer.position() + 4); } } else { Util.writeInt(value, valueBytes, 0); @@ -3589,7 +3582,7 @@ void writeDouble(double value) throws SQLServerException { if (dataIsLoggable) logBuffer.putDouble(value); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 8); + logBuffer.position(logBuffer.position() + 8); } } else { long bits = Double.doubleToLongBits(value); @@ -3638,9 +3631,9 @@ void writeBigDecimal(BigDecimal bigDecimalVal, int srcJdbcType, int precision, // Byte array to hold all the data and padding bytes. byte[] bytes = new byte[bLength]; - byte[] valueBytes = DDC.convertBigDecimalToBytes(bigDecimalVal, scale); + byte[] val = DDC.convertBigDecimalToBytes(bigDecimalVal, scale); // removing the precision and scale information from the valueBytes array - System.arraycopy(valueBytes, 2, bytes, 0, valueBytes.length - 2); + System.arraycopy(val, 2, bytes, 0, val.length - 2); writeBytes(bytes); } @@ -3662,8 +3655,8 @@ void writeMoney(BigDecimal moneyVal, int srcJdbcType) throws SQLServerException bLength = (srcJdbcType == microsoft.sql.Types.MONEY ? 8 : 4); writeByte((byte) (bLength)); - byte[] valueBytes = DDC.convertMoneyToBytes(moneyVal, bLength); - writeBytes(valueBytes); + byte[] val = DDC.convertMoneyToBytes(moneyVal, bLength); + writeBytes(val); } /** @@ -4062,7 +4055,7 @@ void writeLong(long value) throws SQLServerException { if (dataIsLoggable) logBuffer.putLong(value); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 8); + logBuffer.position(logBuffer.position() + 8); } } else { Util.writeLong(value, valueBytes, 0); @@ -4096,14 +4089,14 @@ void writeBytes(byte[] value, int offset, int length) throws SQLServerException if (dataIsLoggable) logBuffer.put(value, offset + bytesWritten, bytesToWrite); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + bytesToWrite); + logBuffer.position(logBuffer.position() + bytesToWrite); } bytesWritten += bytesToWrite; } } - void writeWrappedBytes(byte value[], int valueLength) throws SQLServerException { + void writeWrappedBytes(byte[] value, int valueLength) throws SQLServerException { // This function should only be used to write a value that is longer than // what remains in the current staging buffer. However, the value must // be short enough to fit in an empty buffer. @@ -4122,7 +4115,7 @@ void writeWrappedBytes(byte value[], int valueLength) throws SQLServerException if (dataIsLoggable) logBuffer.put(value, 0, remaining); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + remaining); + logBuffer.position(logBuffer.position() + remaining); } } @@ -4135,7 +4128,7 @@ void writeWrappedBytes(byte value[], int valueLength) throws SQLServerException if (dataIsLoggable) logBuffer.put(value, remaining, valueLength - remaining); else - ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + remaining); + logBuffer.position(logBuffer.position() + remaining); } } @@ -4170,16 +4163,14 @@ void writeStream(InputStream inputStream, long advertisedLength, assert DataTypes.UNKNOWN_STREAM_LENGTH == advertisedLength || advertisedLength >= 0; long actualLength = 0; - final byte[] streamByteBuffer = new byte[4 * currentPacketSize]; + final byte[] buff = new byte[4 * currentPacketSize]; int bytesRead = 0; int bytesToWrite; do { // Read in next chunk - for (bytesToWrite = 0; -1 != bytesRead && bytesToWrite < streamByteBuffer.length; - bytesToWrite += bytesRead) { + for (bytesToWrite = 0; -1 != bytesRead && bytesToWrite < buff.length; bytesToWrite += bytesRead) { try { - bytesRead = inputStream.read(streamByteBuffer, bytesToWrite, - streamByteBuffer.length - bytesToWrite); + bytesRead = inputStream.read(buff, bytesToWrite, buff.length - bytesToWrite); } catch (IOException e) { MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_errorReadingStream")); Object[] msgArgs = {e.toString()}; @@ -4190,7 +4181,7 @@ void writeStream(InputStream inputStream, long advertisedLength, break; // Check for invalid bytesRead returned from InputStream.read - if (bytesRead < 0 || bytesRead > streamByteBuffer.length - bytesToWrite) { + if (bytesRead < 0 || bytesRead > buff.length - bytesToWrite) { MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_errorReadingStream")); Object[] msgArgs = {SQLServerException.getErrString("R_streamReadReturnedInvalidValue")}; error(form.format(msgArgs), SQLState.DATA_EXCEPTION_NOT_SPECIFIC, DriverError.NOT_SET); @@ -4201,7 +4192,7 @@ void writeStream(InputStream inputStream, long advertisedLength, if (writeChunkSizes) writeInt(bytesToWrite); - writeBytes(streamByteBuffer, 0, bytesToWrite); + writeBytes(buff, 0, bytesToWrite); actualLength += bytesToWrite; } while (-1 != bytesRead || bytesToWrite > 0); @@ -4461,7 +4452,7 @@ private void writePacket(int tdsMessageStatus) throws SQLServerException { } private void writePacketHeader(int tdsMessageStatus) { - int tdsMessageLength = ((Buffer) stagingBuffer).position(); + int tdsMessageLength = stagingBuffer.position(); ++packetNum; // Write the TDS packet header back at the start of the staging buffer @@ -4499,13 +4490,13 @@ private void writePacketHeader(int tdsMessageStatus) { void flush(boolean atEOM) throws SQLServerException { // First, flush any data left in the socket buffer. - tdsChannel.write(socketBuffer.array(), ((Buffer) socketBuffer).position(), socketBuffer.remaining()); - ((Buffer) socketBuffer).position(((Buffer) socketBuffer).limit()); + tdsChannel.write(socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining()); + socketBuffer.position(socketBuffer.limit()); // If there is data in the staging buffer that needs to be written // to the socket, the socket buffer is now empty, so swap buffers // and start writing data from the staging buffer. - if (((Buffer) stagingBuffer).position() >= TDS_PACKET_HEADER_SIZE) { + if (stagingBuffer.position() >= TDS_PACKET_HEADER_SIZE) { // Swap the packet buffers ... ByteBuffer swapBuffer = stagingBuffer; stagingBuffer = socketBuffer; @@ -4517,14 +4508,14 @@ void flush(boolean atEOM) throws SQLServerException { // We need to use flip() rather than rewind() here so that // the socket buffer's limit is properly set for the last // packet, which may be shorter than the other packets. - ((Buffer) socketBuffer).flip(); - ((Buffer) stagingBuffer).clear(); + socketBuffer.flip(); + stagingBuffer.clear(); // If we are logging TDS packets then log the packet we're about // to send over the wire now. if (tdsChannel.isLoggingPackets()) { - tdsChannel.logPacket(logBuffer.array(), 0, ((Buffer) socketBuffer).limit(), - this.toString() + " sending packet (" + ((Buffer) socketBuffer).limit() + " bytes)"); + tdsChannel.logPacket(logBuffer.array(), 0, socketBuffer.limit(), + this.toString() + " sending packet (" + socketBuffer.limit() + " bytes)"); } // Prepare for the next packet @@ -4532,8 +4523,8 @@ void flush(boolean atEOM) throws SQLServerException { preparePacket(); // Finally, start sending data from the new socket buffer. - tdsChannel.write(socketBuffer.array(), ((Buffer) socketBuffer).position(), socketBuffer.remaining()); - ((Buffer) socketBuffer).position(((Buffer) socketBuffer).limit()); + tdsChannel.write(socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining()); + socketBuffer.position(socketBuffer.limit()); } } @@ -4756,8 +4747,8 @@ void writeRPCBigDecimal(String sName, BigDecimal bdValue, int nScale, boolean bO writeByte((byte) 0x11); // maximum length writeByte((byte) SQLServerConnection.maxDecimalPrecision); // precision - byte[] valueBytes = DDC.convertBigDecimalToBytes(bdValue, nScale); - writeBytes(valueBytes, 0, valueBytes.length); + byte[] val = DDC.convertBigDecimalToBytes(bdValue, nScale); + writeBytes(val, 0, val.length); } /** @@ -4937,27 +4928,26 @@ void writeTVPRows(TVP value) throws SQLServerException { // is used, the tdsWriter of the calling preparedStatement is overwritten by the SQLServerResultSet#next() // method when fetching new rows. // Therefore, we need to send TVP data row by row before fetching new row. - if (TVPType.ResultSet == value.tvpType) { - if ((null != value.sourceResultSet) && (value.sourceResultSet instanceof SQLServerResultSet)) { - SQLServerResultSet sourceResultSet = (SQLServerResultSet) value.sourceResultSet; - SQLServerStatement src_stmt = (SQLServerStatement) sourceResultSet.getStatement(); - int resultSetServerCursorId = sourceResultSet.getServerCursorId(); + if ((TVPType.ResultSet == value.tvpType) + && ((null != value.sourceResultSet) && (value.sourceResultSet instanceof SQLServerResultSet))) { + SQLServerResultSet sourceResultSet = (SQLServerResultSet) value.sourceResultSet; + SQLServerStatement src_stmt = (SQLServerStatement) sourceResultSet.getStatement(); + int resultSetServerCursorId = sourceResultSet.getServerCursorId(); - if (con.equals(src_stmt.getConnection()) && 0 != resultSetServerCursorId) { - cachedTVPHeaders = ByteBuffer.allocate(stagingBuffer.capacity()).order(stagingBuffer.order()); - cachedTVPHeaders.put(stagingBuffer.array(), 0, ((Buffer) stagingBuffer).position()); + if (con.equals(src_stmt.getConnection()) && 0 != resultSetServerCursorId) { + cachedTVPHeaders = ByteBuffer.allocate(stagingBuffer.capacity()).order(stagingBuffer.order()); + cachedTVPHeaders.put(stagingBuffer.array(), 0, stagingBuffer.position()); - cachedCommand = this.command; + cachedCommand = this.command; - cachedRequestComplete = command.getRequestComplete(); - cachedInterruptsEnabled = command.getInterruptsEnabled(); - cachedProcessedResponse = command.getProcessedResponse(); + cachedRequestComplete = command.getRequestComplete(); + cachedInterruptsEnabled = command.getInterruptsEnabled(); + cachedProcessedResponse = command.getProcessedResponse(); - tdsWritterCached = true; + tdsWritterCached = true; - if (sourceResultSet.isForwardOnly()) { - sourceResultSet.setFetchSize(1); - } + if (sourceResultSet.isForwardOnly()) { + sourceResultSet.setFetchSize(1); } } } @@ -4971,9 +4961,9 @@ void writeTVPRows(TVP value) throws SQLServerException { if (tdsWritterCached) { command = cachedCommand; - ((Buffer) stagingBuffer).clear(); - ((Buffer) logBuffer).clear(); - writeBytes(cachedTVPHeaders.array(), 0, ((Buffer) cachedTVPHeaders).position()); + stagingBuffer.clear(); + logBuffer.clear(); + writeBytes(cachedTVPHeaders.array(), 0, cachedTVPHeaders.position()); } Object[] rowData = value.getRowData(); @@ -4995,16 +4985,15 @@ void writeTVPRows(TVP value) throws SQLServerException { String currentColumnStringValue = null; Object currentObject = null; - if (null != rowData) { - // if rowData has value for the current column, retrieve it. If not, current column will stay - // null. - if (rowData.length > currentColumn) { - currentObject = rowData[currentColumn]; - if (null != currentObject) { - currentColumnStringValue = String.valueOf(currentObject); - } + // if rowData has value for the current column, retrieve it. If not, current column will stay + // null. + if ((null != rowData) && (rowData.length > currentColumn)) { + currentObject = rowData[currentColumn]; + if (null != currentObject) { + currentColumnStringValue = String.valueOf(currentObject); } } + writeInternalTVPRowValues(jdbcType, currentColumnStringValue, currentObject, columnPair, false); currentColumn++; } @@ -5122,13 +5111,13 @@ private void writeInternalTVPRowValues(JDBCType jdbcType, String currentColumnSt */ bdValue = bdValue.setScale(columnPair.getValue().scale, RoundingMode.HALF_UP); - byte[] valueBytes = DDC.convertBigDecimalToBytes(bdValue, bdValue.scale()); + byte[] val = DDC.convertBigDecimalToBytes(bdValue, bdValue.scale()); // 1-byte for sign and 16-byte for integer byte[] byteValue = new byte[17]; // removing the precision and scale information from the valueBytes array - System.arraycopy(valueBytes, 2, byteValue, 0, valueBytes.length - 2); + System.arraycopy(val, 2, byteValue, 0, val.length - 2); writeBytes(byteValue); } break; @@ -6303,19 +6292,18 @@ byte[] writeEncryptedScaledTemporal(GregorianCalendar cal, int subSecondNanos, i cipherText = SQLServerSecurityUtility.encryptWithKey(encodedBytes, cryptoMeta, con, statement); } else if (SSType.DATETIME2 == ssType) { // for Max value, does not round up, do casting instead. - if (3652058 == daysIntoCE) { // 9999-12-31 - if (864000000000L == scaledNanos) { // 24:00:00 in nanoseconds - // does not round up - scaledNanos = (((long) Nanos.PER_SECOND * secondsSinceMidnight - + getRoundedSubSecondNanos(subSecondNanos)) / divisor) * divisor / 100; - - int encodedLength = TDS.nanosSinceMidnightLength(TDS.MAX_FRACTIONAL_SECONDS_SCALE); - byte[] encodedNanoBytes = scaledNanosToEncodedBytes(scaledNanos, encodedLength); - - // for DATETIME2 sends both date and time part together for encryption - encodedBytesForEncryption = new byte[encodedLength + 3]; - System.arraycopy(encodedNanoBytes, 0, encodedBytesForEncryption, 0, encodedNanoBytes.length); - } + if ((3652058 == daysIntoCE) && // 9999-12-31 + (864000000000L == scaledNanos)) { // 24:00:00 in nanoseconds + // does not round up + scaledNanos = (((long) Nanos.PER_SECOND * secondsSinceMidnight + + getRoundedSubSecondNanos(subSecondNanos)) / divisor) * divisor / 100; + + int encodedLength = TDS.nanosSinceMidnightLength(TDS.MAX_FRACTIONAL_SECONDS_SCALE); + byte[] encodedNanoBytes = scaledNanosToEncodedBytes(scaledNanos, encodedLength); + + // for DATETIME2 sends both date and time part together for encryption + encodedBytesForEncryption = new byte[encodedLength + 3]; + System.arraycopy(encodedNanoBytes, 0, encodedBytesForEncryption, 0, encodedNanoBytes.length); } if (encodedBytesForEncryption == null) { @@ -6331,19 +6319,18 @@ byte[] writeEncryptedScaledTemporal(GregorianCalendar cal, int subSecondNanos, i statement); } else { // for Max value, does not round up, do casting instead. - if (3652058 == daysIntoCE) { // 9999-12-31 - if (864000000000L == scaledNanos) { // 24:00:00 in nanoseconds - // does not round up - scaledNanos = (((long) Nanos.PER_SECOND * secondsSinceMidnight - + getRoundedSubSecondNanos(subSecondNanos)) / divisor) * divisor / 100; - - int encodedLength = TDS.nanosSinceMidnightLength(TDS.MAX_FRACTIONAL_SECONDS_SCALE); - byte[] encodedNanoBytes = scaledNanosToEncodedBytes(scaledNanos, encodedLength); - - // for DATETIMEOFFSET sends date, time and offset part together for encryption - encodedBytesForEncryption = new byte[encodedLength + 5]; - System.arraycopy(encodedNanoBytes, 0, encodedBytesForEncryption, 0, encodedNanoBytes.length); - } + if ((3652058 == daysIntoCE) && // 9999-12-31 + (864000000000L == scaledNanos)) { // 24:00:00 in nanoseconds + // does not round up + scaledNanos = (((long) Nanos.PER_SECOND * secondsSinceMidnight + + getRoundedSubSecondNanos(subSecondNanos)) / divisor) * divisor / 100; + + int encodedLength = TDS.nanosSinceMidnightLength(TDS.MAX_FRACTIONAL_SECONDS_SCALE); + byte[] encodedNanoBytes = scaledNanosToEncodedBytes(scaledNanos, encodedLength); + + // for DATETIMEOFFSET sends date, time and offset part together for encryption + encodedBytesForEncryption = new byte[encodedLength + 5]; + System.arraycopy(encodedNanoBytes, 0, encodedBytesForEncryption, 0, encodedNanoBytes.length); } if (encodedBytesForEncryption == null) { @@ -6704,8 +6691,6 @@ final SQLServerConnection getConnection() { private byte serverSupportedDataClassificationVersion = TDS.DATA_CLASSIFICATION_NOT_ENABLED; private final Lock lock = new ReentrantLock(); - private ColumnEncryptionVersion columnEncryptionVersion; - private final byte valueBytes[] = new byte[256]; protected SensitivityClassification sensitivityClassification; @@ -6729,7 +6714,6 @@ private static int nextReaderID() { useColumnEncryption = true; } serverSupportsColumnEncryption = con.getServerSupportsColumnEncryption(); - columnEncryptionVersion = con.getServerColumnEncryptionVersion(); serverSupportsDataClassification = con.getServerSupportsDataClassification(); serverSupportedDataClassificationVersion = con.getServerSupportedDataClassificationVersion(); } @@ -6769,9 +6753,9 @@ final void throwInvalidTDSToken(String tokenName) throws SQLServerException { * @return true if additional data is available to be read false if no more data is available */ private boolean ensurePayload() throws SQLServerException { - if (payloadOffset == currentPacket.payloadLength) - if (!nextPacket()) - return false; + if ((payloadOffset == currentPacket.payloadLength) && (!nextPacket())) { + return false; + } assert payloadOffset < currentPacket.payloadLength; return true; } @@ -6837,16 +6821,16 @@ final boolean readPacket() throws SQLServerException { + " should be less than numMsgsSent:" + tdsChannel.numMsgsSent; TDSPacket newPacket = new TDSPacket(con.getTDSPacketSize()); - if (null != command) { - // if cancelQueryTimeout is set, we should wait for the total amount of - // queryTimeout + cancelQueryTimeout to - // terminate the connection. - if ((command.getCancelQueryTimeoutSeconds() > 0 && command.getQueryTimeoutSeconds() > 0)) { - // if a timeout is configured with this object, add it to the timeout poller - int seconds = command.getCancelQueryTimeoutSeconds() + command.getQueryTimeoutSeconds(); - this.timeout = con.getSharedTimer().schedule(new TDSTimeoutTask(command, con), seconds); - } + if ((null != command) && + // if cancelQueryTimeout is set, we should wait for the total amount of + // queryTimeout + cancelQueryTimeout to + // terminate the connection. + ((command.getCancelQueryTimeoutSeconds() > 0 && command.getQueryTimeoutSeconds() > 0))) { + // if a timeout is configured with this object, add it to the timeout poller + int seconds = command.getCancelQueryTimeoutSeconds() + command.getQueryTimeoutSeconds(); + this.timeout = con.getSharedTimer().schedule(new TDSTimeoutTask(command, con), seconds); } + // First, read the packet header. for (int headerBytesRead = 0; headerBytesRead < TDS.PACKET_HEADER_SIZE;) { int bytesRead = tdsChannel.read(newPacket.header, headerBytesRead, @@ -8148,6 +8132,7 @@ abstract class UninterruptableTDSCommand extends TDSCommand { super(logContext, 0, 0); } + @Override final void interrupt(String reason) throws SQLServerException { // Interrupting an uninterruptable command is a no-op. That is, // it can happen, but it should have no effect. diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerBulkRecord.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerBulkRecord.java index cf707146d9..6614de2331 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerBulkRecord.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerBulkRecord.java @@ -17,7 +17,7 @@ * @deprecated as of 8.1.0, because the interface contains methods which are not called as part of actual bulk copy * process. Use {@link ISQLServerBulkData}} instead. */ -@Deprecated +@Deprecated(since = "8.1.0") public interface ISQLServerBulkRecord extends ISQLServerBulkData { /** * Returns whether the column represents an identity column. diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java index 87517e6633..541d08f961 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java @@ -27,6 +27,8 @@ public interface ISQLServerCallableStatement extends java.sql.CallableStatement, * @return the column value; if the value is SQL NULL, the value returned is null * @throws SQLServerException * when an error occurs + * + * @deprecated */ @Deprecated BigDecimal getBigDecimal(String parameterName, int scale) throws SQLServerException; diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java index 743ccdc654..8a4442d56c 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java @@ -409,8 +409,8 @@ CallableStatement prepareCall(String sql, int nType, int nConcur, int nHold, String getIPAddressPreference(); /** - * Deprecated. Time-to-live is no longer supported for the cached Managed Identity tokens. - * This method will always return 0 and is for backwards compatibility only. + * @deprecated Time-to-live is no longer supported for the cached Managed Identity tokens. + * This method will always return 0 and is for backwards compatibility only. * * @return Method will always return 0. */ @@ -418,8 +418,8 @@ CallableStatement prepareCall(String sql, int nType, int nConcur, int nHold, int getMsiTokenCacheTtl(); /** - * Deprecated. Time-to-live is no longer supported for the cached Managed Identity tokens. - * This method is a no-op for backwards compatibility only. + * @deprecated Time-to-live is no longer supported for the cached Managed Identity tokens. + * This method is a no-op for backwards compatibility only. * * @param timeToLive * Time-to-live is no longer supported. diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java index a9ba172d66..33a39dcd34 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java @@ -938,6 +938,8 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * * @param managedIdentityClientId * Client ID of the user-assigned Managed Identity. + * + * @deprecated */ @Deprecated void setMSIClientId(String managedIdentityClientId); @@ -948,6 +950,8 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * Returns the value for the connection property 'msiClientId'. * * @return msiClientId property value + * + * @deprecated */ @Deprecated String getMSIClientId(); @@ -1219,6 +1223,8 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * * @param timeToLive * Time-to-live is no longer supported. + * + * @deprecated */ @Deprecated void setMsiTokenCacheTtl(int timeToLive); @@ -1228,6 +1234,8 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * This method will always return 0 and is for backwards compatibility only. * * @return Method will always return 0. + * + * @deprecated */ @Deprecated int getMsiTokenCacheTtl(); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java index bf98fd2897..87db28976a 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java @@ -1277,31 +1277,33 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, switch (bulkJdbcType) { case java.sql.Types.INTEGER: - return "int"; + return SSType.INTEGER.toString(); case java.sql.Types.SMALLINT: - return "smallint"; + return SSType.SMALLINT.toString(); case java.sql.Types.BIGINT: - return "bigint"; + return SSType.BIGINT.toString(); case java.sql.Types.BIT: - return "bit"; + return SSType.BIT.toString(); case java.sql.Types.TINYINT: - return "tinyint"; + return SSType.TINYINT.toString(); case java.sql.Types.FLOAT: case java.sql.Types.DOUBLE: - return "float"; + return SSType.FLOAT.toString(); case java.sql.Types.REAL: - return "real"; + return SSType.REAL.toString(); case microsoft.sql.Types.MONEY: - return "money"; + return SSType.MONEY.toString(); + case microsoft.sql.Types.SMALLMONEY: - return "smallmoney"; + return SSType.SMALLMONEY.toString(); + case java.sql.Types.DECIMAL: /* * SQL Server allows the insertion of decimal and numeric into a money (and smallmoney) column, but @@ -1310,31 +1312,31 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, * money/smallmoney and the source is decimal/numeric. */ if (destSSType == SSType.MONEY) { - return "money"; + return SSType.MONEY.toString(); } else if (destSSType == SSType.SMALLMONEY) { - return "smallmoney"; + return SSType.SMALLMONEY.toString(); } - return "decimal(" + bulkPrecision + ", " + bulkScale + ")"; + return SSType.DECIMAL.toString() + "(" + bulkPrecision + ", " + bulkScale + ")"; case java.sql.Types.NUMERIC: if (destSSType == SSType.MONEY) { - return "money"; + return SSType.MONEY.toString(); } else if (destSSType == SSType.SMALLMONEY) { - return "smallmoney"; + return SSType.SMALLMONEY.toString(); } - return "numeric(" + bulkPrecision + ", " + bulkScale + ")"; + return SSType.NUMERIC.toString() + "(" + bulkPrecision + ", " + bulkScale + ")"; case microsoft.sql.Types.GUID: // For char the value has to be between 0 to 8000. - return "char(" + bulkPrecision + ")"; + return SSType.CHAR.toString() + "(" + bulkPrecision + ")"; case java.sql.Types.CHAR: if (unicodeConversionRequired(bulkJdbcType, destSSType)) { - return "nchar(" + bulkPrecision + ")"; + return SSType.NCHAR.toString() + "(" + bulkPrecision + ")"; } else { - return "char(" + bulkPrecision + ")"; + return SSType.CHAR.toString() + "(" + bulkPrecision + ")"; } case java.sql.Types.NCHAR: - return "NCHAR(" + bulkPrecision + ")"; + return SSType.NCHAR.toString() + "(" + bulkPrecision + ")"; case java.sql.Types.LONGVARCHAR: case java.sql.Types.VARCHAR: @@ -1342,15 +1344,15 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, // Doesn't need to match with the exact size of data or with the destination column size. if (unicodeConversionRequired(bulkJdbcType, destSSType)) { if (isStreaming) { - return "nvarchar(max)"; + return SSType.NVARCHAR.toString() + "(max)"; } else { - return "nvarchar(" + bulkPrecision + ")"; + return SSType.NVARCHAR.toString() + "(" + bulkPrecision + ")"; } } else { if (isStreaming) { - return "varchar(max)"; + return SSType.VARCHAR.toString() + "(max)"; } else { - return "varchar(" + bulkPrecision + ")"; + return SSType.VARCHAR.toString() + "(" + bulkPrecision + ")"; } } // For INSERT BULK operations, XMLTYPE is to be sent as NVARCHAR(N) or NVARCHAR(MAX) data type. @@ -1358,21 +1360,21 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, case java.sql.Types.LONGNVARCHAR: case java.sql.Types.NVARCHAR: if (isStreaming) { - return "NVARCHAR(MAX)"; + return SSType.NVARCHAR.toString() + "(MAX)"; } else { - return "NVARCHAR(" + bulkPrecision + ")"; + return SSType.NVARCHAR.toString() + "(" + bulkPrecision + ")"; } case java.sql.Types.BINARY: // For binary the value has to be between 0 to 8000. - return "binary(" + bulkPrecision + ")"; + return SSType.BINARY.toString() + "(" + bulkPrecision + ")"; case java.sql.Types.LONGVARBINARY: case java.sql.Types.VARBINARY: if (isStreaming) - return "varbinary(max)"; + return SSType.VARBINARY.toString() + "(max)"; else - return "varbinary(" + bulkPrecision + ")"; + return SSType.VARBINARY.toString() + "(" + bulkPrecision + ")"; case microsoft.sql.Types.DATETIME: case microsoft.sql.Types.SMALLDATETIME: @@ -1380,19 +1382,19 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, switch (destSSType) { case SMALLDATETIME: if (null != serverBulkData && connection.getSendTemporalDataTypesAsStringForBulkCopy()) { - return "varchar(" + return SSType.VARCHAR.toString() + "(" + ((0 == bulkPrecision) ? sourceBulkRecordTemporalMaxPrecision : bulkPrecision) + ")"; } else { - return "smalldatetime"; + return SSType.SMALLDATETIME.toString(); } case DATETIME: if (null != serverBulkData && connection.getSendTemporalDataTypesAsStringForBulkCopy()) { - return "varchar(" + return SSType.VARCHAR.toString() + "(" + ((0 == bulkPrecision) ? sourceBulkRecordTemporalMaxPrecision : bulkPrecision) + ")"; } else { - return "datetime"; + return SSType.DATETIME.toString(); } default: // datetime2 @@ -1403,9 +1405,10 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, * temporal type. */ if (null != serverBulkData && connection.getSendTemporalDataTypesAsStringForBulkCopy()) { - return "varchar(" + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + ")"; + return SSType.VARCHAR.toString() + "(" + + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + ")"; } else { - return "datetime2(" + bulkScale + ")"; + return SSType.DATETIME2.toString() + "(" + bulkScale + ")"; } } @@ -1416,9 +1419,10 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, * conversion. if the source is ResultSet, we send the data as the corresponding temporal type. */ if (null != serverBulkData && connection.getSendTemporalDataTypesAsStringForBulkCopy()) { - return "varchar(" + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + ")"; + return SSType.VARCHAR.toString() + "(" + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + + ")"; } else { - return "date"; + return SSType.DATE.toString(); } case java.sql.Types.TIME: @@ -1428,15 +1432,16 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, * conversion. if the source is ResultSet, we send the data as the corresponding temporal type. */ if (null != serverBulkData && connection.getSendTemporalDataTypesAsStringForBulkCopy()) { - return "varchar(" + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + ")"; + return SSType.VARCHAR.toString() + "(" + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + + ")"; } else { - return "time(" + bulkScale + ")"; + return SSType.TIME.toString() + "(" + bulkScale + ")"; } // Return DATETIMEOFFSET for TIME_WITH_TIMEZONE and TIMESTAMP_WITH_TIMEZONE case 2013: // java.sql.Types.TIME_WITH_TIMEZONE case 2014: // java.sql.Types.TIMESTAMP_WITH_TIMEZONE - return "datetimeoffset(" + bulkScale + ")"; + return SSType.DATETIMEOFFSET.toString() + "(" + bulkScale + ")"; case microsoft.sql.Types.DATETIMEOFFSET: /* @@ -1445,12 +1450,13 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, * conversion. if the source is ResultSet, we send the data as the corresponding temporal type. */ if (null != serverBulkData && connection.getSendTemporalDataTypesAsStringForBulkCopy()) { - return "varchar(" + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + ")"; + return SSType.VARCHAR.toString() + "(" + ((0 == bulkPrecision) ? destPrecision : bulkPrecision) + + ")"; } else { - return "datetimeoffset(" + bulkScale + ")"; + return SSType.DATETIMEOFFSET.toString() + "(" + bulkScale + ")"; } case microsoft.sql.Types.SQL_VARIANT: - return "sql_variant"; + return SSType.SQL_VARIANT.toString(); default: { MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_BulkTypeNotSupported")); Object[] msgArgs = {JDBCType.of(bulkJdbcType).toString().toLowerCase(Locale.ENGLISH)}; diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionCertificateStoreProvider.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionCertificateStoreProvider.java index 24bc18ddb0..1e8d0d0407 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionCertificateStoreProvider.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionCertificateStoreProvider.java @@ -61,7 +61,7 @@ private byte[] decryptColumnEncryptionKeyWindows(String masterKeyPath, String en return AuthenticationJNI.DecryptColumnEncryptionKey(masterKeyPath, encryptionAlgorithm, encryptedColumnEncryptionKey); } catch (DLLException e) { - DLLException.buildException(e.getErrCode(), e.GetParam1(), e.GetParam2(), e.GetParam3()); + DLLException.buildException(e.getErrCode(), e.getParam1(), e.getParam2(), e.getParam3()); return null; } } @@ -88,7 +88,7 @@ public boolean verifyColumnMasterKeyMetadata(String masterKeyPath, boolean allow try { return AuthenticationJNI.VerifyColumnMasterKeyMetadata(masterKeyPath, allowEnclaveComputations, signature); } catch (DLLException e) { - DLLException.buildException(e.getErrCode(), e.GetParam1(), e.GetParam2(), e.GetParam3()); + DLLException.buildException(e.getErrCode(), e.getParam1(), e.getParam2(), e.getParam3()); return false; } } diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java index 039625f05a..ff4d2ef7c8 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java @@ -2971,7 +2971,7 @@ private void login(String primary, String primaryInstanceName, int primaryPortNu } else { if (isDBMirroring) { // Create a temporary class with the mirror info from the user - tempFailover = new FailoverInfo(mirror, this, false); + tempFailover = new FailoverInfo(mirror, false); } } @@ -3236,7 +3236,7 @@ private void login(String primary, String primaryInstanceName, int primaryPortNu } if (null == tempFailover) - tempFailover = new FailoverInfo(failoverPartnerServerProvided, this, false); + tempFailover = new FailoverInfo(failoverPartnerServerProvided, false); // if the failover is not from the map already out this in the map, if it is from the map just make sure // that we change the if (null != foActual) { diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/fedauth/FedauthTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/fedauth/FedauthTest.java index 1324ff8a5a..8ea0a86a1e 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/fedauth/FedauthTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/fedauth/FedauthTest.java @@ -251,7 +251,7 @@ public void testCorrectAccessTokenDS() throws SQLException { * encryption, in addition to application name in order to use different authorities. * * @throws Exception - * if an exception occurs + * if an exception occurs */ @Test public void testAADPasswordApplicationName() throws Exception { @@ -263,8 +263,7 @@ public void testAADPasswordApplicationName() throws Exception { SQLServerDataSource ds = new SQLServerDataSource(); ds.setURL(url); - try (Connection con = ds.getConnection()) { - } catch (Exception e) { + try (Connection con = ds.getConnection()) {} catch (Exception e) { fail(e.getMessage()); } } @@ -275,6 +274,7 @@ public void testAADPasswordApplicationName() throws Exception { * * @deprecated */ + @Deprecated @Test public void testAADServicePrincipalAuthDeprecated() { String url = "jdbc:sqlserver://" + azureServer + ";database=" + azureDatabase + ";authentication=" From 2520ce93eace9d9084c22eb6ac40e14dc9729bc6 Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 12:25:55 -0800 Subject: [PATCH 02/13] more --- .../sqlserver/jdbc/ISQLServerDataSource.java | 51 +++++++++---------- .../jdbc/ISQLServerEnclaveProvider.java | 6 +-- .../jdbc/IdleConnectionResiliency.java | 43 ++++++++-------- .../jdbc/KeyVaultHttpPipelineBuilder.java | 20 ++++---- .../sqlserver/jdbc/PLPInputStream.java | 1 + .../microsoft/sqlserver/jdbc/Parameter.java | 41 +++++++-------- .../sqlserver/jdbc/ReaderInputStream.java | 3 ++ .../sqlserver/jdbc/SQLCollation.java | 1 + 8 files changed, 83 insertions(+), 83 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java index 33a39dcd34..78bdaa601c 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java @@ -111,11 +111,11 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { /** * Sets the option whether TLS encryption is used. * - * @deprecated Use {@link ISQLServerDataSource#setEncrypt(String encryptOption)} instead * @param encryptOption * TLS encrypt option. Default is true + * @deprecated Use {@link ISQLServerDataSource#setEncrypt(String encryptOption)} instead */ - @Deprecated + @Deprecated(since = "10.1.0", forRemoval = true) void setEncrypt(boolean encryptOption); /** @@ -788,22 +788,23 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * Sets the login configuration file for Kerberos authentication. This overrides the default configuration * SQLJDBCDriver * - * @deprecated Use {@link ISQLServerDataSource#setJAASConfigurationName(String configurationName)} instead - * * @param configurationName * the configuration name + * @deprecated Use {@link ISQLServerDataSource#setJAASConfigurationName(String configurationName)} instead + * */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) void setJASSConfigurationName(String configurationName); /** * Returns the login configuration file for Kerberos authentication. + * * * + * @return login configuration file name * @deprecated Use {@link ISQLServerDataSource#getJAASConfigurationName()} instead * - * @return login configuration file name */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) String getJASSConfigurationName(); /** @@ -932,28 +933,23 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { void setUseBulkCopyForBatchInsert(boolean useBulkCopyForBatchInsert); /** - * This method is deprecated. Use {@link ISQLServerDataSource#setUser(String user)} instead. - * * Sets the client id to be used to retrieve the access token for a user-assigned Managed Identity. * * @param managedIdentityClientId * Client ID of the user-assigned Managed Identity. - * - * @deprecated + * @deprecated Use {@link ISQLServerDataSource#setUser(String user)} instead. */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) void setMSIClientId(String managedIdentityClientId); /** - * This method is deprecated. Use {@link ISQLServerDataSource#getUser()} instead. - * * Returns the value for the connection property 'msiClientId'. * * @return msiClientId property value * - * @deprecated + * @deprecated Use {@link ISQLServerDataSource#getUser()} instead. */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) String getMSIClientId(); /** @@ -1127,34 +1123,35 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { void setSendTemporalDataTypesAsStringForBulkCopy(boolean sendTemporalDataTypesAsStringForBulkCopy); /** + * * Returns the value for the connection property 'AADSecurePrincipalId'. * - * @deprecated Use {@link ISQLServerDataSource#getUser()} instead - * * @return 'AADSecurePrincipalId' property value. + * @deprecated Use {@link ISQLServerDataSource#getUser()} instead */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) String getAADSecurePrincipalId(); /** + * * Sets the 'AADSecurePrincipalId' connection property used for Active Directory Service Principal authentication. * - * @deprecated Use {@link ISQLServerDataSource#setUser(String user)} instead * @param AADSecurePrincipalId * Active Directory Service Principal Id. + * @deprecated Use {@link ISQLServerDataSource#setUser(String user)} instead */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) void setAADSecurePrincipalId(String AADSecurePrincipalId); /** * Sets the 'AADSecurePrincipalSecret' connection property used for Active Directory Service Principal * authentication. * - * @deprecated Use {@link ISQLServerDataSource#setPassword(String password)} instead * @param AADSecurePrincipalSecret * Active Directory Service Principal secret. + * @deprecated Use {@link ISQLServerDataSource#setPassword(String password)} instead */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) void setAADSecurePrincipalSecret(String AADSecurePrincipalSecret); /** @@ -1218,7 +1215,7 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { String getPrepareMethod(); /** - * Deprecated. Time-to-live is no longer supported for the cached Managed Identity tokens. + * Time-to-live is no longer supported for the cached Managed Identity tokens. * This method is a no-op for backwards compatibility only. * * @param timeToLive @@ -1226,18 +1223,18 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * * @deprecated */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) void setMsiTokenCacheTtl(int timeToLive); /** - * Deprecated. Time-to-live is no longer supported for the cached Managed Identity tokens. + * Time-to-live is no longer supported for the cached Managed Identity tokens. * This method will always return 0 and is for backwards compatibility only. * * @return Method will always return 0. * * @deprecated */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) int getMsiTokenCacheTtl(); /** diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java index 6d57abb1ce..d0a6245fd8 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java @@ -439,11 +439,11 @@ void validateDHPublicKey() throws SQLServerException, GeneralSecurityException { ByteBuffer enclavePKBuffer = ByteBuffer.wrap(enclavePK).order(ByteOrder.LITTLE_ENDIAN); byte[] rsa1 = new byte[4]; enclavePKBuffer.get(rsa1); - int bitCount = enclavePKBuffer.getInt(); + // bit count unused int publicExponentLength = enclavePKBuffer.getInt(); int publicModulusLength = enclavePKBuffer.getInt(); - int prime1 = enclavePKBuffer.getInt(); - int prime2 = enclavePKBuffer.getInt(); + // prime 1 unused + // prime 2 unused byte[] exponent = new byte[publicExponentLength]; enclavePKBuffer.get(exponent); byte[] modulus = new byte[publicModulusLength]; diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IdleConnectionResiliency.java b/src/main/java/com/microsoft/sqlserver/jdbc/IdleConnectionResiliency.java index 68a16e2de7..35bd85a1ed 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IdleConnectionResiliency.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IdleConnectionResiliency.java @@ -110,34 +110,32 @@ void parseInitialSessionStateData(byte[] data, byte[][] sessionStateInitial) thr } void incrementUnprocessedResponseCount() { - if (connection.getRetryCount() > 0 && !isReconnectRunning()) { - if (unprocessedResponseCount.incrementAndGet() < 0) { - /* - * When this number rolls over, connection recovery is disabled for the rest of the life of the - * connection. - */ - if (loggerExternal.isLoggable(Level.FINER)) { - loggerExternal.finer("unprocessedResponseCount < 0 on increment. Disabling connection resiliency."); - } - - setConnectionRecoveryPossible(false); + if ((connection.getRetryCount() > 0 && !isReconnectRunning()) + && (unprocessedResponseCount.incrementAndGet() < 0)) { + /* + * When this number rolls over, connection recovery is disabled for the rest of the life of the + * connection. + */ + if (loggerExternal.isLoggable(Level.FINER)) { + loggerExternal.finer("unprocessedResponseCount < 0 on increment. Disabling connection resiliency."); } + + setConnectionRecoveryPossible(false); } } void decrementUnprocessedResponseCount() { - if (connection.getRetryCount() > 0 && !isReconnectRunning()) { - if (unprocessedResponseCount.decrementAndGet() < 0) { - /* - * When this number rolls over, connection recovery is disabled for the rest of the life of the - * connection. - */ - if (loggerExternal.isLoggable(Level.FINER)) { - loggerExternal.finer("unprocessedResponseCount < 0 on decrement. Disabling connection resiliency."); - } - - setConnectionRecoveryPossible(false); + if ((connection.getRetryCount() > 0 && !isReconnectRunning()) + && (unprocessedResponseCount.decrementAndGet() < 0)) { + /* + * When this number rolls over, connection recovery is disabled for the rest of the life of the + * connection. + */ + if (loggerExternal.isLoggable(Level.FINER)) { + loggerExternal.finer("unprocessedResponseCount < 0 on decrement. Disabling connection resiliency."); } + + setConnectionRecoveryPossible(false); } } @@ -428,6 +426,7 @@ private ReconnectThread() {} } + @Override public void run() { if (loggerExternal.isLoggable(Level.FINER)) { loggerExternal.finer("Starting ReconnectThread for command: " + command.toString()); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/KeyVaultHttpPipelineBuilder.java b/src/main/java/com/microsoft/sqlserver/jdbc/KeyVaultHttpPipelineBuilder.java index 51ff4eeb3c..b635d846cc 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/KeyVaultHttpPipelineBuilder.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/KeyVaultHttpPipelineBuilder.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; + /** * The HTTP pipeline builder which includes all the necessary HTTP pipeline policies that will be applied for * sending and receiving HTTP requests to the Key Vault service. @@ -41,20 +42,21 @@ final class KeyVaultHttpPipelineBuilder { * Builds the HTTP pipeline with all the necessary HTTP policies included in the pipeline. * * @return A fully built HTTP pipeline including the default HTTP client. - * @throws SQLServerException If the {@link KeyVaultCustomCredentialPolicy} policy cannot be added to the pipeline. + * @throws SQLServerException + * If the {@link KeyVaultCustomCredentialPolicy} policy cannot be added to the pipeline. */ HttpPipeline buildPipeline() throws SQLServerException { // Closest to API goes first, closest to wire goes last. - final List policies = new ArrayList<>(); + final List pol = new ArrayList<>(); - HttpPolicyProviders.addBeforeRetryPolicies(policies); - policies.add(retryPolicy); - policies.add(new KeyVaultCustomCredentialPolicy(credential)); - policies.addAll(this.policies); - HttpPolicyProviders.addAfterRetryPolicies(policies); - policies.add(new HttpLoggingPolicy(httpLogOptions)); + HttpPolicyProviders.addBeforeRetryPolicies(pol); + pol.add(retryPolicy); + pol.add(new KeyVaultCustomCredentialPolicy(credential)); + pol.addAll(this.policies); + HttpPolicyProviders.addAfterRetryPolicies(pol); + pol.add(new HttpLoggingPolicy(httpLogOptions)); - return new HttpPipelineBuilder().policies(policies.toArray(new HttpPipelinePolicy[0])).build(); + return new HttpPipelineBuilder().policies(pol.toArray(new HttpPipelinePolicy[0])).build(); } /** diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/PLPInputStream.java b/src/main/java/com/microsoft/sqlserver/jdbc/PLPInputStream.java index 08746fe608..b0b81ab6c4 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/PLPInputStream.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/PLPInputStream.java @@ -245,6 +245,7 @@ public int read(byte[] b) throws IOException { * @exception IOException * if an I/O error occurs. */ + @Override public int read(byte[] b, int offset, int maxBytes) throws IOException { // If b is null, a NullPointerException is thrown. if (null == b) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java index 0c7a581501..3ba4a62c2f 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java @@ -271,25 +271,22 @@ void setValue(JDBCType jdbcType, Object value, JavaType javaType, StreamSetterAr // otherwise it would be sent as smallint // Also, for setters, we are able to send tinyint to smallint // However, for output parameter, it might cause error. - if (!isOutput()) { - if ((JavaType.SHORT == javaType) - && ((JDBCType.TINYINT == jdbcType) || (JDBCType.SMALLINT == jdbcType))) { - // value falls in the TINYINT range - if (((Short) value) >= 0 && ((Short) value) <= 255) { - value = ((Short) value).byteValue(); - javaType = JavaType.of(value); - jdbcType = javaType.getJDBCType(SSType.UNKNOWN, jdbcType); - } - // value falls outside tinyint range. Throw an error if the user intends to send as tinyint. - else { - // This is for cases like setObject(1, Short.valueOf("-1"), java.sql.Types.TINYINT); - if (JDBCType.TINYINT == jdbcType) { - MessageFormat form = new MessageFormat( - SQLServerException.getErrString("R_InvalidDataForAE")); - Object[] msgArgs = {javaType.toString().toLowerCase(Locale.ENGLISH), - jdbcType.toString().toLowerCase(Locale.ENGLISH)}; - throw new SQLServerException(form.format(msgArgs), null); - } + if (!isOutput() && ((JavaType.SHORT == javaType)) + && ((JDBCType.TINYINT == jdbcType) || (JDBCType.SMALLINT == jdbcType))) { + // value falls in the TINYINT range + if (((Short) value) >= 0 && ((Short) value) <= 255) { + value = ((Short) value).byteValue(); + javaType = JavaType.of(value); + jdbcType = javaType.getJDBCType(SSType.UNKNOWN, jdbcType); + } + // value falls outside tinyint range. Throw an error if the user intends to send as tinyint. + else { + // This is for cases like setObject(1, Short.valueOf("-1"), java.sql.Types.TINYINT); + if (JDBCType.TINYINT == jdbcType) { + MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_InvalidDataForAE")); + Object[] msgArgs = {javaType.toString().toLowerCase(Locale.ENGLISH), + jdbcType.toString().toLowerCase(Locale.ENGLISH)}; + throw new SQLServerException(form.format(msgArgs), null); } } } @@ -388,8 +385,8 @@ boolean isValueGotten() { } - Object getValue(JDBCType jdbcType, InputStreamGetterArgs getterArgs, Calendar cal, - TDSReader tdsReader, SQLServerStatement statement) throws SQLServerException { + Object getValue(JDBCType jdbcType, InputStreamGetterArgs getterArgs, Calendar cal, TDSReader tdsReader, + SQLServerStatement statement) throws SQLServerException { if (null == getterDTV) getterDTV = new DTV(); @@ -1152,7 +1149,7 @@ String getTypeDefinition(SQLServerConnection con, TDSReader tdsReader) throws SQ void sendByRPC(TDSWriter tdsWriter, SQLServerStatement statement) throws SQLServerException { assert null != inputDTV : "Parameter was neither set nor registered"; SQLServerConnection conn = statement.connection; - + try { inputDTV.sendCryptoMetaData(this.cryptoMeta, tdsWriter); inputDTV.setJdbcTypeSetByUser(getJdbcTypeSetByUser(), getValueLength()); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ReaderInputStream.java b/src/main/java/com/microsoft/sqlserver/jdbc/ReaderInputStream.java index 54df7d76b8..70ed6a5f69 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ReaderInputStream.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ReaderInputStream.java @@ -72,6 +72,7 @@ class ReaderInputStream extends InputStream { * @throws IOException * - if an I/O error occurs */ + @Override public int available() throws IOException { assert null != reader; assert null != encodedChars; @@ -97,10 +98,12 @@ public int available() throws IOException { private final byte[] oneByte = new byte[1]; + @Override public int read() throws IOException { return (-1 == readInternal(oneByte, 0, oneByte.length)) ? -1 : oneByte[0]; } + @Override public int read(byte[] b) throws IOException { return readInternal(b, 0, b.length); } diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLCollation.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLCollation.java index 59ace92529..b41531db9e 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLCollation.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLCollation.java @@ -511,6 +511,7 @@ final Encoding getEncoding() throws UnsupportedEncodingException { this.encoding = encoding; } + @Override public final String toString() { return name; } From 6dbdb2d5f4290935c992c6dea1328c2737bde8bb Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 13:21:29 -0800 Subject: [PATCH 03/13] more --- .../java/com/microsoft/sqlserver/jdbc/IOBuffer.java | 2 +- .../sqlserver/jdbc/ISQLServerCallableStatement.java | 2 +- .../microsoft/sqlserver/jdbc/ISQLServerConnection.java | 9 +++++---- .../microsoft/sqlserver/jdbc/ISQLServerDataSource.java | 10 +++++----- .../java/com/microsoft/sqlserver/jdbc/Parameter.java | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index 3e3f3df278..cf74d389d7 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -6825,7 +6825,7 @@ final boolean readPacket() throws SQLServerException { // if cancelQueryTimeout is set, we should wait for the total amount of // queryTimeout + cancelQueryTimeout to // terminate the connection. - ((command.getCancelQueryTimeoutSeconds() > 0 && command.getQueryTimeoutSeconds() > 0))) { + (command.getCancelQueryTimeoutSeconds() > 0 && command.getQueryTimeoutSeconds() > 0)) { // if a timeout is configured with this object, add it to the timeout poller int seconds = command.getCancelQueryTimeoutSeconds() + command.getQueryTimeoutSeconds(); this.timeout = con.getSharedTimer().schedule(new TDSTimeoutTask(command, con), seconds); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java index 541d08f961..1688fbd1f8 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java @@ -30,7 +30,7 @@ public interface ISQLServerCallableStatement extends java.sql.CallableStatement, * * @deprecated */ - @Deprecated + @Deprecated(since = "6.5.4", forRemoval = true) BigDecimal getBigDecimal(String parameterName, int scale) throws SQLServerException; /** diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java index 8a4442d56c..57240fd78d 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java @@ -409,12 +409,12 @@ CallableStatement prepareCall(String sql, int nType, int nConcur, int nHold, String getIPAddressPreference(); /** - * @deprecated Time-to-live is no longer supported for the cached Managed Identity tokens. - * This method will always return 0 and is for backwards compatibility only. + * This method will always return 0 and is for backwards compatibility only. * * @return Method will always return 0. + * @deprecated Time-to-live is no longer supported for the cached Managed Identity tokens. */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) int getMsiTokenCacheTtl(); /** @@ -423,7 +423,8 @@ CallableStatement prepareCall(String sql, int nType, int nConcur, int nHold, * * @param timeToLive * Time-to-live is no longer supported. + * @deprecated Time-to-live is no longer supported for the cached Managed Identity tokens. */ - @Deprecated + @Deprecated(since = "12.1.0", forRemoval = true) void setMsiTokenCacheTtl(int timeToLive); } diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java index 78bdaa601c..f03e0888dc 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java @@ -793,7 +793,7 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * @deprecated Use {@link ISQLServerDataSource#setJAASConfigurationName(String configurationName)} instead * */ - @Deprecated(since = "12.1.0", forRemoval = true) + @Deprecated(since = "9.3.0", forRemoval = true) void setJASSConfigurationName(String configurationName); /** @@ -804,7 +804,7 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * @deprecated Use {@link ISQLServerDataSource#getJAASConfigurationName()} instead * */ - @Deprecated(since = "12.1.0", forRemoval = true) + @Deprecated(since = "9.3.0", forRemoval = true) String getJASSConfigurationName(); /** @@ -1129,7 +1129,7 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * @return 'AADSecurePrincipalId' property value. * @deprecated Use {@link ISQLServerDataSource#getUser()} instead */ - @Deprecated(since = "12.1.0", forRemoval = true) + @Deprecated(since = "9.4.1", forRemoval = true) String getAADSecurePrincipalId(); /** @@ -1140,7 +1140,7 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * Active Directory Service Principal Id. * @deprecated Use {@link ISQLServerDataSource#setUser(String user)} instead */ - @Deprecated(since = "12.1.0", forRemoval = true) + @Deprecated(since = "9.4.1", forRemoval = true) void setAADSecurePrincipalId(String AADSecurePrincipalId); /** @@ -1151,7 +1151,7 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { * Active Directory Service Principal secret. * @deprecated Use {@link ISQLServerDataSource#setPassword(String password)} instead */ - @Deprecated(since = "12.1.0", forRemoval = true) + @Deprecated(since = "9.4.1", forRemoval = true) void setAADSecurePrincipalSecret(String AADSecurePrincipalSecret); /** diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java index 3ba4a62c2f..31a920fc84 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java @@ -271,7 +271,7 @@ void setValue(JDBCType jdbcType, Object value, JavaType javaType, StreamSetterAr // otherwise it would be sent as smallint // Also, for setters, we are able to send tinyint to smallint // However, for output parameter, it might cause error. - if (!isOutput() && ((JavaType.SHORT == javaType)) + if (!isOutput() && (JavaType.SHORT == javaType) && ((JDBCType.TINYINT == jdbcType) || (JDBCType.SMALLINT == jdbcType))) { // value falls in the TINYINT range if (((Short) value) >= 0 && ((Short) value) <= 255) { From b5c6ca5069c27f3aca2d53bc07b84efc739418d6 Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 15:58:14 -0800 Subject: [PATCH 04/13] mmmore --- .../microsoft/sqlserver/jdbc/IOBuffer.java | 13 ++-- .../jdbc/ISQLServerEnclaveProvider.java | 7 +- .../microsoft/sqlserver/jdbc/Parameter.java | 52 +++++++------- .../jdbc/SQLServerAASEnclaveProvider.java | 4 +- ...QLServerAeadAes256CbcHmac256Algorithm.java | 14 ++-- .../SQLServerAeadAes256CbcHmac256Factory.java | 9 +-- .../sqlserver/jdbc/SQLServerBulkCopy.java | 6 +- .../jdbc/SQLServerCallableStatement.java | 30 ++++---- ...ColumnEncryptionAzureKeyVaultProvider.java | 7 +- .../sqlserver/jdbc/SQLServerConnection.java | 70 ++++++++++--------- .../SQLServerConnectionPoolDataSource.java | 4 +- .../sqlserver/jdbc/SQLServerDataSource.java | 8 ++- .../SQLServerDataSourceObjectFactory.java | 4 +- .../jdbc/SQLServerDatabaseMetaData.java | 38 +++++----- ...LServerEncryptionAlgorithmFactoryList.java | 2 +- .../jdbc/SQLServerEncryptionType.java | 6 +- .../sqlserver/jdbc/SQLServerException.java | 11 ++- .../sqlserver/jdbc/SQLServerMSAL4JUtils.java | 13 ++-- .../jdbc/SQLServerNoneEnclaveProvider.java | 4 +- .../jdbc/SQLServerPreparedStatement.java | 56 +++++++++------ .../sqlserver/jdbc/SQLServerResource.java | 3 +- .../jdbc/SQLServerSecurityUtility.java | 2 +- 22 files changed, 203 insertions(+), 160 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index cf74d389d7..f760f73d96 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -3274,6 +3274,9 @@ private static long nextThreadID() { */ final class TDSWriter { private static Logger logger = Logger.getLogger("com.microsoft.sqlserver.jdbc.internals.TDS.Writer"); + + private static final String UNEXPECTED_SSTYPE = "Unexpected SSType: "; + private final String traceID; final public String toString() { @@ -6017,7 +6020,7 @@ private void writeScaledTemporal(GregorianCalendar cal, int subSecondNanos, int assert con.isKatmaiOrLater(); assert SSType.DATE == ssType || SSType.TIME == ssType || SSType.DATETIME2 == ssType - || SSType.DATETIMEOFFSET == ssType : "Unexpected SSType: " + ssType; + || SSType.DATETIMEOFFSET == ssType : UNEXPECTED_SSTYPE + ssType; // First, for types with a time component, write the scaled nanos since midnight if (SSType.TIME == ssType || SSType.DATETIME2 == ssType || SSType.DATETIMEOFFSET == ssType) { @@ -6052,8 +6055,7 @@ private void writeScaledTemporal(GregorianCalendar cal, int subSecondNanos, int } // If the type is datetime2 or datetimeoffset, truncate only if its the max value supported else { - assert SSType.DATETIME2 == ssType || SSType.DATETIMEOFFSET == ssType : "Unexpected SSType: " - + ssType; + assert SSType.DATETIME2 == ssType || SSType.DATETIMEOFFSET == ssType : UNEXPECTED_SSTYPE + ssType; // ... then bump the date, provided that the resulting date is still within // the valid date range. @@ -6153,7 +6155,7 @@ byte[] writeEncryptedScaledTemporal(GregorianCalendar cal, int subSecondNanos, i assert con.isKatmaiOrLater(); assert SSType.DATE == ssType || SSType.TIME == ssType || SSType.DATETIME2 == ssType - || SSType.DATETIMEOFFSET == ssType : "Unexpected SSType: " + ssType; + || SSType.DATETIMEOFFSET == ssType : UNEXPECTED_SSTYPE + ssType; // store the time and minutesOffset portion of DATETIME2 and DATETIMEOFFSET to be used with date portion byte encodedBytesForEncryption[] = null; @@ -6202,8 +6204,7 @@ byte[] writeEncryptedScaledTemporal(GregorianCalendar cal, int subSecondNanos, i } // If the type is datetime2 or datetimeoffset, truncate only if its the max value supported else { - assert SSType.DATETIME2 == ssType || SSType.DATETIMEOFFSET == ssType : "Unexpected SSType: " - + ssType; + assert SSType.DATETIME2 == ssType || SSType.DATETIMEOFFSET == ssType : UNEXPECTED_SSTYPE + ssType; // ... then bump the date, provided that the resulting date is still within // the valid date range. diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java index d0a6245fd8..e5d707a7fe 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerEnclaveProvider.java @@ -78,9 +78,10 @@ default byte[] getEnclavePackage(String userSQL, ArrayList enclaveCEKs) } enclaveCEKs.clear(); SQLServerAeadAes256CbcHmac256EncryptionKey encryptedKey = new SQLServerAeadAes256CbcHmac256EncryptionKey( - enclaveSession.getSessionSecret(), SQLServerAeadAes256CbcHmac256Algorithm.algorithmName); + enclaveSession.getSessionSecret(), + SQLServerAeadAes256CbcHmac256Algorithm.AEAD_AES_256_CBC_HMAC_SHA256); SQLServerAeadAes256CbcHmac256Algorithm algo = new SQLServerAeadAes256CbcHmac256Algorithm(encryptedKey, - SQLServerEncryptionType.Randomized, (byte) 0x1); + SQLServerEncryptionType.RANDOMIZED, (byte) 0x1); enclavePackage.write(algo.encryptData(keys.toByteArray())); return enclavePackage.toByteArray(); } catch (GeneralSecurityException | SQLServerException | IOException e) { @@ -252,7 +253,7 @@ default void processSDPEv1(String userSql, String preparedTypeDefinitions, Param } SQLServerEncryptionType encType = SQLServerEncryptionType .of((byte) rs2.getInt(DescribeParameterEncryptionResultSet2.COLUMNENCRYPTIONTYPE.value())); - if (SQLServerEncryptionType.PlainText != encType) { + if (SQLServerEncryptionType.PLAINTEXT != encType) { params[paramIndex].cryptoMeta = new CryptoMetadata(cekEntry, (short) cekOrdinal, (byte) rs2.getInt(DescribeParameterEncryptionResultSet2.COLUMNENCRYPTIONALGORITHM.value()), null, encType.value, diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java index 31a920fc84..6bcbc0f5b0 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java @@ -502,34 +502,36 @@ private void setTypeDefinition(DTV dtv) { // so, here, if the decimal parameter is encrypted and it is null and it is not outparameter // then we set precision as the default precision instead of max precision if (!isOutput()) { - param.typeDefinition = "decimal(" + SQLServerConnection.defaultDecimalPrecision + ", " - + scale + ")"; + param.typeDefinition = SSType.DECIMAL.toString() + "(" + + SQLServerConnection.defaultDecimalPrecision + ", " + scale + ")"; } } else { if (SQLServerConnection.defaultDecimalPrecision >= valueLength) { - param.typeDefinition = "decimal(" + SQLServerConnection.defaultDecimalPrecision + "," - + scale + ")"; + param.typeDefinition = SSType.DECIMAL.toString() + "(" + + SQLServerConnection.defaultDecimalPrecision + "," + scale + ")"; if (SQLServerConnection.defaultDecimalPrecision < (valueLength + scale)) { - param.typeDefinition = "decimal(" + param.typeDefinition = SSType.DECIMAL.toString() + "(" + (SQLServerConnection.defaultDecimalPrecision + scale) + "," + scale + ")"; } } else { - param.typeDefinition = "decimal(" + SQLServerConnection.maxDecimalPrecision + "," - + scale + ")"; + param.typeDefinition = SSType.DECIMAL.toString() + "(" + + SQLServerConnection.maxDecimalPrecision + "," + scale + ")"; } } if (isOutput()) { - param.typeDefinition = "decimal(" + SQLServerConnection.maxDecimalPrecision + ", " + scale - + ")"; + param.typeDefinition = SSType.DECIMAL.toString() + "SSType.DECIMAL.toString()(" + + SQLServerConnection.maxDecimalPrecision + ", " + scale + ")"; } if (userProvidesPrecision) { - param.typeDefinition = "decimal(" + valueLength + "," + scale + ")"; + param.typeDefinition = SSType.DECIMAL.toString() + "SSType.DECIMAL.toString()(" + + valueLength + "," + scale + ")"; } } else - param.typeDefinition = "decimal(" + SQLServerConnection.maxDecimalPrecision + "," + scale + ")"; + param.typeDefinition = SSType.DECIMAL.toString() + "(" + SQLServerConnection.maxDecimalPrecision + + "," + scale + ")"; break; @@ -718,10 +720,10 @@ private void setTypeDefinition(DTV dtv) { */ if (0 == valueLength) { // Workaround for the issue when inserting empty string and null into encrypted columns - param.typeDefinition = "varchar(1)"; + param.typeDefinition = SSType.VARCHAR.toString() + "(1)"; valueLength++; } else { - param.typeDefinition = "varchar(" + valueLength + ")"; + param.typeDefinition = SSType.VARCHAR.toString() + "(" + valueLength + ")"; if (DataTypes.SHORT_VARTYPE_MAX_BYTES <= valueLength) { param.typeDefinition = VARCHAR_MAX; @@ -745,12 +747,12 @@ private void setTypeDefinition(DTV dtv) { || (jdbcTypeSetByUser == JDBCType.LONGVARCHAR))) { if (0 == valueLength) { // Workaround for the issue when inserting empty string and null into encrypted columns - param.typeDefinition = "varchar(1)"; + param.typeDefinition = SSType.VARCHAR.toString() + "(1)"; valueLength++; } else if (DataTypes.SHORT_VARTYPE_MAX_BYTES < valueLength) { param.typeDefinition = VARCHAR_MAX; } else { - param.typeDefinition = "varchar(" + valueLength + ")"; + param.typeDefinition = SSType.VARCHAR.toString() + "(" + valueLength + ")"; } if (jdbcTypeSetByUser == JDBCType.LONGVARCHAR) { @@ -760,12 +762,12 @@ private void setTypeDefinition(DTV dtv) { || jdbcTypeSetByUser == JDBCType.LONGNVARCHAR)) { if (0 == valueLength) { // Workaround for the issue when inserting empty string and null into encrypted columns - param.typeDefinition = "nvarchar(1)"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(1)"; valueLength++; } else if (DataTypes.SHORT_VARTYPE_MAX_CHARS < valueLength) { param.typeDefinition = NVARCHAR_MAX; } else { - param.typeDefinition = "nvarchar(" + valueLength + ")"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(" + valueLength + ")"; } if (jdbcTypeSetByUser == JDBCType.LONGNVARCHAR) { @@ -774,10 +776,10 @@ private void setTypeDefinition(DTV dtv) { } else { // used if setNull() is called with java.sql.Types.NCHAR if (0 == valueLength) { // Workaround for the issue when inserting empty string and null into encrypted columns - param.typeDefinition = "nvarchar(1)"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(1)"; valueLength++; } else { - param.typeDefinition = "nvarchar(" + valueLength + ")"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(" + valueLength + ")"; if (DataTypes.SHORT_VARTYPE_MAX_BYTES <= valueLength) { param.typeDefinition = NVARCHAR_MAX; @@ -814,10 +816,10 @@ private void setTypeDefinition(DTV dtv) { || (JDBCType.LONGVARCHAR == jdbcTypeSetByUser))) { if (0 == valueLength) { // Workaround for the issue when inserting empty string and null into encrypted columns - param.typeDefinition = "varchar(1)"; + param.typeDefinition = SSType.VARCHAR.toString() + "(1)"; valueLength++; } else { - param.typeDefinition = "varchar(" + valueLength + ")"; + param.typeDefinition = SSType.VARCHAR.toString() + "(" + valueLength + ")"; if (DataTypes.SHORT_VARTYPE_MAX_BYTES < valueLength) { param.typeDefinition = VARCHAR_MAX; @@ -832,10 +834,10 @@ private void setTypeDefinition(DTV dtv) { || (JDBCType.LONGNVARCHAR == jdbcTypeSetByUser))) { if (0 == valueLength) { // Workaround for the issue when inserting empty string and null into encrypted columns - param.typeDefinition = "nvarchar(1)"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(1)"; valueLength++; } else { - param.typeDefinition = "nvarchar(" + valueLength + ")"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(" + valueLength + ")"; if (DataTypes.SHORT_VARTYPE_MAX_BYTES <= valueLength) { param.typeDefinition = NVARCHAR_MAX; @@ -848,10 +850,10 @@ private void setTypeDefinition(DTV dtv) { } else { // used if setNull() is called with java.sql.Types.NCHAR if (0 == valueLength) { // Workaround for the issue when inserting empty string and null into encrypted columns - param.typeDefinition = "nvarchar(1)"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(1)"; valueLength++; } else { - param.typeDefinition = "nvarchar(" + valueLength + ")"; + param.typeDefinition = SSType.NVARCHAR.toString() + "(" + valueLength + ")"; if (DataTypes.SHORT_VARTYPE_MAX_BYTES <= valueLength) { param.typeDefinition = NVARCHAR_MAX; diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAASEnclaveProvider.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAASEnclaveProvider.java index b12151caf1..99c11638a3 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAASEnclaveProvider.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAASEnclaveProvider.java @@ -52,7 +52,9 @@ public class SQLServerAASEnclaveProvider implements ISQLServerEnclaveProvider { /** * default constructor */ - public SQLServerAASEnclaveProvider() {} + public SQLServerAASEnclaveProvider() { + // default constructor + } @Override public void getAttestationParameters(String url) throws SQLServerException { diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Algorithm.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Algorithm.java index becf72a0f0..55863ba846 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Algorithm.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Algorithm.java @@ -33,7 +33,9 @@ class SQLServerAeadAes256CbcHmac256Algorithm extends SQLServerEncryptionAlgorith static final private java.util.logging.Logger aeLogger = java.util.logging.Logger .getLogger("com.microsoft.sqlserver.jdbc.SQLServerAeadAes256CbcHmac256Algorithm"); - final static String algorithmName = "AEAD_AES_256_CBC_HMAC_SHA256"; + final static String AEAD_AES_256_CBC_HMAC_SHA256 = "AEAD_AES_256_CBC_HMAC_SHA256"; + private static final String HMAC_SHA_256 = "HmacSHA256"; + // Stores column encryption key which includes root key and derived keys private SQLServerAeadAes256CbcHmac256EncryptionKey columnEncryptionkey; private byte algorithmVersion; @@ -75,7 +77,7 @@ class SQLServerAeadAes256CbcHmac256Algorithm extends SQLServerEncryptionAlgorith SQLServerEncryptionType encryptionType, byte algorithmVersion) { this.columnEncryptionkey = columnEncryptionkey; - if (encryptionType == SQLServerEncryptionType.Deterministic) { + if (encryptionType == SQLServerEncryptionType.DETERMINISTIC) { this.isDeterministic = true; } this.algorithmVersion = algorithmVersion; @@ -160,8 +162,8 @@ protected byte[] encryptData(byte[] plainText, boolean hasAuthenticationTag) thr if (hasAuthenticationTag) { - Mac hmac = Mac.getInstance("HmacSHA256"); - SecretKeySpec initkey = new SecretKeySpec(columnEncryptionkey.getMacKey(), "HmacSHA256"); + Mac hmac = Mac.getInstance(HMAC_SHA_256); + SecretKeySpec initkey = new SecretKeySpec(columnEncryptionkey.getMacKey(), HMAC_SHA_256); hmac.init(initkey); hmac.update(version, 0, version.length); hmac.update(iv, 0, iv.length); @@ -330,8 +332,8 @@ private byte[] prepareAuthenticationTag(byte[] iv, byte[] cipherText, int offset byte[] computedHash; byte[] authenticationTag = new byte[keySizeInBytes]; - Mac hmac = Mac.getInstance("HmacSHA256"); - SecretKeySpec key = new SecretKeySpec(columnEncryptionkey.getMacKey(), "HmacSHA256"); + Mac hmac = Mac.getInstance(HMAC_SHA_256); + SecretKeySpec key = new SecretKeySpec(columnEncryptionkey.getMacKey(), HMAC_SHA_256); hmac.init(key); hmac.update(version, 0, version.length); hmac.update(iv, 0, iv.length); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Factory.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Factory.java index 58f5af235a..0094551bdb 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Factory.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerAeadAes256CbcHmac256Factory.java @@ -25,11 +25,11 @@ SQLServerEncryptionAlgorithm create(SQLServerSymmetricKey columnEncryptionKey, SQLServerEncryptionType encryptionType, String encryptionAlgorithm) throws SQLServerException { assert (columnEncryptionKey != null); - if (encryptionType != SQLServerEncryptionType.Deterministic - && encryptionType != SQLServerEncryptionType.Randomized) { + if (encryptionType != SQLServerEncryptionType.DETERMINISTIC + && encryptionType != SQLServerEncryptionType.RANDOMIZED) { MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_InvalidEncryptionType")); Object[] msgArgs = {encryptionType, encryptionAlgorithm, - "'" + SQLServerEncryptionType.Deterministic + "," + SQLServerEncryptionType.Randomized + "'"}; + "'" + SQLServerEncryptionType.DETERMINISTIC + "," + SQLServerEncryptionType.RANDOMIZED + "'"}; throw new SQLServerException(this, form.format(msgArgs), null, 0, false); } @@ -49,7 +49,8 @@ SQLServerEncryptionAlgorithm create(SQLServerSymmetricKey columnEncryptionKey, if (!encryptionAlgorithms.containsKey(factoryKey)) { SQLServerAeadAes256CbcHmac256EncryptionKey encryptedKey = new SQLServerAeadAes256CbcHmac256EncryptionKey( - columnEncryptionKey.getRootKey(), SQLServerAeadAes256CbcHmac256Algorithm.algorithmName); + columnEncryptionKey.getRootKey(), + SQLServerAeadAes256CbcHmac256Algorithm.AEAD_AES_256_CBC_HMAC_SHA256); aesAlgorithm = new SQLServerAeadAes256CbcHmac256Algorithm(encryptedKey, encryptionType, algorithmVersion); encryptionAlgorithms.putIfAbsent(factoryKey, aesAlgorithm); } diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java index 87db28976a..d8facaa093 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java @@ -1243,9 +1243,9 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, // if destination is encrypted send metadata from destination and not from source if (DataTypes.SHORT_VARTYPE_MAX_BYTES < destPrecision) { - return "varbinary(max)"; + return SSType.VARBINARY.toString() + "(max)"; } else { - return "varbinary(" + destColumnMetadata.get(destColIndx).precision + ")"; + return SSType.VARBINARY.toString() + "(" + destColumnMetadata.get(destColIndx).precision + ")"; } } @@ -1268,7 +1268,7 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, // SQL Server does not convert string to binary, we will have to explicitly convert before sending. if (Util.isCharType(bulkJdbcType) && Util.isBinaryType(destSSType)) { if (isStreaming) - return "varbinary(max)"; + return SSType.VARBINARY.toString() + "(max)"; else // Return binary(n) or varbinary(n) or varbinary(max) depending on destination type/precision. return destSSType.toString() + "(" diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerCallableStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerCallableStatement.java index 4308b080bc..0c3d5538aa 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerCallableStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerCallableStatement.java @@ -49,6 +49,9 @@ public class SQLServerCallableStatement extends SQLServerPreparedStatement imple */ private static final long serialVersionUID = 5044984771674532350L; + private static final String GET_TIMESTAMP = "getTimestamp"; + private static final String SQLSTATE_07009 = "07009"; + /** the call param names */ private HashMap parameterNames; @@ -409,7 +412,7 @@ private Parameter getterGetParam(int index) throws SQLServerException { if (index < 1 || index > inOutParam.length) { MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_invalidOutputParameter")); Object[] msgArgs = {index}; - SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), "07009", false); + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), SQLSTATE_07009, false); } // Check index refers to a registered OUT parameter @@ -417,13 +420,13 @@ private Parameter getterGetParam(int index) throws SQLServerException { MessageFormat form = new MessageFormat( SQLServerException.getErrString("R_outputParameterNotRegisteredForOutput")); Object[] msgArgs = {index}; - SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), "07009", true); + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), SQLSTATE_07009, true); } // If we haven't executed the statement yet then throw a nice friendly exception. if (!wasExecuted()) SQLServerException.makeFromDriverError(connection, this, - SQLServerException.getErrString("R_statementMustBeExecuted"), "07009", false); + SQLServerException.getErrString("R_statementMustBeExecuted"), SQLSTATE_07009, false); resultsReader().getCommand().checkForInterrupt(); @@ -892,39 +895,39 @@ public Time getTime(String parameterName, Calendar cal) throws SQLServerExceptio @Override public Timestamp getTimestamp(int index) throws SQLServerException { if (loggerExternal.isLoggable(java.util.logging.Level.FINER)) - loggerExternal.entering(getClassNameLogging(), "getTimestamp", index); + loggerExternal.entering(getClassNameLogging(), GET_TIMESTAMP, index); checkClosed(); java.sql.Timestamp value = (java.sql.Timestamp) getValue(index, JDBCType.TIMESTAMP); - loggerExternal.exiting(getClassNameLogging(), "getTimestamp", value); + loggerExternal.exiting(getClassNameLogging(), GET_TIMESTAMP, value); return value; } @Override public Timestamp getTimestamp(String parameterName) throws SQLServerException { - loggerExternal.entering(getClassNameLogging(), "getTimestamp", parameterName); + loggerExternal.entering(getClassNameLogging(), GET_TIMESTAMP, parameterName); checkClosed(); java.sql.Timestamp value = (java.sql.Timestamp) getValue(findColumn(parameterName), JDBCType.TIMESTAMP); - loggerExternal.exiting(getClassNameLogging(), "getTimestamp", value); + loggerExternal.exiting(getClassNameLogging(), GET_TIMESTAMP, value); return value; } @Override public Timestamp getTimestamp(int index, Calendar cal) throws SQLServerException { if (loggerExternal.isLoggable(java.util.logging.Level.FINER)) - loggerExternal.entering(getClassNameLogging(), "getTimestamp", new Object[] {index, cal}); + loggerExternal.entering(getClassNameLogging(), GET_TIMESTAMP, new Object[] {index, cal}); checkClosed(); java.sql.Timestamp value = (java.sql.Timestamp) getValue(index, JDBCType.TIMESTAMP, cal); - loggerExternal.exiting(getClassNameLogging(), "getTimestamp", value); + loggerExternal.exiting(getClassNameLogging(), GET_TIMESTAMP, value); return value; } @Override public Timestamp getTimestamp(String name, Calendar cal) throws SQLServerException { if (loggerExternal.isLoggable(java.util.logging.Level.FINER)) - loggerExternal.entering(getClassNameLogging(), "getTimestamp", new Object[] {name, cal}); + loggerExternal.entering(getClassNameLogging(), GET_TIMESTAMP, new Object[] {name, cal}); checkClosed(); java.sql.Timestamp value = (java.sql.Timestamp) getValue(findColumn(name), JDBCType.TIMESTAMP, cal); - loggerExternal.exiting(getClassNameLogging(), "getTimestamp", value); + loggerExternal.exiting(getClassNameLogging(), GET_TIMESTAMP, value); return value; } @@ -1329,7 +1332,8 @@ private int findColumn(String columnName) throws SQLServerException { MessageFormat form = new MessageFormat( SQLServerException.getErrString("R_parameterNotDefinedForProcedure")); Object[] msgArgs = {columnName, ""}; - SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), "07009", false); + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), SQLSTATE_07009, + false); } try (ResultSet rs = s.executeQueryInternal(metaQuery.toString())) { @@ -1373,7 +1377,7 @@ private int findColumn(String columnName) throws SQLServerException { MessageFormat form = new MessageFormat( SQLServerException.getErrString("R_parameterNotDefinedForProcedure")); Object[] msgArgs = {columnName, procedureName}; - SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), "07009", false); + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), SQLSTATE_07009, false); } // @RETURN_VALUE is always in the list. If the user uses return value ?=call(@p1) syntax then diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionAzureKeyVaultProvider.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionAzureKeyVaultProvider.java index 53d58b8c71..03ee98204d 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionAzureKeyVaultProvider.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerColumnEncryptionAzureKeyVaultProvider.java @@ -129,6 +129,7 @@ public class SQLServerColumnEncryptionAzureKeyVaultProvider extends SQLServerCol private static final String MSSQL_JDBC_PROPERTIES = "mssql-jdbc.properties"; private static final String AKV_TRUSTED_ENDPOINTS_KEYWORD = "AKVTrustedEndpoints"; private static final String RSA_ENCRYPTION_ALGORITHM_WITH_OAEP_FOR_AKV = "RSA-OAEP"; + private static final String SHA_256 = "SHA-256"; private static final List akvTrustedEndpoints = getTrustedEndpoints(); @@ -412,7 +413,7 @@ public byte[] decryptColumnEncryptionKey(String masterKeyPath, String encryption MessageDigest md = null; try { - md = MessageDigest.getInstance("SHA-256"); + md = MessageDigest.getInstance(SHA_256); } catch (NoSuchAlgorithmException e) { throw new SQLServerException(SQLServerException.getErrString("R_NoSHA256Algorithm"), e); } @@ -533,7 +534,7 @@ public byte[] encryptColumnEncryptionKey(String masterKeyPath, String encryption MessageDigest md = null; try { - md = MessageDigest.getInstance("SHA-256"); + md = MessageDigest.getInstance(SHA_256); } catch (NoSuchAlgorithmException e) { throw new SQLServerException(SQLServerException.getErrString("R_NoSHA256Algorithm"), e); } @@ -874,7 +875,7 @@ public boolean verifyColumnMasterKeyMetadata(String masterKeyPath, boolean allow } try { - MessageDigest md = MessageDigest.getInstance("SHA-256"); + MessageDigest md = MessageDigest.getInstance(SHA_256); md.update(name.toLowerCase().getBytes(java.nio.charset.StandardCharsets.UTF_16LE)); md.update(masterKeyPath.toLowerCase().getBytes(java.nio.charset.StandardCharsets.UTF_16LE)); // value of allowEnclaveComputations is always true here diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java index ff4d2ef7c8..eb4992c681 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java @@ -622,6 +622,10 @@ ServerPortPlaceHolder getRoutingInfo() { private static final String CALL_ABORT_PERM = "callAbort"; private static final String SET_NETWORK_TIMEOUT_PERM = "setNetworkTimeout"; + private static final String SET_SAVE_POINT = "setSaveoint"; + private static final String CREATE_STATEMENT = "createStatement"; + private static final String ACTIVITY_ID = " ActivityId: "; + private static final String TRUSTED_KEY_MASTER_PATHS = "Trusted Master Key Paths"; /** see connection properties doc (default is false) */ private boolean sendStringParametersAsUnicode = SQLServerDriverBooleanProperty.SEND_STRING_PARAMETERS_AS_UNICODE @@ -1229,7 +1233,7 @@ public void registerColumnEncryptionKeyStoreProvidersOnConnection( */ public static void setColumnEncryptionTrustedMasterKeyPaths(Map> trustedKeyPaths) { loggerExternal.entering(loggingClassNameBase, "setColumnEncryptionTrustedMasterKeyPaths", - "Setting Trusted Master Key Paths"); + "Setting " + TRUSTED_KEY_MASTER_PATHS); sLock.lock(); try { @@ -1243,7 +1247,7 @@ public static void setColumnEncryptionTrustedMasterKeyPaths(Map trustedKeyPaths) { loggerExternal.entering(loggingClassNameBase, "updateColumnEncryptionTrustedMasterKeyPaths", - "Updating Trusted Master Key Paths"); + "Updating " + TRUSTED_KEY_MASTER_PATHS); sLock.lock(); try { @@ -1267,7 +1271,7 @@ public static void updateColumnEncryptionTrustedMasterKeyPaths(String server, Li } loggerExternal.exiting(loggingClassNameBase, "updateColumnEncryptionTrustedMasterKeyPaths", - "Number of Trusted Master Key Paths: " + columnEncryptionTrustedMasterKeyPaths.size()); + "Number of " + TRUSTED_KEY_MASTER_PATHS + ": " + columnEncryptionTrustedMasterKeyPaths.size()); } /** @@ -1278,7 +1282,7 @@ public static void updateColumnEncryptionTrustedMasterKeyPaths(String server, Li */ public static void removeColumnEncryptionTrustedMasterKeyPaths(String server) { loggerExternal.entering(loggingClassNameBase, "removeColumnEncryptionTrustedMasterKeyPaths", - "Removing Trusted Master Key Paths"); + "Removing " + TRUSTED_KEY_MASTER_PATHS); sLock.lock(); try { @@ -1289,7 +1293,7 @@ public static void removeColumnEncryptionTrustedMasterKeyPaths(String server) { } loggerExternal.exiting(loggingClassNameBase, "removeColumnEncryptionTrustedMasterKeyPaths", - "Number of Trusted Master Key Paths: " + columnEncryptionTrustedMasterKeyPaths.size()); + "Number of " + TRUSTED_KEY_MASTER_PATHS + ": " + columnEncryptionTrustedMasterKeyPaths.size()); } /** @@ -1299,7 +1303,7 @@ public static void removeColumnEncryptionTrustedMasterKeyPaths(String server) { */ public static Map> getColumnEncryptionTrustedMasterKeyPaths() { loggerExternal.entering(loggingClassNameBase, "getColumnEncryptionTrustedMasterKeyPaths", - "Getting Trusted Master Key Paths"); + "Getting " + TRUSTED_KEY_MASTER_PATHS); sLock.lock(); try { @@ -1310,7 +1314,7 @@ public static Map> getColumnEncryptionTrustedMasterKeyPaths } loggerExternal.exiting(loggingClassNameBase, "getColumnEncryptionTrustedMasterKeyPaths", - "Number of Trusted Master Key Paths: " + masterKeyPathCopy.size()); + "Number of " + TRUSTED_KEY_MASTER_PATHS + ": " + masterKeyPathCopy.size()); return masterKeyPathCopy; } finally { @@ -1423,7 +1427,7 @@ final void setMaxFieldSize(int limit) throws SQLServerException { // assert limit >= 0; if (maxFieldSize != limit) { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } // If no limit on field size, set text size to max (2147483647), NOT default (0 --> 4K) connectionCommand("SET TEXTSIZE " + ((0 == limit) ? Integer.MAX_VALUE : limit), "setMaxFieldSize"); @@ -1455,7 +1459,7 @@ final void setMaxRows(int limit) throws SQLServerException { // assert limit >= 0; if (maxRows != limit) { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } connectionCommand("SET ROWCOUNT " + limit, "setMaxRows"); maxRows = limit; @@ -4243,9 +4247,9 @@ static String sqlStatementToSetCommit(boolean autoCommit) { @Override public Statement createStatement() throws SQLServerException { - loggerExternal.entering(loggingClassName, "createStatement"); + loggerExternal.entering(loggingClassName, CREATE_STATEMENT); Statement st = createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - loggerExternal.exiting(loggingClassName, "createStatement", st); + loggerExternal.exiting(loggingClassName, CREATE_STATEMENT, st); return st; } @@ -4278,7 +4282,7 @@ public void setAutoCommit(boolean newAutoCommitMode) throws SQLServerException { if (loggerExternal.isLoggable(Level.FINER)) { loggerExternal.entering(loggingClassName, "setAutoCommit", newAutoCommitMode); if (Util.isActivityTraceOn()) - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } String commitPendingTransaction = ""; checkClosed(); @@ -4334,7 +4338,7 @@ public void commit() throws SQLServerException { public void commit(boolean delayedDurability) throws SQLServerException { loggerExternal.entering(loggingClassName, "commit"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -4352,7 +4356,7 @@ public void commit(boolean delayedDurability) throws SQLServerException { public void rollback() throws SQLServerException { loggerExternal.entering(loggingClassName, "rollback"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -4512,7 +4516,7 @@ public boolean isReadOnly() throws SQLServerException { public void setCatalog(String catalog) throws SQLServerException { loggerExternal.entering(loggingClassName, "setCatalog", catalog); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); if (catalog != null) { @@ -4535,7 +4539,7 @@ public void setTransactionIsolation(int level) throws SQLServerException { if (loggerExternal.isLoggable(Level.FINER)) { loggerExternal.entering(loggingClassName, "setTransactionIsolation", level); if (Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } } @@ -4607,7 +4611,7 @@ public void clearWarnings() throws SQLServerException { @Override public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLServerException { if (loggerExternal.isLoggable(Level.FINER)) - loggerExternal.entering(loggingClassName, "createStatement", + loggerExternal.entering(loggingClassName, CREATE_STATEMENT, new Object[] {resultSetType, resultSetConcurrency}); checkClosed(); SQLServerStatement st = new SQLServerStatement(this, resultSetType, resultSetConcurrency, @@ -4615,7 +4619,7 @@ public Statement createStatement(int resultSetType, int resultSetConcurrency) th if (requestStarted) { addOpenStatement(st); } - loggerExternal.exiting(loggingClassName, "createStatement", st); + loggerExternal.exiting(loggingClassName, CREATE_STATEMENT, st); return st; } @@ -6513,18 +6517,18 @@ private void checkMatchesCurrentHoldability(int resultSetHoldability) throws SQL @Override public Statement createStatement(int nType, int nConcur, int resultSetHoldability) throws SQLServerException { - loggerExternal.entering(loggingClassName, "createStatement", + loggerExternal.entering(loggingClassName, CREATE_STATEMENT, new Object[] {nType, nConcur, resultSetHoldability}); Statement st = createStatement(nType, nConcur, resultSetHoldability, SQLServerStatementColumnEncryptionSetting.UseConnectionSetting); - loggerExternal.exiting(loggingClassName, "createStatement", st); + loggerExternal.exiting(loggingClassName, CREATE_STATEMENT, st); return st; } @Override public Statement createStatement(int nType, int nConcur, int resultSetHoldability, SQLServerStatementColumnEncryptionSetting stmtColEncSetting) throws SQLServerException { - loggerExternal.entering(loggingClassName, "createStatement", + loggerExternal.entering(loggingClassName, CREATE_STATEMENT, new Object[] {nType, nConcur, resultSetHoldability, stmtColEncSetting}); checkClosed(); checkValidHoldability(resultSetHoldability); @@ -6533,7 +6537,7 @@ public Statement createStatement(int nType, int nConcur, int resultSetHoldabilit if (requestStarted) { addOpenStatement((ISQLServerStatement) st); } - loggerExternal.exiting(loggingClassName, "createStatement", st); + loggerExternal.exiting(loggingClassName, CREATE_STATEMENT, st); return st; } @@ -6709,32 +6713,32 @@ final private Savepoint setNamedSavepoint(String sName) throws SQLServerExceptio // than just the outer transaction (@@TRANCOUNT = 1). Should this limitation ever // change, the T-SQL below should still work. connectionCommand("IF @@TRANCOUNT = 0 BEGIN BEGIN TRAN IF @@TRANCOUNT = 2 COMMIT TRAN END SAVE TRAN " - + Util.escapeSQLId(s.getLabel()), "setSavepoint"); + + Util.escapeSQLId(s.getLabel()), SET_SAVE_POINT); return s; } @Override public Savepoint setSavepoint(String sName) throws SQLServerException { - loggerExternal.entering(loggingClassName, "setSavepoint", sName); + loggerExternal.entering(loggingClassName, SET_SAVE_POINT, sName); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); Savepoint pt = setNamedSavepoint(sName); - loggerExternal.exiting(loggingClassName, "setSavepoint", pt); + loggerExternal.exiting(loggingClassName, SET_SAVE_POINT, pt); return pt; } @Override public Savepoint setSavepoint() throws SQLServerException { - loggerExternal.entering(loggingClassName, "setSavepoint"); + loggerExternal.entering(loggingClassName, SET_SAVE_POINT); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); Savepoint pt = setNamedSavepoint(null); - loggerExternal.exiting(loggingClassName, "setSavepoint", pt); + loggerExternal.exiting(loggingClassName, SET_SAVE_POINT, pt); return pt; } @@ -6742,7 +6746,7 @@ public Savepoint setSavepoint() throws SQLServerException { public void rollback(Savepoint s) throws SQLServerException { loggerExternal.entering(loggingClassName, "rollback", s); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); if (databaseAutoCommitMode) { @@ -6767,7 +6771,7 @@ public void setHoldability(int holdability) throws SQLServerException { loggerExternal.entering(loggingClassName, "setHoldability", holdability); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkValidHoldability(holdability); checkClosed(); @@ -6835,7 +6839,7 @@ public void setNetworkTimeout(Executor executor, int timeout) throws SQLExceptio terminate(SQLServerException.DRIVER_ERROR_IO_FAILED, ioe.getMessage(), ioe); } - loggerExternal.exiting(loggingClassName, "setNetworkTimeout"); + loggerExternal.exiting(loggingClassName, SET_NETWORK_TIMEOUT_PERM); } @Override diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnectionPoolDataSource.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnectionPoolDataSource.java index a6c928a9ca..43a83cb159 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnectionPoolDataSource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnectionPoolDataSource.java @@ -24,7 +24,9 @@ public class SQLServerConnectionPoolDataSource extends SQLServerDataSource imple /** * default constructor */ - public SQLServerConnectionPoolDataSource() {} + public SQLServerConnectionPoolDataSource() { + // default constructor + } // Get a new physical connection that the pool manager will issue logical connections from @Override diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSource.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSource.java index d2565c8232..87b50aebdf 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSource.java @@ -33,6 +33,8 @@ public class SQLServerDataSource static final private java.util.logging.Logger parentLogger = java.util.logging.Logger .getLogger("com.microsoft.sqlserver.jdbc"); + static final String TRUSTSTORE_PASSWORD_STRIPPED = "trustStorePasswordStripped"; + /** logging class name */ final private String loggingClassName; @@ -1457,7 +1459,7 @@ Reference getReferenceInternal(String dataSourceClassString) { ref.add(new StringRefAddr("class", dataSourceClassString)); if (trustStorePasswordStripped) - ref.add(new StringRefAddr("trustStorePasswordStripped", "true")); + ref.add(new StringRefAddr(TRUSTSTORE_PASSWORD_STRIPPED, "true")); // Add each property name+value pair found in connectionProps. Enumeration e = connectionProps.keys(); @@ -1469,7 +1471,7 @@ Reference getReferenceInternal(String dataSourceClassString) { // The property set and the variable set at the same time is not // possible assert !trustStorePasswordStripped; - ref.add(new StringRefAddr("trustStorePasswordStripped", "true")); + ref.add(new StringRefAddr(TRUSTSTORE_PASSWORD_STRIPPED, "true")); } else { // do not add passwords to the collection. we have normal // password @@ -1509,7 +1511,7 @@ void initializeFromReference(javax.naming.Reference ref) { dataSourceURL = propertyValue; } else if ("dataSourceDescription".equals(propertyName)) { dataSourceDescription = propertyValue; - } else if ("trustStorePasswordStripped".equals(propertyName)) { + } else if (TRUSTSTORE_PASSWORD_STRIPPED.equals(propertyName)) { trustStorePasswordStripped = true; } // Just skip "class" StringRefAddr, it does not go into diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSourceObjectFactory.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSourceObjectFactory.java index 59fc884b14..c1b31512ff 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSourceObjectFactory.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDataSourceObjectFactory.java @@ -24,7 +24,9 @@ public final class SQLServerDataSourceObjectFactory implements ObjectFactory { /** * Constructs a SQLServerDataSourceObjectFactory. */ - public SQLServerDataSourceObjectFactory() {} + public SQLServerDataSourceObjectFactory() { + // default constructor + } /** * Returns an reference to the SQLServerDataSource instance getObjectInstance is a factory for rehydrating diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java index 8e257ca580..e4e9ac0539 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java @@ -270,6 +270,10 @@ private void checkClosed() throws SQLServerException { private static final String IS_GENERATEDCOLUMN = "IS_GENERATEDCOLUMN"; private static final String IS_AUTOINCREMENT = "IS_AUTOINCREMENT"; + private static final String SELECT = "SELECT"; + private static final String WHERE = " WHERE "; + private static final String WHERE_CLAUSE = " WHERE 0 = 1"; + private static final String SQL_KEYWORDS = createSqlKeyWords(); // Use LinkedHashMap to force retrieve elements in order they were inserted @@ -805,8 +809,8 @@ private String generateAzureDWSelect(ResultSet rs, Map columns) if (null == o) { sb.append("NULL"); } else if (o instanceof Number) { - if ("IS_AUTOINCREMENT".equalsIgnoreCase(p.getValue()) - || "IS_GENERATEDCOLUMN".equalsIgnoreCase(p.getValue())) { + if (IS_AUTOINCREMENT.equalsIgnoreCase(p.getValue()) + || IS_GENERATEDCOLUMN.equalsIgnoreCase(p.getValue())) { sb.append("'").append(Util.escapeSingleQuotes(Util.zeroOneToYesNo(((Number) o).intValue()))) .append("'"); } else { @@ -912,11 +916,11 @@ public java.sql.ResultSet getFunctionColumns(String catalog, String schemaPatter @Override public java.sql.ResultSet getClientInfoProperties() throws SQLException { checkClosed(); - return getResultSetFromInternalQueries(null, "SELECT" + + return getResultSetFromInternalQueries(null, SELECT + /* 1 */ " cast(NULL as char(1)) as NAME," + /* 2 */ " cast(0 as int) as MAX_LEN," + /* 3 */ " cast(NULL as char(1)) as DEFAULT_VALUE," + - /* 4 */ " cast(NULL as char(1)) as DESCRIPTION " + " where 0 = 1"); + /* 4 */ " cast(NULL as char(1)) as DESCRIPTION " + WHERE_CLAUSE); } private static final String[] getBestRowIdentifierColumnNames = { /* 1 */ SCOPE, /* 2 */ COLUMN_NAME, @@ -1436,7 +1440,7 @@ public ResultSet getPseudoColumns(String catalog, String schemaPattern, String t // as per // http://msdn.microsoft.com/en-us/library/ms378445%28v=sql.110%29.aspx // so just return empty result set - return getResultSetFromInternalQueries(catalog, "SELECT" + + return getResultSetFromInternalQueries(catalog, SELECT + /* 1 */ " cast(NULL as char(1)) as TABLE_CAT," + /* 2 */ " cast(NULL as char(1)) as TABLE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TABLE_NAME," + @@ -1448,7 +1452,7 @@ public ResultSet getPseudoColumns(String catalog, String schemaPattern, String t /* 9 */ " cast(NULL as char(1)) as COLUMN_USAGE," + /* 10 */ " cast(NULL as char(1)) as REMARKS," + /* 11 */ " cast(0 as int) as CHAR_OCTET_LENGTH," + - /* 12 */ " cast(NULL as char(1)) as IS_NULLABLE" + " where 0 = 1"); + /* 12 */ " cast(NULL as char(1)) as IS_NULLABLE" + WHERE_CLAUSE); } @Override @@ -1503,12 +1507,12 @@ private java.sql.ResultSet getSchemasInternal(String catalog, // if (null != catalog && catalog.length() == 0) { if (null != schemaPattern) - s += " where " + schemaName + " like ? and "; + s += WHERE + schemaName + " like ? and "; else - s += " where "; + s += WHERE; s += schemaName + " in " + constSchemas; } else if (null != schemaPattern) - s += " where " + schemaName + " like ? "; + s += WHERE + schemaName + " like ? "; s += " order by 2, 1"; if (logger.isLoggable(java.util.logging.Level.FINE)) { @@ -2388,14 +2392,14 @@ public java.sql.ResultSet getUDTs(String catalog, String schemaPattern, String t loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, "SELECT" + + return getResultSetFromInternalQueries(catalog, SELECT + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + /* 4 */ " cast(NULL as char(1)) as CLASS_NAME," + /* 5 */ " cast(0 as int) as DATA_TYPE," + /* 6 */ " cast(NULL as char(1)) as REMARKS," + - /* 7 */ " cast(0 as smallint) as BASE_TYPE" + " where 0 = 1"); + /* 7 */ " cast(0 as smallint) as BASE_TYPE" + WHERE_CLAUSE); } @Override @@ -2490,7 +2494,7 @@ public ResultSet getAttributes(String catalog, String schemaPattern, String type loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, "SELECT" + + return getResultSetFromInternalQueries(catalog, SELECT + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + @@ -2511,7 +2515,7 @@ public ResultSet getAttributes(String catalog, String schemaPattern, String type /* 18 */ " cast(NULL as char(1)) as SCOPE_CATALOG," + /* 19 */ " cast(NULL as char(1)) as SCOPE_SCHEMA," + /* 20 */ " cast(NULL as char(1)) as SCOPE_TABLE," + - /* 21 */ " cast(0 as smallint) as SOURCE_DATA_TYPE" + " where 0 = 1"); + /* 21 */ " cast(0 as smallint) as SOURCE_DATA_TYPE" + WHERE_CLAUSE); } @Override @@ -2521,11 +2525,11 @@ public ResultSet getSuperTables(String catalog, String schemaPattern, loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, "SELECT" + + return getResultSetFromInternalQueries(catalog, SELECT + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + - /* 4 */ " cast(NULL as char(1)) as SUPERTABLE_NAME" + " where 0 = 1"); + /* 4 */ " cast(NULL as char(1)) as SUPERTABLE_NAME" + WHERE_CLAUSE); } @Override @@ -2535,13 +2539,13 @@ public ResultSet getSuperTypes(String catalog, String schemaPattern, loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, "SELECT" + + return getResultSetFromInternalQueries(catalog, SELECT + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + /* 4 */ " cast(NULL as char(1)) as SUPERTYPE_CAT," + /* 5 */ " cast(NULL as char(1)) as SUPERTYPE_SCHEM," + - /* 6 */ " cast(NULL as char(1)) as SUPERTYPE_NAME" + " where 0 = 1"); + /* 6 */ " cast(NULL as char(1)) as SUPERTYPE_NAME" + WHERE_CLAUSE); } @Override diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionAlgorithmFactoryList.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionAlgorithmFactoryList.java index 9e8f35f61b..5c2ba42869 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionAlgorithmFactoryList.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionAlgorithmFactoryList.java @@ -20,7 +20,7 @@ final class SQLServerEncryptionAlgorithmFactoryList { private SQLServerEncryptionAlgorithmFactoryList() { encryptionAlgoFactoryMap = new ConcurrentHashMap<>(); - encryptionAlgoFactoryMap.putIfAbsent(SQLServerAeadAes256CbcHmac256Algorithm.algorithmName, + encryptionAlgoFactoryMap.putIfAbsent(SQLServerAeadAes256CbcHmac256Algorithm.AEAD_AES_256_CBC_HMAC_SHA256, new SQLServerAeadAes256CbcHmac256Factory()); } diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionType.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionType.java index 289215db29..098c9314e1 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionType.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerEncryptionType.java @@ -14,9 +14,9 @@ * */ enum SQLServerEncryptionType { - Deterministic((byte) 1), - Randomized((byte) 2), - PlainText((byte) 0); + DETERMINISTIC((byte) 1), + RANDOMIZED((byte) 2), + PLAINTEXT((byte) 0); final byte value; private static final SQLServerEncryptionType[] VALUES = values(); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java index 29f7d9cf0b..e762761731 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java @@ -59,6 +59,7 @@ public final class SQLServerException extends java.sql.SQLException { static final String EXCEPTION_XOPEN_CONNECTION_CANT_ESTABLISH = "08001"; static final String EXCEPTION_XOPEN_CONNECTION_DOES_NOT_EXIST = "08003"; static final String EXCEPTION_XOPEN_CONNECTION_FAILURE = "08006"; // After connection was connected OK + static final String LOG_CLIENT_CONNECTION_ID_PREFIX = " ClientConnectionId:"; // SQL error values (from sqlerrorcodes.h) @@ -338,9 +339,9 @@ static String generateStateCode(SQLServerConnection con, int errNum, Integer dat if (xopenStates) { switch (errNum) { case 4060: - return "08001"; // Database name undefined at logging + return EXCEPTION_XOPEN_CONNECTION_CANT_ESTABLISH; // Database name undefined at logging case 18456: - return "08001"; // username password wrong at login + return EXCEPTION_XOPEN_CONNECTION_CANT_ESTABLISH; // username password wrong at login case 2714: return "42S01"; // Table already exists case 208: @@ -353,13 +354,13 @@ static String generateStateCode(SQLServerConnection con, int errNum, Integer dat // The error code came from the db but XOPEN does not have a specific case for it. } else { switch (errNum) { - // case 18456: return "08001"; //username password wrong at login + // case 18456: return EXCEPTION_XOPEN_CONNECTION_CANT_ESTABLISH; //username password wrong at login case 8152: return "22001"; // String data right truncation case 515: // 2.2705 case 547: - return "23000"; // Integrity constraint violation case 2601: + case 2627: return "23000"; // Integrity constraint violation case 2714: return "S0001"; // table already exists @@ -367,8 +368,6 @@ static String generateStateCode(SQLServerConnection con, int errNum, Integer dat return "S0002"; // table not found case 1205: return "40001"; // deadlock detected - case 2627: - return "23000"; // DPM 4.04. Primary key violation default: { String dbState = databaseState.toString(); /* diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerMSAL4JUtils.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerMSAL4JUtils.java index 5ec6d09d65..cf2b8d6b65 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerMSAL4JUtils.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerMSAL4JUtils.java @@ -41,6 +41,7 @@ class SQLServerMSAL4JUtils { static final String REDIRECTURI = "http://localhost"; static final String SLASH_DEFAULT = "/.default"; + static final String ACCESS_TOKEN_EXPIRE = " Access token expires on the following date: "; private static final java.util.logging.Logger logger = java.util.logging.Logger .getLogger("com.microsoft.sqlserver.jdbc.SQLServerMSAL4JUtils"); @@ -60,8 +61,7 @@ static SqlAuthenticationToken getSqlFedAuthToken(SqlFedAuthInfo fedAuthInfo, Str final IAuthenticationResult authenticationResult = future.get(); if (logger.isLoggable(Level.FINEST)) { - logger.finest(logger.toString() + " Access token expires on the following date: " - + authenticationResult.expiresOnDate()); + logger.finest(logger.toString() + ACCESS_TOKEN_EXPIRE + authenticationResult.expiresOnDate()); } return new SqlAuthenticationToken(authenticationResult.accessToken(), authenticationResult.expiresOnDate()); @@ -95,8 +95,7 @@ static SqlAuthenticationToken getSqlFedAuthTokenPrincipal(SqlFedAuthInfo fedAuth final IAuthenticationResult authenticationResult = future.get(); if (logger.isLoggable(Level.FINEST)) { - logger.finest(logger.toString() + " Access token expires on the following date: " - + authenticationResult.expiresOnDate()); + logger.finest(logger.toString() + ACCESS_TOKEN_EXPIRE + authenticationResult.expiresOnDate()); } return new SqlAuthenticationToken(authenticationResult.accessToken(), authenticationResult.expiresOnDate()); @@ -138,8 +137,7 @@ static SqlAuthenticationToken getSqlFedAuthTokenIntegrated(SqlFedAuthInfo fedAut final IAuthenticationResult authenticationResult = future.get(); if (logger.isLoggable(Level.FINEST)) { - logger.finest(logger.toString() + " Access token expires on the following date: " - + authenticationResult.expiresOnDate()); + logger.finest(logger.toString() + ACCESS_TOKEN_EXPIRE + authenticationResult.expiresOnDate()); } return new SqlAuthenticationToken(authenticationResult.accessToken(), authenticationResult.expiresOnDate()); @@ -204,8 +202,7 @@ static SqlAuthenticationToken getSqlFedAuthTokenInteractive(SqlFedAuthInfo fedAu } if (logger.isLoggable(Level.FINEST)) { - logger.finest(logger.toString() + " Access token expires on the following date: " - + authenticationResult.expiresOnDate()); + logger.finest(logger.toString() + ACCESS_TOKEN_EXPIRE + authenticationResult.expiresOnDate()); } return new SqlAuthenticationToken(authenticationResult.accessToken(), authenticationResult.expiresOnDate()); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerNoneEnclaveProvider.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerNoneEnclaveProvider.java index 4bdabb93f8..cb20073b51 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerNoneEnclaveProvider.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerNoneEnclaveProvider.java @@ -33,7 +33,9 @@ public class SQLServerNoneEnclaveProvider implements ISQLServerEnclaveProvider { /** * default constructor */ - public SQLServerNoneEnclaveProvider() {} + public SQLServerNoneEnclaveProvider() { + // default constructor + } @Override public void getAttestationParameters(String url) throws SQLServerException { diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index 29afa5a575..af0b0dcfec 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -57,6 +57,8 @@ public class SQLServerPreparedStatement extends SQLServerStatement implements IS private static final int BATCH_STATEMENT_DELIMITER_TDS_71 = 0x80; private static final int BATCH_STATEMENT_DELIMITER_TDS_72 = 0xFF; + private static final String EXECUTE_BATCH_STRING_ = "executeBatch"; + /** batch statement delimiter */ final int nBatchStatementDelimiter = BATCH_STATEMENT_DELIMITER_TDS_72; @@ -986,7 +988,7 @@ private void getParameterEncryptionMetadata(Parameter[] params) throws SQLServer } SQLServerEncryptionType encType = SQLServerEncryptionType.of((byte) secondRs .getInt(DescribeParameterEncryptionResultSet2.COLUMNENCRYPTIONTYPE.value())); - if (SQLServerEncryptionType.PlainText != encType) { + if (SQLServerEncryptionType.PLAINTEXT != encType) { params[paramIndex].cryptoMeta = new CryptoMetadata(cekEntry, (short) cekOrdinal, (byte) secondRs.getInt( DescribeParameterEncryptionResultSet2.COLUMNENCRYPTIONALGORITHM.value()), @@ -2035,7 +2037,7 @@ public final void clearBatch() throws SQLServerException { @Override public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQLTimeoutException { - loggerExternal.entering(getClassNameLogging(), "executeBatch"); + loggerExternal.entering(getClassNameLogging(), EXECUTE_BATCH_STRING_); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); } @@ -2051,7 +2053,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL if (this.useBulkCopyForBatchInsert && isInsert(localUserSQL)) { if (null == batchParamValues) { updateCounts = new int[0]; - loggerExternal.exiting(getClassNameLogging(), "executeBatch", updateCounts); + loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING_, updateCounts); return updateCounts; } @@ -2069,7 +2071,8 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL for (Parameter paramValue : paramValues) { if (paramValue.isOutput()) { throw new BatchUpdateException( - SQLServerException.getErrString("R_outParamsNotPermittedinBatch"), null, 0, null); + SQLServerException.getErrString("R_outParamsNotPermittedinBatch"), null, 0, + null); } } } @@ -2098,8 +2101,8 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL } } - SQLServerBulkBatchInsertRecord batchRecord = new SQLServerBulkBatchInsertRecord(batchParamValues, - columnList, valueList, null); + SQLServerBulkBatchInsertRecord batchRecord = new SQLServerBulkBatchInsertRecord( + batchParamValues, columnList, valueList, null); for (int i = 1; i <= rs.getColumnCount(); i++) { Column c = rs.getColumn(i); @@ -2112,7 +2115,8 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL } else { jdbctype = ti.getSSType().getJDBCType().getIntValue(); } - batchRecord.addColumnMetadata(i, c.getColumnName(), jdbctype, ti.getPrecision(), ti.getScale()); + batchRecord.addColumnMetadata(i, c.getColumnName(), jdbctype, ti.getPrecision(), + ti.getScale()); } SQLServerBulkCopy bcOperation = new SQLServerBulkCopy(connection); @@ -2129,7 +2133,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL updateCounts[i] = 1; } - loggerExternal.exiting(getClassNameLogging(), "executeBatch", updateCounts); + loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING_, updateCounts); return updateCounts; } } @@ -2183,7 +2187,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL } } - loggerExternal.exiting(getClassNameLogging(), "executeBatch", updateCounts); + loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING_, updateCounts); return updateCounts; } finally { batchParamValues = null; @@ -2226,7 +2230,8 @@ public long[] executeLargeBatch() throws SQLServerException, BatchUpdateExceptio for (Parameter paramValue : paramValues) { if (paramValue.isOutput()) { throw new BatchUpdateException( - SQLServerException.getErrString("R_outParamsNotPermittedinBatch"), null, 0, null); + SQLServerException.getErrString("R_outParamsNotPermittedinBatch"), null, 0, + null); } } } @@ -2255,8 +2260,8 @@ public long[] executeLargeBatch() throws SQLServerException, BatchUpdateExceptio } } - SQLServerBulkBatchInsertRecord batchRecord = new SQLServerBulkBatchInsertRecord(batchParamValues, - columnList, valueList, null); + SQLServerBulkBatchInsertRecord batchRecord = new SQLServerBulkBatchInsertRecord( + batchParamValues, columnList, valueList, null); for (int i = 1; i <= rs.getColumnCount(); i++) { Column c = rs.getColumn(i); @@ -2269,7 +2274,8 @@ public long[] executeLargeBatch() throws SQLServerException, BatchUpdateExceptio } else { jdbctype = ti.getSSType().getJDBCType().getIntValue(); } - batchRecord.addColumnMetadata(i, c.getColumnName(), jdbctype, ti.getPrecision(), ti.getScale()); + batchRecord.addColumnMetadata(i, c.getColumnName(), jdbctype, ti.getPrecision(), + ti.getScale()); } SQLServerBulkCopy bcOperation = new SQLServerBulkCopy(connection); @@ -2409,7 +2415,7 @@ private void checkAdditionalQuery() { } private String parseUserSQLForTableNameDW(boolean hasInsertBeenFound, boolean hasIntoBeenFound, - boolean hasTableBeenFound, boolean isExpectingTableName) { + boolean hasTableBeenFound, boolean isExpectingTableName) throws SQLServerException { // As far as finding the table name goes, There are two cases: // Insert into and Insert // And there could be in-line comments (with /* and */) in between. @@ -2461,7 +2467,9 @@ private String parseUserSQLForTableNameDW(boolean hasInsertBeenFound, boolean ha // ] has not been found, this is wrong. if (tempint < 0) { - throw new IllegalArgumentException("Invalid SQL Query."); + MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_InvalidSqlQuery")); + Object[] msgArgs = {localUserSQL}; + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), null, false); } // keep checking if it's escaped @@ -2482,7 +2490,9 @@ private String parseUserSQLForTableNameDW(boolean hasInsertBeenFound, boolean ha // \" has not been found, this is wrong. if (tempint < 0) { - throw new IllegalArgumentException("Invalid SQL Query."); + MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_InvalidSqlQuery")); + Object[] msgArgs = {localUserSQL}; + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), null, false); } // keep checking if it's escaped @@ -2513,10 +2523,13 @@ private String parseUserSQLForTableNameDW(boolean hasInsertBeenFound, boolean ha } // It shouldn't come here. If we did, something is wrong. - throw new IllegalArgumentException("Invalid SQL Query."); + MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_InvalidSqlQuery")); + Object[] msgArgs = {localUserSQL}; + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), null, false); + return ""; } - private ArrayList parseUserSQLForColumnListDW() { + private ArrayList parseUserSQLForColumnListDW() throws SQLServerException { // ignore all comments while (checkAndRemoveCommentsAndSpace(false)) {} @@ -2529,7 +2542,8 @@ private ArrayList parseUserSQLForColumnListDW() { return null; } - private ArrayList parseUserSQLForColumnListDWHelper(ArrayList listOfColumns) { + private ArrayList parseUserSQLForColumnListDWHelper( + ArrayList listOfColumns) throws SQLServerException { // ignore all comments while (checkAndRemoveCommentsAndSpace(false)) {} @@ -2556,7 +2570,9 @@ private ArrayList parseUserSQLForColumnListDWHelper(ArrayList li // ] has not been found, this is wrong. if (tempint < 0) { - throw new IllegalArgumentException("Invalid SQL Query."); + MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_InvalidSqlQuery")); + Object[] msgArgs = {localUserSQL}; + SQLServerException.makeFromDriverError(connection, this, form.format(msgArgs), null, false); } // keep checking if it's escaped diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java index 420905d8a5..96bd184792 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java @@ -516,7 +516,8 @@ protected Object[][] getContents() { {"R_SecureStringInitFailed", "Failed to initialize SecureStringUtil to store secure strings"}, {"R_ALPNFailed", "Failed to negotiate Application-Layer Protocol {0}. Server returned: {1}."}, {"R_serverError", "An error occurred during the current command (Done status {0}). {1}"}, - {"R_ManagedIdentityTokenAcquisitionFail", "Failed to acquire managed identity token. Request for the token succeeded, but no token was returned. The token is null."} + {"R_ManagedIdentityTokenAcquisitionFail", "Failed to acquire managed identity token. Request for the token succeeded, but no token was returned. The token is null."}, + {"R_InvalidSqlQuery", "Invalid SQL Query: {0}"} }; } // @formatter:on diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerSecurityUtility.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerSecurityUtility.java index 1fde31b085..1ac2b9acd6 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerSecurityUtility.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerSecurityUtility.java @@ -199,7 +199,7 @@ private static String ValidateAndGetEncryptionAlgorithmName(byte cipherAlgorithm throw new SQLServerException(null, SQLServerException.getErrString("R_CustomCipherAlgorithmNotSupportedAE"), null, 0, false); } - return SQLServerAeadAes256CbcHmac256Algorithm.algorithmName; + return SQLServerAeadAes256CbcHmac256Algorithm.AEAD_AES_256_CBC_HMAC_SHA256; } /** From 69870f508527f167db5afccaeb662c9dca63df9d Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 17:17:47 -0800 Subject: [PATCH 05/13] fixed test fail --- .../microsoft/sqlserver/jdbc/IOBuffer.java | 5 ++- .../sqlserver/jdbc/ISQLServerDataSource.java | 2 +- .../microsoft/sqlserver/jdbc/Parameter.java | 4 +- .../jdbc/SQLServerDatabaseMetaData.java | 45 ++++++++++--------- .../jdbc/SQLServerPreparedStatement.java | 28 ++++++------ .../sqlserver/jdbc/SQLServerResultSet.java | 20 +++++---- .../sqlserver/jdbc/SQLServerStatement.java | 24 +++++----- 7 files changed, 68 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index f760f73d96..c690f5d8de 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -3495,10 +3495,11 @@ void writeByte(byte value) throws SQLServerException { if (stagingBuffer.remaining() >= 1) { stagingBuffer.put(value); if (tdsChannel.isLoggingPackets()) { - if (dataIsLoggable) + if (dataIsLoggable) { logBuffer.put(value); - else + } else { logBuffer.position(logBuffer.position() + 1); + } } } else { valueBytes[0] = value; diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java index f03e0888dc..63ef16c138 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerDataSource.java @@ -798,7 +798,7 @@ public interface ISQLServerDataSource extends javax.sql.CommonDataSource { /** * Returns the login configuration file for Kerberos authentication. - * * + * * * @return login configuration file name * @deprecated Use {@link ISQLServerDataSource#getJAASConfigurationName()} instead diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java index 6bcbc0f5b0..8fc44c3def 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java @@ -271,8 +271,8 @@ void setValue(JDBCType jdbcType, Object value, JavaType javaType, StreamSetterAr // otherwise it would be sent as smallint // Also, for setters, we are able to send tinyint to smallint // However, for output parameter, it might cause error. - if (!isOutput() && (JavaType.SHORT == javaType) - && ((JDBCType.TINYINT == jdbcType) || (JDBCType.SMALLINT == jdbcType))) { + if (!isOutput() && ((JavaType.SHORT == javaType) + && (JDBCType.TINYINT == jdbcType || JDBCType.SMALLINT == jdbcType))) { // value falls in the TINYINT range if (((Short) value) >= 0 && ((Short) value) <= 255) { value = ((Short) value).byteValue(); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java index e4e9ac0539..bc6c8be360 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java @@ -273,6 +273,7 @@ private void checkClosed() throws SQLServerException { private static final String SELECT = "SELECT"; private static final String WHERE = " WHERE "; private static final String WHERE_CLAUSE = " WHERE 0 = 1"; + private static final String ACTIVITY_ID = " ActivityId: "; private static final String SQL_KEYWORDS = createSqlKeyWords(); @@ -479,7 +480,7 @@ public boolean supportsSharding() throws SQLException { @Override public java.sql.ResultSet getCatalogs() throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); // Return the original case instead of CAPS.removed Upper(). @@ -512,7 +513,7 @@ public String getCatalogTerm() throws SQLServerException { public java.sql.ResultSet getColumnPrivileges(String catalog, String schema, String table, String col) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); // column_privileges supports columns being escaped. @@ -538,7 +539,7 @@ public java.sql.ResultSet getColumnPrivileges(String catalog, String schema, Str public java.sql.ResultSet getTables(String catalog, String schema, String table, String types[]) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -632,7 +633,7 @@ private static String EscapeIDName(String inID) throws SQLServerException { @Override public java.sql.ResultSet getColumns(String catalog, String schema, String table, String col) throws SQLException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); String originalCatalog = switchCatalogs(catalog); @@ -931,7 +932,7 @@ public java.sql.ResultSet getClientInfoProperties() throws SQLException { public java.sql.ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); /* @@ -969,7 +970,7 @@ public java.sql.ResultSet getBestRowIdentifier(String catalog, String schema, St public java.sql.ResultSet getCrossReference(String cat1, String schem1, String tab1, String cat2, String schem2, String tab2) throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -1155,7 +1156,7 @@ private ResultSet executeSPFkeys(String[] procParams) throws SQLException, SQLTi public java.sql.ResultSet getIndexInfo(String cat, String schema, String table, boolean unique, boolean approximate) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); /* @@ -1338,7 +1339,7 @@ public String getNumericFunctions() throws SQLServerException { public java.sql.ResultSet getPrimaryKeys(String cat, String schema, String table) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); /* @@ -1361,7 +1362,7 @@ public java.sql.ResultSet getPrimaryKeys(String cat, String schema, public java.sql.ResultSet getProcedureColumns(String catalog, String schema, String proc, String col) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); /* @@ -1405,7 +1406,7 @@ public java.sql.ResultSet getProcedureColumns(String catalog, String schema, Str public java.sql.ResultSet getProcedures(String catalog, String schema, String proc) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -1431,7 +1432,7 @@ public String getProcedureTerm() throws SQLServerException { public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -1458,7 +1459,7 @@ public ResultSet getPseudoColumns(String catalog, String schemaPattern, String t @Override public java.sql.ResultSet getSchemas() throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); return getSchemasInternal(null, null); @@ -1538,7 +1539,7 @@ private java.sql.ResultSet getSchemasInternal(String catalog, @Override public java.sql.ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } return getSchemasInternal(catalog, schemaPattern); } @@ -1604,7 +1605,7 @@ public String getSystemFunctions() throws SQLServerException { public java.sql.ResultSet getTablePrivileges(String catalog, String schema, String table) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); table = EscapeIDName(table); @@ -1625,7 +1626,7 @@ public java.sql.ResultSet getTablePrivileges(String catalog, String schema, @Override public java.sql.ResultSet getTableTypes() throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); String s = "SELECT 'VIEW' 'TABLE_TYPE' UNION SELECT 'TABLE' UNION SELECT 'SYSTEM TABLE'"; @@ -1642,7 +1643,7 @@ public String getTimeDateFunctions() throws SQLServerException { @Override public java.sql.ResultSet getTypeInfo() throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -1728,7 +1729,7 @@ public String getURL() throws SQLServerException { @Override public String getUserName() throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); String result = ""; @@ -1750,7 +1751,7 @@ public String getUserName() throws SQLServerException, SQLTimeoutException { public java.sql.ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLServerException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); /* @@ -2389,7 +2390,7 @@ public boolean supportsBatchUpdates() throws SQLServerException { public java.sql.ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); return getResultSetFromInternalQueries(catalog, SELECT + @@ -2491,7 +2492,7 @@ public boolean supportsResultSetHoldability(int holdability) throws SQLServerExc public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); return getResultSetFromInternalQueries(catalog, SELECT + @@ -2522,7 +2523,7 @@ public ResultSet getAttributes(String catalog, String schemaPattern, String type public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); return getResultSetFromInternalQueries(catalog, SELECT + @@ -2536,7 +2537,7 @@ public ResultSet getSuperTables(String catalog, String schemaPattern, public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException, SQLTimeoutException { if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); return getResultSetFromInternalQueries(catalog, SELECT + diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index af0b0dcfec..ad666d7d99 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -57,7 +57,8 @@ public class SQLServerPreparedStatement extends SQLServerStatement implements IS private static final int BATCH_STATEMENT_DELIMITER_TDS_71 = 0x80; private static final int BATCH_STATEMENT_DELIMITER_TDS_72 = 0xFF; - private static final String EXECUTE_BATCH_STRING_ = "executeBatch"; + private static final String EXECUTE_BATCH_STRING = "executeBatch"; + private static final String ACTIVITY_ID = " ActivityId: "; /** batch statement delimiter */ final int nBatchStatementDelimiter = BATCH_STATEMENT_DELIMITER_TDS_72; @@ -455,7 +456,7 @@ private String buildParamTypeDefinitions(Parameter[] params, boolean renewDefini public java.sql.ResultSet executeQuery() throws SQLServerException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "executeQuery"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); executeStatement(new PrepStmtExecCmd(this, EXECUTE_QUERY)); @@ -480,7 +481,7 @@ final java.sql.ResultSet executeQueryInternal() throws SQLServerException, SQLTi public int executeUpdate() throws SQLServerException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "executeUpdate"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); @@ -502,7 +503,7 @@ public long executeLargeUpdate() throws SQLServerException, SQLTimeoutException loggerExternal.entering(getClassNameLogging(), "executeLargeUpdate"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); executeStatement(new PrepStmtExecCmd(this, EXECUTE_UPDATE)); @@ -514,7 +515,7 @@ public long executeLargeUpdate() throws SQLServerException, SQLTimeoutException public boolean execute() throws SQLServerException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "execute"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); executeStatement(new PrepStmtExecCmd(this, EXECUTE)); @@ -530,6 +531,7 @@ private final class PrepStmtExecCmd extends TDSCommand { * Always update serialVersionUID when prompted. */ private static final long serialVersionUID = 4098801171124750861L; + private final SQLServerPreparedStatement stmt; PrepStmtExecCmd(SQLServerPreparedStatement stmt, int executeMethod) { @@ -565,7 +567,7 @@ final void doExecutePreparedStatement(PrepStmtExecCmd command) throws SQLServerE setMaxRowsAndMaxFieldSize(); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } boolean hasExistingTypeDefinitions = preparedTypeDefinitions != null; @@ -2037,9 +2039,9 @@ public final void clearBatch() throws SQLServerException { @Override public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQLTimeoutException { - loggerExternal.entering(getClassNameLogging(), EXECUTE_BATCH_STRING_); + loggerExternal.entering(getClassNameLogging(), EXECUTE_BATCH_STRING); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); discardLastExecutionResults(); @@ -2053,7 +2055,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL if (this.useBulkCopyForBatchInsert && isInsert(localUserSQL)) { if (null == batchParamValues) { updateCounts = new int[0]; - loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING_, updateCounts); + loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING, updateCounts); return updateCounts; } @@ -2133,7 +2135,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL updateCounts[i] = 1; } - loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING_, updateCounts); + loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING, updateCounts); return updateCounts; } } @@ -2187,7 +2189,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL } } - loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING_, updateCounts); + loggerExternal.exiting(getClassNameLogging(), EXECUTE_BATCH_STRING, updateCounts); return updateCounts; } finally { batchParamValues = null; @@ -2198,7 +2200,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL public long[] executeLargeBatch() throws SQLServerException, BatchUpdateException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "executeLargeBatch"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); discardLastExecutionResults(); @@ -2817,7 +2819,7 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th connection.setMaxRows(0); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } // Create the parameter array that we'll use for all the items in this batch. Parameter[] batchParam = new Parameter[inOutParam.length]; diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java index fabe23081f..c50143eaf4 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java @@ -58,6 +58,8 @@ public class SQLServerResultSet implements ISQLServerResultSet, java.io.Serializ /** Generate the statement's logging ID */ private static final AtomicInteger lastResultSetID = new AtomicInteger(0); + private static final String ACTIVITY_ID = " ActivityId: "; + /** trace ID */ private final String traceID; @@ -652,7 +654,7 @@ private void closeInternal() { public void close() throws SQLServerException { loggerExternal.entering(getClassNameLogging(), "close"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } closeInternal(); loggerExternal.exiting(getClassNameLogging(), "close"); @@ -1006,7 +1008,7 @@ private void updateCurrentRow(int rowsToMove) { public boolean next() throws SQLServerException { loggerExternal.entering(getClassNameLogging(), "next"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } if (logger.isLoggable(java.util.logging.Level.FINER)) logger.finer(toString() + logCursorState()); @@ -1332,7 +1334,7 @@ public boolean isLast() throws SQLException { public void beforeFirst() throws SQLException { loggerExternal.entering(getClassNameLogging(), "beforeFirst"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } if (logger.isLoggable(java.util.logging.Level.FINER)) logger.finer(toString() + logCursorState()); @@ -1363,7 +1365,7 @@ private void moveBeforeFirst() throws SQLServerException { public void afterLast() throws SQLException { loggerExternal.entering(getClassNameLogging(), "afterLast"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } if (logger.isLoggable(java.util.logging.Level.FINER)) @@ -1587,7 +1589,7 @@ public int getRow() throws SQLException { public boolean absolute(int row) throws SQLException { loggerExternal.entering(getClassNameLogging(), "absolute"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } if (logger.isLoggable(java.util.logging.Level.FINER)) logger.finer(toString() + " row:" + row + logCursorState()); @@ -4682,7 +4684,7 @@ public int getHoldability() throws SQLException { public void insertRow() throws SQLException { loggerExternal.entering(getClassNameLogging(), "insertRow"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } final class InsertRowRPC extends TDSCommand { @@ -4790,7 +4792,7 @@ private void doInsertRowRPC(TDSCommand command, String tableName) throws SQLServ public void updateRow() throws SQLException { loggerExternal.entering(getClassNameLogging(), "updateRow"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } final class UpdateRowRPC extends TDSCommand { /** @@ -4876,7 +4878,7 @@ final boolean hasUpdatedColumns() { public void deleteRow() throws SQLException { loggerExternal.entering(getClassNameLogging(), "deleteRow"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } final class DeleteRowRPC extends TDSCommand { /** @@ -4941,7 +4943,7 @@ private void doDeleteRowRPC(TDSCommand command) throws SQLServerException { public void refreshRow() throws SQLException { loggerExternal.entering(getClassNameLogging(), "refreshRow"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } if (logger.isLoggable(java.util.logging.Level.FINER)) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerStatement.java index 7fd08711dc..85a5986bb3 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerStatement.java @@ -61,6 +61,8 @@ public class SQLServerStatement implements ISQLServerStatement { final static char LEFT_CURLY_BRACKET = 123; final static char RIGHT_CURLY_BRACKET = 125; + private static final String ACTIVITY_ID = " ActivityId: "; + /** response buffer adaptive flag */ private boolean isResponseBufferingAdaptive = false; @@ -730,7 +732,7 @@ public void closeOnCompletion() throws SQLException { public java.sql.ResultSet executeQuery(String sql) throws SQLServerException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "executeQuery", sql); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); executeStatement(new StmtExecCmd(this, sql, EXECUTE_QUERY, NO_GENERATED_KEYS)); @@ -748,7 +750,7 @@ final SQLServerResultSet executeQueryInternal(String sql) throws SQLServerExcept public int executeUpdate(String sql) throws SQLServerException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "executeUpdate", sql); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); executeStatement(new StmtExecCmd(this, sql, EXECUTE_UPDATE, NO_GENERATED_KEYS)); @@ -768,7 +770,7 @@ public long executeLargeUpdate(String sql) throws SQLServerException, SQLTimeout loggerExternal.entering(getClassNameLogging(), "executeLargeUpdate", sql); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); executeStatement(new StmtExecCmd(this, sql, EXECUTE_UPDATE, NO_GENERATED_KEYS)); @@ -781,7 +783,7 @@ public long executeLargeUpdate(String sql) throws SQLServerException, SQLTimeout public boolean execute(String sql) throws SQLServerException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "execute", sql); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); executeStatement(new StmtExecCmd(this, sql, EXECUTE, NO_GENERATED_KEYS)); @@ -884,7 +886,7 @@ final void doExecuteStatement(StmtExecCmd execCmd) throws SQLServerException { setMaxRowsAndMaxFieldSize(); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } if (isCursorable(executeMethod) && isSelect(sql)) { if (stmtlogger.isLoggable(java.util.logging.Level.FINE)) @@ -974,7 +976,7 @@ private void doExecuteStatementBatch(StmtBatchExecCmd execCmd) throws SQLServerE } if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } // Batch execution is always non-cursored @@ -1836,7 +1838,7 @@ public void clearBatch() throws SQLServerException { public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQLTimeoutException { loggerExternal.entering(getClassNameLogging(), "executeBatch"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); discardLastExecutionResults(); @@ -1913,7 +1915,7 @@ public long[] executeLargeBatch() throws SQLServerException, BatchUpdateExceptio loggerExternal.entering(getClassNameLogging(), "executeLargeBatch"); if (loggerExternal.isLoggable(Level.FINER) && Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); discardLastExecutionResults(); @@ -2100,7 +2102,7 @@ public final boolean execute(java.lang.String sql, if (loggerExternal.isLoggable(java.util.logging.Level.FINER)) { loggerExternal.entering(getClassNameLogging(), "execute", new Object[] {sql, autoGeneratedKeys}); if (Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } } checkClosed(); @@ -2150,7 +2152,7 @@ public final int executeUpdate(String sql, int autoGeneratedKeys) throws SQLServ if (loggerExternal.isLoggable(java.util.logging.Level.FINER)) { loggerExternal.entering(getClassNameLogging(), "executeUpdate", new Object[] {sql, autoGeneratedKeys}); if (Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } } checkClosed(); @@ -2178,7 +2180,7 @@ public final long executeLargeUpdate(String sql, if (loggerExternal.isLoggable(java.util.logging.Level.FINER)) { loggerExternal.entering(getClassNameLogging(), "executeLargeUpdate", new Object[] {sql, autoGeneratedKeys}); if (Util.isActivityTraceOn()) { - loggerExternal.finer(toString() + " ActivityId: " + ActivityCorrelator.getNext().toString()); + loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } } checkClosed(); From f9a6d48f1896a6da7094caa89113dcc5fb781fdc Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 17:44:19 -0800 Subject: [PATCH 06/13] fixed --- src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java index 8fc44c3def..b33021ff66 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java @@ -272,7 +272,7 @@ void setValue(JDBCType jdbcType, Object value, JavaType javaType, StreamSetterAr // Also, for setters, we are able to send tinyint to smallint // However, for output parameter, it might cause error. if (!isOutput() && ((JavaType.SHORT == javaType) - && (JDBCType.TINYINT == jdbcType || JDBCType.SMALLINT == jdbcType))) { + && ((JDBCType.TINYINT == jdbcType) || (JDBCType.SMALLINT == jdbcType)))) { // value falls in the TINYINT range if (((Short) value) >= 0 && ((Short) value) <= 255) { value = ((Short) value).byteValue(); From ce5ea389e4247fa6f3eb3ef9b1a58b5e618353e1 Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 18:23:16 -0800 Subject: [PATCH 07/13] revert ByteBuffer cast --- .../microsoft/sqlserver/jdbc/IOBuffer.java | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index c690f5d8de..f0798ac36b 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -26,6 +26,7 @@ import java.net.SocketAddress; import java.net.SocketException; import java.net.SocketTimeoutException; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.SelectionKey; @@ -3455,8 +3456,8 @@ void startMessage(TDSCommand command, byte tdsMessageType) throws SQLServerExcep streamByteBuffer = new byte[4 * currentPacketSize]; } - socketBuffer.position(socketBuffer.limit()); - stagingBuffer.clear(); + ((Buffer) socketBuffer).position(((Buffer) socketBuffer).limit()); + ((Buffer) stagingBuffer).clear(); preparePacket(); writeMessageHeader(); @@ -3495,11 +3496,10 @@ void writeByte(byte value) throws SQLServerException { if (stagingBuffer.remaining() >= 1) { stagingBuffer.put(value); if (tdsChannel.isLoggingPackets()) { - if (dataIsLoggable) { + if (dataIsLoggable) logBuffer.put(value); - } else { - logBuffer.position(logBuffer.position() + 1); - } + else + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 1); } } else { valueBytes[0] = value; @@ -3525,7 +3525,7 @@ void writeChar(char value) throws SQLServerException { if (dataIsLoggable) logBuffer.putChar(value); else - logBuffer.position(logBuffer.position() + 2); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 2); } } else { Util.writeShort((short) value, valueBytes, 0); @@ -3540,7 +3540,7 @@ void writeShort(short value) throws SQLServerException { if (dataIsLoggable) logBuffer.putShort(value); else - logBuffer.position(logBuffer.position() + 2); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 2); } } else { Util.writeShort(value, valueBytes, 0); @@ -3555,7 +3555,7 @@ void writeInt(int value) throws SQLServerException { if (dataIsLoggable) logBuffer.putInt(value); else - logBuffer.position(logBuffer.position() + 4); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 4); } } else { Util.writeInt(value, valueBytes, 0); @@ -3586,7 +3586,7 @@ void writeDouble(double value) throws SQLServerException { if (dataIsLoggable) logBuffer.putDouble(value); else - logBuffer.position(logBuffer.position() + 8); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 8); } } else { long bits = Double.doubleToLongBits(value); @@ -4059,7 +4059,7 @@ void writeLong(long value) throws SQLServerException { if (dataIsLoggable) logBuffer.putLong(value); else - logBuffer.position(logBuffer.position() + 8); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + 8); } } else { Util.writeLong(value, valueBytes, 0); @@ -4093,7 +4093,7 @@ void writeBytes(byte[] value, int offset, int length) throws SQLServerException if (dataIsLoggable) logBuffer.put(value, offset + bytesWritten, bytesToWrite); else - logBuffer.position(logBuffer.position() + bytesToWrite); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + bytesToWrite); } bytesWritten += bytesToWrite; @@ -4119,7 +4119,7 @@ void writeWrappedBytes(byte[] value, int valueLength) throws SQLServerException if (dataIsLoggable) logBuffer.put(value, 0, remaining); else - logBuffer.position(logBuffer.position() + remaining); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + remaining); } } @@ -4132,7 +4132,7 @@ void writeWrappedBytes(byte[] value, int valueLength) throws SQLServerException if (dataIsLoggable) logBuffer.put(value, remaining, valueLength - remaining); else - logBuffer.position(logBuffer.position() + remaining); + ((Buffer) logBuffer).position(((Buffer) logBuffer).position() + remaining); } } @@ -4456,7 +4456,7 @@ private void writePacket(int tdsMessageStatus) throws SQLServerException { } private void writePacketHeader(int tdsMessageStatus) { - int tdsMessageLength = stagingBuffer.position(); + int tdsMessageLength = ((Buffer) stagingBuffer).position(); ++packetNum; // Write the TDS packet header back at the start of the staging buffer @@ -4494,13 +4494,13 @@ private void writePacketHeader(int tdsMessageStatus) { void flush(boolean atEOM) throws SQLServerException { // First, flush any data left in the socket buffer. - tdsChannel.write(socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining()); - socketBuffer.position(socketBuffer.limit()); + tdsChannel.write(socketBuffer.array(), ((Buffer) socketBuffer).position(), socketBuffer.remaining()); + ((Buffer) socketBuffer).position(((Buffer) socketBuffer).limit()); // If there is data in the staging buffer that needs to be written // to the socket, the socket buffer is now empty, so swap buffers // and start writing data from the staging buffer. - if (stagingBuffer.position() >= TDS_PACKET_HEADER_SIZE) { + if (((Buffer) stagingBuffer).position() >= TDS_PACKET_HEADER_SIZE) { // Swap the packet buffers ... ByteBuffer swapBuffer = stagingBuffer; stagingBuffer = socketBuffer; @@ -4512,14 +4512,14 @@ void flush(boolean atEOM) throws SQLServerException { // We need to use flip() rather than rewind() here so that // the socket buffer's limit is properly set for the last // packet, which may be shorter than the other packets. - socketBuffer.flip(); - stagingBuffer.clear(); + ((Buffer) socketBuffer).flip(); + ((Buffer) stagingBuffer).clear(); // If we are logging TDS packets then log the packet we're about // to send over the wire now. if (tdsChannel.isLoggingPackets()) { - tdsChannel.logPacket(logBuffer.array(), 0, socketBuffer.limit(), - this.toString() + " sending packet (" + socketBuffer.limit() + " bytes)"); + tdsChannel.logPacket(logBuffer.array(), 0, ((Buffer) socketBuffer).limit(), + this.toString() + " sending packet (" + ((Buffer) socketBuffer).limit() + " bytes)"); } // Prepare for the next packet @@ -4527,8 +4527,8 @@ void flush(boolean atEOM) throws SQLServerException { preparePacket(); // Finally, start sending data from the new socket buffer. - tdsChannel.write(socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining()); - socketBuffer.position(socketBuffer.limit()); + tdsChannel.write(socketBuffer.array(), ((Buffer) socketBuffer).position(), socketBuffer.remaining()); + ((Buffer) socketBuffer).position(((Buffer) socketBuffer).limit()); } } @@ -4940,7 +4940,7 @@ void writeTVPRows(TVP value) throws SQLServerException { if (con.equals(src_stmt.getConnection()) && 0 != resultSetServerCursorId) { cachedTVPHeaders = ByteBuffer.allocate(stagingBuffer.capacity()).order(stagingBuffer.order()); - cachedTVPHeaders.put(stagingBuffer.array(), 0, stagingBuffer.position()); + cachedTVPHeaders.put(stagingBuffer.array(), 0, ((Buffer) stagingBuffer).position()); cachedCommand = this.command; @@ -4965,9 +4965,9 @@ void writeTVPRows(TVP value) throws SQLServerException { if (tdsWritterCached) { command = cachedCommand; - stagingBuffer.clear(); - logBuffer.clear(); - writeBytes(cachedTVPHeaders.array(), 0, cachedTVPHeaders.position()); + ((Buffer) stagingBuffer).clear(); + ((Buffer) logBuffer).clear(); + writeBytes(cachedTVPHeaders.array(), 0, ((Buffer) cachedTVPHeaders).position()); } Object[] rowData = value.getRowData(); From 0380f98b8cb85f0488fa0110d7a126302230842b Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 18:44:49 -0800 Subject: [PATCH 08/13] missed 1 --- src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index f0798ac36b..c27d06d62f 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -3379,7 +3379,7 @@ boolean checkIfTdsMessageTypeIsBatchOrRPC() { void preparePacket() throws SQLServerException { if (tdsChannel.isLoggingPackets()) { Arrays.fill(logBuffer.array(), (byte) 0xFE); - logBuffer.clear(); + ((Buffer) logBuffer).clear(); } // Write a placeholder packet header. This will be replaced From de79c58520b9e2fd4411cf8cb9f8ca84a568ba0a Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 20:18:18 -0800 Subject: [PATCH 09/13] typo --- src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java index b33021ff66..1647f52164 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java @@ -521,13 +521,12 @@ private void setTypeDefinition(DTV dtv) { } if (isOutput()) { - param.typeDefinition = SSType.DECIMAL.toString() + "SSType.DECIMAL.toString()(" + param.typeDefinition = SSType.DECIMAL.toString() + "(" + SQLServerConnection.maxDecimalPrecision + ", " + scale + ")"; } if (userProvidesPrecision) { - param.typeDefinition = SSType.DECIMAL.toString() + "SSType.DECIMAL.toString()(" - + valueLength + "," + scale + ")"; + param.typeDefinition = SSType.DECIMAL.toString() + "(" + valueLength + "," + scale + ")"; } } else param.typeDefinition = SSType.DECIMAL.toString() + "(" + SQLServerConnection.maxDecimalPrecision From 13f81946c789bd47450fb70be0eeb1fcb629d8b3 Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 23:19:08 -0800 Subject: [PATCH 10/13] more --- .../com/microsoft/sqlserver/jdbc/IOBuffer.java | 2 +- .../sqlserver/jdbc/SQLServerBulkCopy.java | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index c27d06d62f..f0798ac36b 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -3379,7 +3379,7 @@ boolean checkIfTdsMessageTypeIsBatchOrRPC() { void preparePacket() throws SQLServerException { if (tdsChannel.isLoggingPackets()) { Arrays.fill(logBuffer.array(), (byte) 0xFE); - ((Buffer) logBuffer).clear(); + logBuffer.clear(); } // Write a placeholder packet header. This will be replaced diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java index d8facaa093..d1c13a1562 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkCopy.java @@ -70,6 +70,8 @@ public class SQLServerBulkCopy implements java.lang.AutoCloseable, java.io.Seria */ private static final long serialVersionUID = 1989903904654306244L; + private static final String MAX = "(max)"; + /** * Represents the column mappings between the source and destination table */ @@ -1243,7 +1245,7 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, // if destination is encrypted send metadata from destination and not from source if (DataTypes.SHORT_VARTYPE_MAX_BYTES < destPrecision) { - return SSType.VARBINARY.toString() + "(max)"; + return SSType.VARBINARY.toString() + MAX; } else { return SSType.VARBINARY.toString() + "(" + destColumnMetadata.get(destColIndx).precision + ")"; } @@ -1268,7 +1270,7 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, // SQL Server does not convert string to binary, we will have to explicitly convert before sending. if (Util.isCharType(bulkJdbcType) && Util.isBinaryType(destSSType)) { if (isStreaming) - return SSType.VARBINARY.toString() + "(max)"; + return SSType.VARBINARY.toString() + MAX; else // Return binary(n) or varbinary(n) or varbinary(max) depending on destination type/precision. return destSSType.toString() + "(" @@ -1344,13 +1346,13 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, // Doesn't need to match with the exact size of data or with the destination column size. if (unicodeConversionRequired(bulkJdbcType, destSSType)) { if (isStreaming) { - return SSType.NVARCHAR.toString() + "(max)"; + return SSType.NVARCHAR.toString() + MAX; } else { return SSType.NVARCHAR.toString() + "(" + bulkPrecision + ")"; } } else { if (isStreaming) { - return SSType.VARCHAR.toString() + "(max)"; + return SSType.VARCHAR.toString() + MAX; } else { return SSType.VARCHAR.toString() + "(" + bulkPrecision + ")"; } @@ -1360,7 +1362,7 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, case java.sql.Types.LONGNVARCHAR: case java.sql.Types.NVARCHAR: if (isStreaming) { - return SSType.NVARCHAR.toString() + "(MAX)"; + return SSType.NVARCHAR.toString() + MAX; } else { return SSType.NVARCHAR.toString() + "(" + bulkPrecision + ")"; } @@ -1372,7 +1374,7 @@ private String getDestTypeFromSrcType(int srcColIndx, int destColIndx, case java.sql.Types.LONGVARBINARY: case java.sql.Types.VARBINARY: if (isStreaming) - return SSType.VARBINARY.toString() + "(max)"; + return SSType.VARBINARY.toString() + MAX; else return SSType.VARBINARY.toString() + "(" + bulkPrecision + ")"; From 335b161a8b64c6621953a16af0d32a5f0f5d07cc Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Wed, 16 Nov 2022 23:36:13 -0800 Subject: [PATCH 11/13] f --- src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index f0798ac36b..c27d06d62f 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -3379,7 +3379,7 @@ boolean checkIfTdsMessageTypeIsBatchOrRPC() { void preparePacket() throws SQLServerException { if (tdsChannel.isLoggingPackets()) { Arrays.fill(logBuffer.array(), (byte) 0xFE); - logBuffer.clear(); + ((Buffer) logBuffer).clear(); } // Write a placeholder packet header. This will be replaced From 0cd01a9af85fb4eafa05411a22a6d175ef0b391e Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Thu, 17 Nov 2022 11:30:06 -0800 Subject: [PATCH 12/13] cleanup --- .../microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java | 2 +- .../com/microsoft/sqlserver/jdbc/ISQLServerConnection.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java index 1688fbd1f8..ab6d2e324b 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerCallableStatement.java @@ -30,7 +30,7 @@ public interface ISQLServerCallableStatement extends java.sql.CallableStatement, * * @deprecated */ - @Deprecated(since = "6.5.4", forRemoval = true) + @Deprecated(since = "6.5.4") BigDecimal getBigDecimal(String parameterName, int scale) throws SQLServerException; /** diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java index 57240fd78d..e94e8572c7 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/ISQLServerConnection.java @@ -418,8 +418,8 @@ CallableStatement prepareCall(String sql, int nType, int nConcur, int nHold, int getMsiTokenCacheTtl(); /** - * @deprecated Time-to-live is no longer supported for the cached Managed Identity tokens. - * This method is a no-op for backwards compatibility only. + * Time-to-live is no longer supported for the cached Managed Identity tokens. + * This method is a no-op for backwards compatibility only. * * @param timeToLive * Time-to-live is no longer supported. From 875629612a88718cb7f898a6862acddb73ce29ea Mon Sep 17 00:00:00 2001 From: lilgreenbird Date: Thu, 17 Nov 2022 15:05:45 -0800 Subject: [PATCH 13/13] review updates --- .../microsoft/sqlserver/jdbc/Parameter.java | 2 +- .../jdbc/SQLServerDatabaseMetaData.java | 41 ++++++++----------- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java index 1647f52164..52fc06c909 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java @@ -503,7 +503,7 @@ private void setTypeDefinition(DTV dtv) { // then we set precision as the default precision instead of max precision if (!isOutput()) { param.typeDefinition = SSType.DECIMAL.toString() + "(" - + SQLServerConnection.defaultDecimalPrecision + ", " + scale + ")"; + + SQLServerConnection.defaultDecimalPrecision + "," + scale + ")"; } } else { if (SQLServerConnection.defaultDecimalPrecision >= valueLength) { diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java index bc6c8be360..dd474fc4e4 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.java @@ -270,9 +270,6 @@ private void checkClosed() throws SQLServerException { private static final String IS_GENERATEDCOLUMN = "IS_GENERATEDCOLUMN"; private static final String IS_AUTOINCREMENT = "IS_AUTOINCREMENT"; - private static final String SELECT = "SELECT"; - private static final String WHERE = " WHERE "; - private static final String WHERE_CLAUSE = " WHERE 0 = 1"; private static final String ACTIVITY_ID = " ActivityId: "; private static final String SQL_KEYWORDS = createSqlKeyWords(); @@ -484,12 +481,8 @@ public java.sql.ResultSet getCatalogs() throws SQLException, SQLTimeoutException } checkClosed(); // Return the original case instead of CAPS.removed Upper(). - String s = "SELECT name AS TABLE_CAT FROM sys.databases order by name"; // Need - // to - // match - // case - // of - // connection.getCatalog + // Need to match case of connection.getCatalog + String s = "SELECT name AS TABLE_CAT FROM sys.databases order by name"; return getResultSetFromInternalQueries(null, s); } @@ -917,11 +910,11 @@ public java.sql.ResultSet getFunctionColumns(String catalog, String schemaPatter @Override public java.sql.ResultSet getClientInfoProperties() throws SQLException { checkClosed(); - return getResultSetFromInternalQueries(null, SELECT + + return getResultSetFromInternalQueries(null, "SELECT" + /* 1 */ " cast(NULL as char(1)) as NAME," + /* 2 */ " cast(0 as int) as MAX_LEN," + /* 3 */ " cast(NULL as char(1)) as DEFAULT_VALUE," + - /* 4 */ " cast(NULL as char(1)) as DESCRIPTION " + WHERE_CLAUSE); + /* 4 */ " cast(NULL as char(1)) as DESCRIPTION " + " where 0 = 1"); } private static final String[] getBestRowIdentifierColumnNames = { /* 1 */ SCOPE, /* 2 */ COLUMN_NAME, @@ -1441,7 +1434,7 @@ public ResultSet getPseudoColumns(String catalog, String schemaPattern, String t // as per // http://msdn.microsoft.com/en-us/library/ms378445%28v=sql.110%29.aspx // so just return empty result set - return getResultSetFromInternalQueries(catalog, SELECT + + return getResultSetFromInternalQueries(catalog, "SELECT" + /* 1 */ " cast(NULL as char(1)) as TABLE_CAT," + /* 2 */ " cast(NULL as char(1)) as TABLE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TABLE_NAME," + @@ -1453,7 +1446,7 @@ public ResultSet getPseudoColumns(String catalog, String schemaPattern, String t /* 9 */ " cast(NULL as char(1)) as COLUMN_USAGE," + /* 10 */ " cast(NULL as char(1)) as REMARKS," + /* 11 */ " cast(0 as int) as CHAR_OCTET_LENGTH," + - /* 12 */ " cast(NULL as char(1)) as IS_NULLABLE" + WHERE_CLAUSE); + /* 12 */ " cast(NULL as char(1)) as IS_NULLABLE" + " where 0 = 1"); } @Override @@ -1508,12 +1501,12 @@ private java.sql.ResultSet getSchemasInternal(String catalog, // if (null != catalog && catalog.length() == 0) { if (null != schemaPattern) - s += WHERE + schemaName + " like ? and "; + s += " where " + schemaName + " like ? and "; else - s += WHERE; + s += " where "; s += schemaName + " in " + constSchemas; } else if (null != schemaPattern) - s += WHERE + schemaName + " like ? "; + s += " where " + schemaName + " like ? "; s += " order by 2, 1"; if (logger.isLoggable(java.util.logging.Level.FINE)) { @@ -2393,14 +2386,14 @@ public java.sql.ResultSet getUDTs(String catalog, String schemaPattern, String t loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, SELECT + + return getResultSetFromInternalQueries(catalog, "SELECT" + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + /* 4 */ " cast(NULL as char(1)) as CLASS_NAME," + /* 5 */ " cast(0 as int) as DATA_TYPE," + /* 6 */ " cast(NULL as char(1)) as REMARKS," + - /* 7 */ " cast(0 as smallint) as BASE_TYPE" + WHERE_CLAUSE); + /* 7 */ " cast(0 as smallint) as BASE_TYPE" + " where 0 = 1"); } @Override @@ -2495,7 +2488,7 @@ public ResultSet getAttributes(String catalog, String schemaPattern, String type loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, SELECT + + return getResultSetFromInternalQueries(catalog, "SELECT" + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + @@ -2516,7 +2509,7 @@ public ResultSet getAttributes(String catalog, String schemaPattern, String type /* 18 */ " cast(NULL as char(1)) as SCOPE_CATALOG," + /* 19 */ " cast(NULL as char(1)) as SCOPE_SCHEMA," + /* 20 */ " cast(NULL as char(1)) as SCOPE_TABLE," + - /* 21 */ " cast(0 as smallint) as SOURCE_DATA_TYPE" + WHERE_CLAUSE); + /* 21 */ " cast(0 as smallint) as SOURCE_DATA_TYPE" + " where 0 = 1"); } @Override @@ -2526,11 +2519,11 @@ public ResultSet getSuperTables(String catalog, String schemaPattern, loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, SELECT + + return getResultSetFromInternalQueries(catalog, "SELECT" + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + - /* 4 */ " cast(NULL as char(1)) as SUPERTABLE_NAME" + WHERE_CLAUSE); + /* 4 */ " cast(NULL as char(1)) as SUPERTABLE_NAME" + " where 0 = 1"); } @Override @@ -2540,13 +2533,13 @@ public ResultSet getSuperTypes(String catalog, String schemaPattern, loggerExternal.finer(toString() + ACTIVITY_ID + ActivityCorrelator.getNext().toString()); } checkClosed(); - return getResultSetFromInternalQueries(catalog, SELECT + + return getResultSetFromInternalQueries(catalog, "SELECT" + /* 1 */ " cast(NULL as char(1)) as TYPE_CAT," + /* 2 */ " cast(NULL as char(1)) as TYPE_SCHEM," + /* 3 */ " cast(NULL as char(1)) as TYPE_NAME," + /* 4 */ " cast(NULL as char(1)) as SUPERTYPE_CAT," + /* 5 */ " cast(NULL as char(1)) as SUPERTYPE_SCHEM," + - /* 6 */ " cast(NULL as char(1)) as SUPERTYPE_NAME" + WHERE_CLAUSE); + /* 6 */ " cast(NULL as char(1)) as SUPERTYPE_NAME" + " where 0 = 1"); } @Override