Class TdsData

java.lang.Object
net.sourceforge.jtds.jdbc.TdsData

public class TdsData extends Object
Implement TDS data types and related I/O logic.

Implementation notes:

  • This class encapsulates all the knowledge about reading and writing TDS data descriptors and related application data.
  • There are four key methods supplied here:
    1. readType() - Reads the column and parameter meta data.
    2. readData() - Reads actual data values.
    3. writeParam() - Write parameter descriptors and data.
    4. getNativeType() - knows how to map JDBC data types to the equivalent TDS type.
  • Version:
    $Id: TdsData.java,v 1.60.2.3 2009-11-05 10:42:18 ickzon Exp $
    Author:
    Mike Hutchinson, Alin Sinpalean, freeTDS project
    • Field Details

    • Constructor Details

      • TdsData

        private TdsData()
        Private constructor to prevent users creating an actual instance of this class.
    • Method Details

      • getCollation

        static int getCollation(ResponseStream in, ColInfo ci) throws IOException
        TDS 8 supplies collation information for character data types.
        Parameters:
        in - the server response stream
        ci - the column descriptor
        Returns:
        the number of bytes read from the stream as an int
        Throws:
        IOException
      • setColumnCharset

        static void setColumnCharset(ColInfo ci, JtdsConnection connection) throws SQLException
        Set the charsetInfo field of ci according to the value of its collation field.

        The Connection is used to find out whether a specific charset was requested. In this case, the column charset will be ignored.

        Parameters:
        ci - the ColInfo instance to update
        connection - a Connection instance to check whether it has a fixed charset or not
        Throws:
        SQLException - if a CharsetInfo is not found for this particular column collation
      • readType

        static int readType(ResponseStream in, ColInfo ci) throws IOException, ProtocolException
        Read the TDS datastream and populate the ColInfo parameter with data type and related information.

        The type infomation conforms to one of the following formats:

        1. [int1 type] - eg SYBINT4.
        2. [int1 type] [int1 buffersize] - eg VARCHAR < 256
        3. [int1 type] [int2 buffersize] - eg VARCHAR > 255.
        4. [int1 type] [int4 buffersize] [int1 tabnamelen] [int1*n tabname] - eg text.
        5. [int1 type] [int4 buffersize] - eg sql_variant.
        6. [int1 type] [int1 buffersize] [int1 precision] [int1 scale] - eg decimal.
        For TDS 8 large character types include a 5 byte collation field after the buffer size.
        Parameters:
        in - The server response stream.
        ci - The ColInfo column descriptor object.
        Returns:
        The number of bytes read from the input stream.
        Throws:
        IOException
        ProtocolException
      • readData

        static Object readData(JtdsConnection connection, ResponseStream in, ColInfo ci) throws IOException, ProtocolException
        Read the TDS data item from the Response Stream.

        The data size is either implicit in the type for example fixed size integers, or a count field precedes the actual data. The size of the count field varies with the data type.

        Parameters:
        connection - an object reference to the caller of this method; must be a Connection, Statement or ResultSet
        in - The server ResponseStream.
        ci - The ColInfo column descriptor object.
        Returns:
        The data item Object or null.
        Throws:
        IOException
        ProtocolException
      • isSigned

        static boolean isSigned(ColInfo ci)
        Retrieve the signed status of the column.
        Parameters:
        ci - the column meta data
        Returns:
        true if the column is a signed numeric.
      • isCollation

        static boolean isCollation(ColInfo ci)
        Retrieve the collation status of the column.

        TDS 8.0 character columns include collation information.

        Parameters:
        ci - the column meta data
        Returns:
        true if the column requires collation data.
      • isCurrency

        static boolean isCurrency(ColInfo ci)
        Retrieve the currency status of the column.
        Parameters:
        ci - The column meta data.
        Returns:
        boolean true if the column is a currency type.
      • isSearchable

        static boolean isSearchable(ColInfo ci)
        Retrieve the searchable status of the column.
        Parameters:
        ci - the column meta data
        Returns:
        true if the column is not a text or image type.
      • isUnicode

        static boolean isUnicode(ColInfo ci)
        Determines whether the column is Unicode encoded.
        Parameters:
        ci - the column meta data
        Returns:
        true if the column is Unicode encoded
      • fillInType

        static void fillInType(ColInfo ci) throws SQLException
        Fill in the TDS native type code and all other fields for a ColInfo instance with the JDBC type set.
        Parameters:
        ci - the ColInfo instance
        Throws:
        SQLException
      • getNativeType

        static void getNativeType(JtdsConnection connection, ParamInfo pi) throws SQLException
        Retrieve the TDS native type code for the parameter.
        Parameters:
        connection - the connectionJDBC object
        pi - the parameter descriptor
        Throws:
        SQLException
      • getTds5ParamSize

        static int getTds5ParamSize(String charset, boolean isWideChar, ParamInfo pi, boolean useParamNames)
        Calculate the size of the parameter descriptor array for TDS 5 packets.
        Parameters:
        charset - The encoding character set.
        isWideChar - True if multi byte encoding.
        pi - The parameter to describe.
        useParamNames - True if named parameters should be used.
        Returns:
        The size of the parameter descriptor as an int.
      • writeTds5ParamFmt

        static void writeTds5ParamFmt(RequestStream out, String charset, boolean isWideChar, ParamInfo pi, boolean useParamNames) throws IOException
        Write a TDS 5 parameter format descriptor.
        Parameters:
        out - The server RequestStream.
        charset - The encoding character set.
        isWideChar - True if multi byte encoding.
        pi - The parameter to describe.
        useParamNames - True if named parameters should be used.
        Throws:
        IOException
      • writeTds5Param

        static void writeTds5Param(RequestStream out, CharsetInfo charsetInfo, ParamInfo pi) throws IOException, SQLException
        Write the actual TDS 5 parameter data.
        Parameters:
        out - the server RequestStream
        charsetInfo - the encoding character set
        pi - the parameter to output
        Throws:
        IOException
        SQLException
      • putCollation

        static void putCollation(RequestStream out, ParamInfo pi) throws IOException
        TDS 8 requires collation information for char data descriptors.
        Parameters:
        out - The Server request stream.
        pi - The parameter descriptor.
        Throws:
        IOException
      • writeParam

        static void writeParam(RequestStream out, CharsetInfo charsetInfo, byte[] collation, ParamInfo pi) throws IOException
        Write a parameter to the server request stream.
        Parameters:
        out - the server request stream
        charsetInfo - the default character set
        collation - the default SQL Server 2000 collation
        pi - the parameter descriptor
        Throws:
        IOException
      • getDatetimeValue

        private static Object getDatetimeValue(ResponseStream in, int type) throws IOException, ProtocolException
        Get a DATETIME value from the server response stream.
        Parameters:
        in - The server response stream.
        type - The TDS data type.
        Returns:
        The java.sql.Timestamp value or null.
        Throws:
        IOException
        ProtocolException
      • putDateTimeValue

        private static void putDateTimeValue(RequestStream out, DateTime value) throws IOException
        Output a java.sql.Date/Time/Timestamp value to the server as a Sybase datetime value.
        Parameters:
        out - the server request stream
        value - the date value to write
        Throws:
        IOException
      • getMoneyValue

        private static Object getMoneyValue(ResponseStream in, int type) throws IOException, ProtocolException
        Read a MONEY value from the server response stream.
        Parameters:
        in - The server response stream.
        type - The TDS data type.
        Returns:
        The java.math.BigDecimal value or null.
        Throws:
        IOException
        ProtocolException
      • getVariant

        private static Object getVariant(JtdsConnection connection, ResponseStream in) throws IOException, ProtocolException
        Read a MSQL 2000 sql_variant data value from the input stream.

        SQL_VARIANT has the following structure:

        1. INT4 total size of data
        2. INT1 TDS data type (text/image/ntext/sql_variant not allowed)
        3. INT1 Length of extra type descriptor information
        4. Optional additional type info required by some types
        5. byte[0...n] the actual data
        Parameters:
        connection - used to obtain collation/charset information
        in - the server response stream
        Returns:
        the SQL_VARIANT data
        Throws:
        IOException
        ProtocolException
      • getMSTypeName

        public static String getMSTypeName(String typeName, int tdsType)
        For SQL 2005 This routine will modify the meta data to allow the caller to distinguish between varchar(max) and text or varbinary(max) and image or nvarchar(max) and ntext.
        Parameters:
        typeName - the SQL type returned by sp_columns
        tdsType - the TDS type returned by sp_columns
        Returns:
        the (possibly) modified SQL type name as a String
      • getTdsVersion

        public static int getTdsVersion(int rawTdsVersion)
        Extract the TDS protocol version from the value returned by the server in the LOGINACK packet.
        Parameters:
        rawTdsVersion - the TDS protocol version as returned by the server
        Returns:
        the jTDS internal value for the protocol version (i.e one of the Driver.TDSXX values)
      • canEncode

        private static boolean canEncode(String value, String charset)
        Establish if a String can be converted to a byte based character set.
        Parameters:
        value - The String to test.
        charset - The server character set in force.
        Returns:
        boolean true if string can be converted.
      • isMSSQL2005Plus

        static boolean isMSSQL2005Plus(JtdsConnection connection)