net.sourceforge.jtds.jdbc
Class TdsData

java.lang.Object
  extended bynet.sourceforge.jtds.jdbc.TdsData

public class TdsData
extends java.lang.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

    Nested Class Summary
    private static class TdsData.TypeInfo
              This class implements a descriptor for TDS data types;
     
    Field Summary
    (package private) static int DEFAULT_PRECISION_28
              Default precision for SQL Server 6.5 and 7.
    (package private) static int DEFAULT_PRECISION_38
              Default precision for Sybase and SQL Server 2000 and newer.
    (package private) static int DEFAULT_SCALE
              Default Decimal Scale.
    private static int MS_LONGVAR_MAX
               
    private static int SYB_CHUNK_SIZE
               
    private static int SYB_LONGVAR_MAX
               
    private static int SYBBINARY
               
    private static int SYBBIT
               
    private static int SYBBITN
               
    private static int SYBCHAR
               
    private static int SYBDATE
               
    private static int SYBDATEN
               
    private static int SYBDATETIME
               
    private static int SYBDATETIME4
               
    private static int SYBDATETIMN
               
    private static int SYBDECIMAL
               
    private static int SYBFLT8
               
    private static int SYBFLTN
               
    private static int SYBIMAGE
               
    private static int SYBINT1
               
    private static int SYBINT2
               
    private static int SYBINT4
               
    private static int SYBINT8
               
    private static int SYBINTN
               
    private static int SYBLONGBINARY
               
    (package private) static int SYBLONGDATA
               
    private static int SYBMONEY
               
    private static int SYBMONEY4
               
    private static int SYBMONEYN
               
    private static int SYBNTEXT
               
    private static int SYBNUMERIC
               
    private static int SYBNVARCHAR
               
    private static int SYBREAL
               
    private static int SYBSINT1
               
    private static int SYBSINT8
               
    private static int SYBTEXT
               
    private static int SYBTIME
               
    private static int SYBTIMEN
               
    private static int SYBUINT2
               
    private static int SYBUINT4
               
    private static int SYBUINT8
               
    private static int SYBUINTN
               
    private static int SYBUNIQUE
               
    private static int SYBUNITEXT
               
    private static int SYBVARBINARY
               
    private static int SYBVARCHAR
               
    private static int SYBVARIANT
               
    private static int SYBVOID
               
    private static TdsData.TypeInfo[] types
              Array of TDS data type descriptors.
    private static int UDT_BINARY
               
    private static int UDT_CHAR
               
    private static int UDT_LONGSYSNAME
               
    private static int UDT_NCHAR
               
    private static int UDT_NEWSYSNAME
               
    private static int UDT_NVARCHAR
               
    private static int UDT_SYSNAME
               
    private static int UDT_TIMESTAMP
               
    private static int UDT_UNICHAR
               
    private static int UDT_UNITEXT
               
    private static int UDT_UNIVARCHAR
               
    private static int UDT_VARBINARY
               
    private static int UDT_VARCHAR
               
    private static int VAR_MAX
               
    private static int XSYBBINARY
               
    private static int XSYBCHAR
               
    private static int XSYBNCHAR
               
    private static int XSYBNVARCHAR
               
    private static int XSYBVARBINARY
               
    private static int XSYBVARCHAR
               
     
    Constructor Summary
    private TdsData()
              Private constructor to prevent users creating an actual instance of this class.
     
    Method Summary
    private static boolean canEncode(java.lang.String value, java.lang.String charset)
              Establish if a String can be converted to a byte based character set.
    (package private) static void fillInType(ColInfo ci)
              Fill in the TDS native type code and all other fields for a ColInfo instance with the JDBC type set.
    (package private) static int getCollation(ResponseStream in, ColInfo ci)
              TDS 8 supplies collation information for character data types.
    private static java.lang.Object getDatetimeValue(ResponseStream in, int type)
              Get a DATETIME value from the server response stream.
    private static java.lang.Object getMoneyValue(ResponseStream in, int type)
              Read a MONEY value from the server response stream.
    static java.lang.String getMSTypeName(java.lang.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.
    (package private) static void getNativeType(ConnectionJDBC2 connection, ParamInfo pi)
              Retrieve the TDS native type code for the parameter.
    (package private) static int getTds5ParamSize(java.lang.String charset, boolean isWideChar, ParamInfo pi, boolean useParamNames)
              Calculate the size of the parameter descriptor array for TDS 5 packets.
    static int getTdsVersion(int rawTdsVersion)
              Extract the TDS protocol version from the value returned by the server in the LOGINACK packet.
    private static java.lang.Object getVariant(ConnectionJDBC2 connection, ResponseStream in)
              Read a MSQL 2000 sql_variant data value from the input stream.
    (package private) static boolean isCollation(ColInfo ci)
              Retrieve the collation status of the column.
    (package private) static boolean isCurrency(ColInfo ci)
              Retrieve the currency status of the column.
    (package private) static boolean isSearchable(ColInfo ci)
              Retrieve the searchable status of the column.
    (package private) static boolean isSigned(ColInfo ci)
              Retrieve the signed status of the column.
    (package private) static boolean isUnicode(ColInfo ci)
              Determines whether the column is Unicode encoded.
    (package private) static void putCollation(RequestStream out, ParamInfo pi)
              TDS 8 requires collation information for char data descriptors.
    private static void putDateTimeValue(RequestStream out, DateTime value)
              Output a java.sql.Date/Time/Timestamp value to the server as a Sybase datetime value.
    (package private) static java.lang.Object readData(ConnectionJDBC2 connection, ResponseStream in, ColInfo ci)
              Read the TDS data item from the Response Stream.
    (package private) static int readType(ResponseStream in, ColInfo ci)
              Read the TDS datastream and populate the ColInfo parameter with data type and related information.
    (package private) static void setColumnCharset(ColInfo ci, ConnectionJDBC2 connection)
              Set the charsetInfo field of ci according to the value of its collation field.
    (package private) static void writeParam(RequestStream out, CharsetInfo charsetInfo, byte[] collation, ParamInfo pi)
              Write a parameter to the server request stream.
    (package private) static void writeTds5Param(RequestStream out, CharsetInfo charsetInfo, ParamInfo pi)
              Write the actual TDS 5 parameter data.
    (package private) static void writeTds5ParamFmt(RequestStream out, java.lang.String charset, boolean isWideChar, ParamInfo pi, boolean useParamNames)
              Write a TDS 5 parameter format descriptor.
     
    Methods inherited from class java.lang.Object
    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
     

    Field Detail

    SYBCHAR

    private static final int SYBCHAR
    See Also:
    Constant Field Values

    SYBVARCHAR

    private static final int SYBVARCHAR
    See Also:
    Constant Field Values

    SYBINTN

    private static final int SYBINTN
    See Also:
    Constant Field Values

    SYBINT1

    private static final int SYBINT1
    See Also:
    Constant Field Values

    SYBDATE

    private static final int SYBDATE
    See Also:
    Constant Field Values

    SYBTIME

    private static final int SYBTIME
    See Also:
    Constant Field Values

    SYBINT2

    private static final int SYBINT2
    See Also:
    Constant Field Values

    SYBINT4

    private static final int SYBINT4
    See Also:
    Constant Field Values

    SYBINT8

    private static final int SYBINT8
    See Also:
    Constant Field Values

    SYBFLT8

    private static final int SYBFLT8
    See Also:
    Constant Field Values

    SYBDATETIME

    private static final int SYBDATETIME
    See Also:
    Constant Field Values

    SYBBIT

    private static final int SYBBIT
    See Also:
    Constant Field Values

    SYBTEXT

    private static final int SYBTEXT
    See Also:
    Constant Field Values

    SYBNTEXT

    private static final int SYBNTEXT
    See Also:
    Constant Field Values

    SYBIMAGE

    private static final int SYBIMAGE
    See Also:
    Constant Field Values

    SYBMONEY4

    private static final int SYBMONEY4
    See Also:
    Constant Field Values

    SYBMONEY

    private static final int SYBMONEY
    See Also:
    Constant Field Values

    SYBDATETIME4

    private static final int SYBDATETIME4
    See Also:
    Constant Field Values

    SYBREAL

    private static final int SYBREAL
    See Also:
    Constant Field Values

    SYBBINARY

    private static final int SYBBINARY
    See Also:
    Constant Field Values

    SYBVOID

    private static final int SYBVOID
    See Also:
    Constant Field Values

    SYBVARBINARY

    private static final int SYBVARBINARY
    See Also:
    Constant Field Values

    SYBNVARCHAR

    private static final int SYBNVARCHAR
    See Also:
    Constant Field Values

    SYBBITN

    private static final int SYBBITN
    See Also:
    Constant Field Values

    SYBNUMERIC

    private static final int SYBNUMERIC
    See Also:
    Constant Field Values

    SYBDECIMAL

    private static final int SYBDECIMAL
    See Also:
    Constant Field Values

    SYBFLTN

    private static final int SYBFLTN
    See Also:
    Constant Field Values

    SYBMONEYN

    private static final int SYBMONEYN
    See Also:
    Constant Field Values

    SYBDATETIMN

    private static final int SYBDATETIMN
    See Also:
    Constant Field Values

    SYBDATEN

    private static final int SYBDATEN
    See Also:
    Constant Field Values

    SYBTIMEN

    private static final int SYBTIMEN
    See Also:
    Constant Field Values

    XSYBCHAR

    private static final int XSYBCHAR
    See Also:
    Constant Field Values

    XSYBVARCHAR

    private static final int XSYBVARCHAR
    See Also:
    Constant Field Values

    XSYBNVARCHAR

    private static final int XSYBNVARCHAR
    See Also:
    Constant Field Values

    XSYBNCHAR

    private static final int XSYBNCHAR
    See Also:
    Constant Field Values

    XSYBVARBINARY

    private static final int XSYBVARBINARY
    See Also:
    Constant Field Values

    XSYBBINARY

    private static final int XSYBBINARY
    See Also:
    Constant Field Values

    SYBUNITEXT

    private static final int SYBUNITEXT
    See Also:
    Constant Field Values

    SYBLONGBINARY

    private static final int SYBLONGBINARY
    See Also:
    Constant Field Values

    SYBSINT1

    private static final int SYBSINT1
    See Also:
    Constant Field Values

    SYBUINT2

    private static final int SYBUINT2
    See Also:
    Constant Field Values

    SYBUINT4

    private static final int SYBUINT4
    See Also:
    Constant Field Values

    SYBUINT8

    private static final int SYBUINT8
    See Also:
    Constant Field Values

    SYBUINTN

    private static final int SYBUINTN
    See Also:
    Constant Field Values

    SYBUNIQUE

    private static final int SYBUNIQUE
    See Also:
    Constant Field Values

    SYBVARIANT

    private static final int SYBVARIANT
    See Also:
    Constant Field Values

    SYBSINT8

    private static final int SYBSINT8
    See Also:
    Constant Field Values

    SYBLONGDATA

    static final int SYBLONGDATA
    See Also:
    Constant Field Values

    UDT_CHAR

    private static final int UDT_CHAR
    See Also:
    Constant Field Values

    UDT_VARCHAR

    private static final int UDT_VARCHAR
    See Also:
    Constant Field Values

    UDT_BINARY

    private static final int UDT_BINARY
    See Also:
    Constant Field Values

    UDT_VARBINARY

    private static final int UDT_VARBINARY
    See Also:
    Constant Field Values

    UDT_SYSNAME

    private static final int UDT_SYSNAME
    See Also:
    Constant Field Values

    UDT_NCHAR

    private static final int UDT_NCHAR
    See Also:
    Constant Field Values

    UDT_NVARCHAR

    private static final int UDT_NVARCHAR
    See Also:
    Constant Field Values

    UDT_UNICHAR

    private static final int UDT_UNICHAR
    See Also:
    Constant Field Values

    UDT_UNIVARCHAR

    private static final int UDT_UNIVARCHAR
    See Also:
    Constant Field Values

    UDT_UNITEXT

    private static final int UDT_UNITEXT
    See Also:
    Constant Field Values

    UDT_LONGSYSNAME

    private static final int UDT_LONGSYSNAME
    See Also:
    Constant Field Values

    UDT_TIMESTAMP

    private static final int UDT_TIMESTAMP
    See Also:
    Constant Field Values

    UDT_NEWSYSNAME

    private static final int UDT_NEWSYSNAME
    See Also:
    Constant Field Values

    VAR_MAX

    private static final int VAR_MAX
    See Also:
    Constant Field Values

    SYB_LONGVAR_MAX

    private static final int SYB_LONGVAR_MAX
    See Also:
    Constant Field Values

    MS_LONGVAR_MAX

    private static final int MS_LONGVAR_MAX
    See Also:
    Constant Field Values

    SYB_CHUNK_SIZE

    private static final int SYB_CHUNK_SIZE
    See Also:
    Constant Field Values

    types

    private static final TdsData.TypeInfo[] types
    Array of TDS data type descriptors.


    DEFAULT_SCALE

    static final int DEFAULT_SCALE
    Default Decimal Scale.

    See Also:
    Constant Field Values

    DEFAULT_PRECISION_28

    static final int DEFAULT_PRECISION_28
    Default precision for SQL Server 6.5 and 7.

    See Also:
    Constant Field Values

    DEFAULT_PRECISION_38

    static final int DEFAULT_PRECISION_38
    Default precision for Sybase and SQL Server 2000 and newer.

    See Also:
    Constant Field Values
    Constructor Detail

    TdsData

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

    Method Detail

    getCollation

    static int getCollation(ResponseStream in,
                            ColInfo ci)
                     throws java.io.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:
    java.io.IOException

    setColumnCharset

    static void setColumnCharset(ColInfo ci,
                                 ConnectionJDBC2 connection)
                          throws java.sql.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:
    java.sql.SQLException - if a CharsetInfo is not found for this particular column collation

    readType

    static int readType(ResponseStream in,
                        ColInfo ci)
                 throws java.io.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:
    java.io.IOException
    ProtocolException

    readData

    static java.lang.Object readData(ConnectionJDBC2 connection,
                                     ResponseStream in,
                                     ColInfo ci)
                              throws java.io.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:
    java.io.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 java.sql.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:
    java.sql.SQLException

    getNativeType

    static void getNativeType(ConnectionJDBC2 connection,
                              ParamInfo pi)
                       throws java.sql.SQLException
    Retrieve the TDS native type code for the parameter.

    Parameters:
    connection - the connectionJDBC object
    pi - the parameter descriptor
    Throws:
    java.sql.SQLException

    getTds5ParamSize

    static int getTds5ParamSize(java.lang.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,
                                  java.lang.String charset,
                                  boolean isWideChar,
                                  ParamInfo pi,
                                  boolean useParamNames)
                           throws java.io.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:
    java.io.IOException

    writeTds5Param

    static void writeTds5Param(RequestStream out,
                               CharsetInfo charsetInfo,
                               ParamInfo pi)
                        throws java.io.IOException,
                               java.sql.SQLException
    Write the actual TDS 5 parameter data.

    Parameters:
    out - the server RequestStream
    charsetInfo - the encoding character set
    pi - the parameter to output
    Throws:
    java.io.IOException
    java.sql.SQLException

    putCollation

    static void putCollation(RequestStream out,
                             ParamInfo pi)
                      throws java.io.IOException
    TDS 8 requires collation information for char data descriptors.

    Parameters:
    out - The Server request stream.
    pi - The parameter descriptor.
    Throws:
    java.io.IOException

    writeParam

    static void writeParam(RequestStream out,
                           CharsetInfo charsetInfo,
                           byte[] collation,
                           ParamInfo pi)
                    throws java.io.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:
    java.io.IOException

    getDatetimeValue

    private static java.lang.Object getDatetimeValue(ResponseStream in,
                                                     int type)
                                              throws java.io.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:
    java.io.IOException
    ProtocolException

    putDateTimeValue

    private static void putDateTimeValue(RequestStream out,
                                         DateTime value)
                                  throws java.io.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:
    java.io.IOException

    getMoneyValue

    private static java.lang.Object getMoneyValue(ResponseStream in,
                                                  int type)
                                           throws java.io.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:
    java.io.IOException
    ProtocolException

    getVariant

    private static java.lang.Object getVariant(ConnectionJDBC2 connection,
                                               ResponseStream in)
                                        throws java.io.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:
    java.io.IOException
    ProtocolException

    getMSTypeName

    public static java.lang.String getMSTypeName(java.lang.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(java.lang.String value,
                                     java.lang.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.


    Generated on October 27 2012