Class TdsData
- java.lang.Object
-
- net.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:
- readType() - Reads the column and parameter meta data.
- readData() - Reads actual data values.
- writeParam() - Write parameter descriptors and data.
- 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
Nested Classes Modifier and Type Class Description private static class
TdsData.TypeInfo
This class implements a descriptor for TDS data types;
-
Field Summary
Fields Modifier and Type Field Description private static int
DATEN
private static int
DATETIME2N
private static int
DATETIMEOFFSETN
(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 int
TIMEN
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
XML
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
Constructors Modifier Constructor Description private
TdsData()
Private constructor to prevent users creating an actual instance of this class.
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description 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 aColInfo
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(JtdsConnection 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(JtdsConnection 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
isMSSQL2005Plus(JtdsConnection connection)
(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(JtdsConnection 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, JtdsConnection connection)
Set thecharsetInfo
field ofci
according to the value of itscollation
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.
-
-
-
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
-
XML
private static final int XML
- See Also:
- Constant Field Values
-
DATEN
private static final int DATEN
- See Also:
- Constant Field Values
-
TIMEN
private static final int TIMEN
- See Also:
- Constant Field Values
-
DATETIME2N
private static final int DATETIME2N
- See Also:
- Constant Field Values
-
DATETIMEOFFSETN
private static final int DATETIMEOFFSETN
- 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
-
-
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 streamci
- 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, JtdsConnection connection) throws java.sql.SQLException
Set thecharsetInfo
field ofci
according to the value of itscollation
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
- theColInfo
instance to updateconnection
- aConnection
instance to check whether it has a fixed charset or not- Throws:
java.sql.SQLException
- if aCharsetInfo
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:
- [int1 type] - eg SYBINT4.
- [int1 type] [int1 buffersize] - eg VARCHAR < 256
- [int1 type] [int2 buffersize] - eg VARCHAR > 255.
- [int1 type] [int4 buffersize] [int1 tabnamelen] [int1*n tabname] - eg text.
- [int1 type] [int4 buffersize] - eg sql_variant.
- [int1 type] [int1 buffersize] [int1 precision] [int1 scale] - eg decimal.
- 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(JtdsConnection 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 aConnection
,Statement
orResultSet
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 aColInfo
instance with the JDBC type set.- Parameters:
ci
- theColInfo
instance- Throws:
java.sql.SQLException
-
getNativeType
static void getNativeType(JtdsConnection connection, ParamInfo pi) throws java.sql.SQLException
Retrieve the TDS native type code for the parameter.- Parameters:
connection
- the connectionJDBC objectpi
- 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 RequestStreamcharsetInfo
- the encoding character setpi
- 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 streamcharsetInfo
- the default character setcollation
- the default SQL Server 2000 collationpi
- 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 streamvalue
- 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(JtdsConnection 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:
- INT4 total size of data
- INT1 TDS data type (text/image/ntext/sql_variant not allowed)
- INT1 Length of extra type descriptor information
- Optional additional type info required by some types
- byte[0...n] the actual data
- Parameters:
connection
- used to obtain collation/charset informationin
- 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_columnstdsType
- 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.
-
isMSSQL2005Plus
static boolean isMSSQL2005Plus(JtdsConnection connection)
-
-