📄 tdsdata.java
字号:
pi.sqlType = "bit";
break;
case java.sql.Types.REAL:
pi.tdsType = SYBFLTN;
pi.sqlType = "real";
break;
case java.sql.Types.FLOAT:
case java.sql.Types.DOUBLE:
pi.tdsType = SYBFLTN;
pi.sqlType = "float";
break;
case java.sql.Types.DATE:
if (connection.getSybaseInfo(TdsCore.SYB_DATETIME)) {
pi.tdsType = SYBDATEN;
pi.sqlType = "date";
} else {
pi.tdsType = SYBDATETIMN;
pi.sqlType = "datetime";
}
break;
case java.sql.Types.TIME:
if (connection.getSybaseInfo(TdsCore.SYB_DATETIME)) {
pi.tdsType = SYBTIMEN;
pi.sqlType = "time";
} else {
pi.tdsType = SYBDATETIMN;
pi.sqlType = "datetime";
}
break;
case java.sql.Types.TIMESTAMP:
pi.tdsType = SYBDATETIMN;
pi.sqlType = "datetime";
break;
case java.sql.Types.BINARY:
case java.sql.Types.VARBINARY:
case java.sql.Types.BLOB:
case java.sql.Types.LONGVARBINARY:
if (pi.value == null) {
len = 0;
} else {
len = pi.length;
}
if (connection.getTdsVersion() < Driver.TDS70) {
if (len <= VAR_MAX) {
pi.tdsType = SYBVARBINARY;
pi.sqlType = "varbinary(255)";
} else {
if (connection.getSybaseInfo(TdsCore.SYB_LONGDATA)) {
if (len > SYB_LONGVAR_MAX) {
// Need to use special Sybase long binary type
pi.tdsType = SYBLONGDATA;
pi.sqlType = "image";
} else {
// Sybase long binary that can be used as a SP parameter
pi.tdsType = SYBLONGBINARY;
pi.sqlType = "varbinary(" + len + ')';
}
} else {
// Sybase < 12.5 or SQL Server 6.5
pi.tdsType = SYBIMAGE;
pi.sqlType = "image";
}
}
} else {
if (len <= MS_LONGVAR_MAX) {
pi.tdsType = XSYBVARBINARY;
pi.sqlType = "varbinary(8000)";
} else {
if (pi.isOutput) {
throw new SQLException(
Messages.get("error.textoutparam"), "HY000");
}
pi.tdsType = SYBIMAGE;
pi.sqlType = "image";
}
}
break;
case java.sql.Types.BIGINT:
if (connection.getTdsVersion() >= Driver.TDS80) {
pi.tdsType = SYBINTN;
pi.sqlType = "bigint";
} else {
// int8 not supported send as a decimal field
pi.tdsType = SYBDECIMAL;
if (connection.getMaxPrecision() > 28) {
pi.sqlType = "decimal(38)";
} else {
pi.sqlType = "decimal(28)";
}
}
break;
case java.sql.Types.DECIMAL:
case java.sql.Types.NUMERIC:
pi.tdsType = SYBDECIMAL;
if (connection.getMaxPrecision() > 28) {
if (pi.scale > 10 && pi.scale <= 38) {
pi.sqlType = "decimal(38," + pi.scale + ')';
} else {
pi.sqlType = "decimal(38,10)";
}
} else {
if (pi.scale > 10 && pi.scale <= 28) {
pi.sqlType = "decimal(28," + pi.scale + ')';
} else {
pi.sqlType = "decimal(28,10)";
}
}
if (pi.value instanceof BigDecimal) {
BigDecimal value = (BigDecimal)pi.value;
if (connection.getMaxPrecision() > 28) {
if (value.scale() > 10 || value.abs().compareTo(limit38) > 0) {
pi.sqlType = "decimal(38," + value.scale() + ')';
}
} else {
if (value.scale() > 10 || value.abs().compareTo(limit28) > 0) {
pi.sqlType = "decimal(28," + value.scale() + ')';
}
}
}
break;
case java.sql.Types.OTHER:
case java.sql.Types.NULL:
// Send a null String in the absence of anything better
pi.tdsType = SYBVARCHAR;
pi.sqlType = "varchar(255)";
break;
default:
throw new SQLException(Messages.get(
"error.baddatatype",
Integer.toString(pi.jdbcType)), "HY000");
}
}
/**
* Calculate the size of the parameter descriptor array for TDS 5 packets.
*
* @param charset The encoding character set.
* @param isWideChar True if multi byte encoding.
* @param pi The parameter to describe.
* @param useParamNames True if named parameters should be used.
* @return The size of the parameter descriptor as an <code>int</code>.
*/
static int getTds5ParamSize(String charset,
boolean isWideChar,
ParamInfo pi,
boolean useParamNames) {
int size = 8;
if (pi.name != null && useParamNames) {
// Size of parameter name
if (isWideChar) {
byte[] buf = Support.encodeString(charset, pi.name);
size += buf.length;
} else {
size += pi.name.length();
}
}
switch (pi.tdsType) {
case SYBVARCHAR:
case SYBVARBINARY:
case SYBINTN:
case SYBFLTN:
case SYBDATETIMN:
case SYBDATEN:
case SYBTIMEN:
size += 1;
break;
case SYBDECIMAL:
case SYBLONGDATA:
size += 3;
break;
case XSYBCHAR:
case SYBLONGBINARY:
size += 4;
break;
case SYBBIT:
break;
default:
throw new IllegalStateException("Unsupported output TDS type 0x"
+ Integer.toHexString(pi.tdsType));
}
return size;
}
/**
* Write a TDS 5 parameter format descriptor.
*
* @param out The server RequestStream.
* @param charset The encoding character set.
* @param isWideChar True if multi byte encoding.
* @param pi The parameter to describe.
* @param useParamNames True if named parameters should be used.
* @throws IOException
*/
static void writeTds5ParamFmt(RequestStream out,
String charset,
boolean isWideChar,
ParamInfo pi,
boolean useParamNames)
throws IOException {
if (pi.name != null && useParamNames) {
// Output parameter name.
if (isWideChar) {
byte[] buf = Support.encodeString(charset, pi.name);
out.write((byte) buf.length);
out.write(buf);
} else {
out.write((byte) pi.name.length());
out.write(pi.name);
}
} else {
out.write((byte)0);
}
out.write((byte) (pi.isOutput ? 1 : 0)); // Output param
if (pi.sqlType.startsWith("univarchar")) {
out.write((int) UDT_UNIVARCHAR);
} else {
out.write((int) 0); // user type
}
out.write((byte) pi.tdsType); // TDS data type token
// Output length fields
switch (pi.tdsType) {
case SYBVARCHAR:
case SYBVARBINARY:
out.write((byte) VAR_MAX);
break;
case XSYBCHAR:
out.write((int)0x7FFFFFFF);
break;
case SYBLONGDATA:
// It appears that type 3 = send text data
// and type 4 = send image data
// No idea if there is a type 1/2 or what they are.
out.write(pi.sqlType.equals("text") ? (byte) 3 : (byte) 4);
out.write((byte)0);
out.write((byte)0);
break;
case SYBLONGBINARY:
out.write((int)0x7FFFFFFF);
break;
case SYBBIT:
break;
case SYBINTN:
out.write((byte) 4);
break;
case SYBFLTN:
if (pi.value instanceof Float) {
out.write((byte) 4);
} else {
out.write((byte) 8);
}
break;
case SYBDATETIMN:
out.write((byte) 8);
break;
case SYBDATEN:
case SYBTIMEN:
out.write((byte)4);
break;
case SYBDECIMAL:
out.write((byte) 17);
out.write((byte) 38);
if (pi.jdbcType == java.sql.Types.BIGINT) {
out.write((byte) 0);
} else {
if (pi.value instanceof BigDecimal) {
out.write((byte) ((BigDecimal) pi.value).scale());
} else {
out.write((byte) 10);
}
}
break;
default:
throw new IllegalStateException(
"Unsupported output TDS type " + Integer.toHexString(pi.tdsType));
}
out.write((byte) 0); // Locale information
}
/**
* Write the actual TDS 5 parameter data.
*
* @param out the server RequestStream
* @param charsetInfo the encoding character set
* @param pi the parameter to output
* @throws IOException
* @throws SQLException
*/
static void writeTds5Param(RequestStream out,
CharsetInfo charsetInfo,
ParamInfo pi)
throws IOException, SQLException {
if (pi.cha
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -