📄 tdsdata.java
字号:
in.skip(24); // Skip textptr and timestamp
int dataLen = in.readInt();
if (dataLen <= connection.getLobBuffer()) {
//
// OK Small enough to load into memory
//
byte[] data = new byte[dataLen];
in.read(data);
blob = new BlobImpl(connection, data);
} else {
// Too big, need to write straight to disk
try {
blob = new BlobImpl(connection);
OutputStream out = blob.setBinaryStream(1);
byte[] buffer = new byte[1024];
int result;
while ((result = in.read(buffer, 0,
Math.min(dataLen, buffer.length)))
!= -1 && dataLen != 0) {
out.write(buffer, 0, result);
dataLen -= result;
}
out.close();
} catch (SQLException e) {
// Transform setBinaryStream SQLException
throw new IOException(e.getMessage());
}
}
return blob;
}
break;
case SYBTEXT:
len = in.read();
if (len > 0) {
ClobImpl clob = new ClobImpl(connection);
BlobBuffer blobBuffer = clob.getBlobBuffer();
String charset;
if (ci.charsetInfo != null) {
charset = ci.charsetInfo.getCharset();
} else {
charset = connection.getCharset();
}
in.skip(24); // Skip textptr and timestamp
int dataLen = in.readInt();
if (dataLen <= connection.getLobBuffer()) {
//
// OK Small enough to load into memory
//
BufferedReader rdr =
new BufferedReader(
new InputStreamReader(in.getInputStream(dataLen),
charset),
1024);
byte[] data = new byte[dataLen * 2];
int p = 0;
int c;
while ((c = rdr.read()) >= 0) {
data[p++] = (byte)c;
data[p++] = (byte)(c >> 8);
}
rdr.close();
blobBuffer.setBuffer(data, false);
if (p == 2 && data[0] == 0x20 && data[1] == 0
&& in.getTdsVersion() < Driver.TDS70) {
// Single space with Sybase equates to empty string
p = 0;
}
// Explicitly set length as multi byte character sets
// may not fill array completely.
blobBuffer.setLength(p);
} else {
// Too big, need to write straight to disk
BufferedReader rdr =
new BufferedReader(
new InputStreamReader(in.getInputStream(dataLen),
charset),
1024);
try {
OutputStream out = blobBuffer.setBinaryStream(1, false);
int c;
while ((c = rdr.read()) >= 0) {
out.write(c);
out.write(c >> 8);
}
out.close();
rdr.close();
} catch (SQLException e) {
// Turn back into an IOException
throw new IOException(e.getMessage());
}
}
return clob;
}
break;
case SYBNTEXT:
len = in.read();
if (len > 0) {
ClobImpl clob = new ClobImpl(connection);
BlobBuffer blobBuffer = clob.getBlobBuffer();
in.skip(24); // Skip textptr and timestamp
int dataLen = in.readInt();
if (dataLen <= connection.getLobBuffer()) {
//
// OK Small enough to load into memory
//
byte[] data = new byte[dataLen];
in.read(data);
blobBuffer.setBuffer(data, false);
} else {
// Too big, need to write straight to disk
try {
OutputStream out = blobBuffer.setBinaryStream(1, false);
byte[] buffer = new byte[1024];
int result;
while ((result = in.read(buffer, 0,
Math.min(dataLen, buffer.length)))
!= -1 && dataLen != 0) {
out.write(buffer, 0, result);
dataLen -= result;
}
out.close();
} catch (SQLException e) {
// Transform setBinaryStream SQLException
throw new IOException(e.getMessage());
}
}
return clob;
}
break;
case SYBCHAR:
case SYBVARCHAR:
len = in.read();
if (len > 0) {
String value = in.readNonUnicodeString(len,
ci.charsetInfo == null ? connection.getCharsetInfo() : ci.charsetInfo);
if (len == 1 && in.getTdsVersion() < Driver.TDS70) {
// In TDS 4/5 zero length strings are stored as a single space
// to distinguish them from nulls.
return (value.equals(" ")) ? "" : value;
}
return value;
}
break;
case SYBNVARCHAR:
len = in.read();
if (len > 0) {
return in.readUnicodeString(len / 2);
}
break;
case XSYBCHAR:
case XSYBVARCHAR:
if (in.getTdsVersion() == Driver.TDS50) {
// This is a Sybase wide table String
len = in.readInt();
if (len > 0) {
String tmp = in.readNonUnicodeString(len);
if (tmp.equals(" ") && !ci.sqlType.equals("char")) {
tmp = "";
}
return tmp;
}
} else {
// This is a TDS 7+ long string
len = in.readShort();
if (len != -1) {
return in.readNonUnicodeString(len,
ci.charsetInfo == null ? connection.getCharsetInfo() : ci.charsetInfo);
}
}
break;
case XSYBNCHAR:
case XSYBNVARCHAR:
len = in.readShort();
if (len != -1) {
return in.readUnicodeString(len / 2);
}
break;
case SYBVARBINARY:
case SYBBINARY:
len = in.read();
if (len > 0) {
byte[] bytes = new byte[len];
in.read(bytes);
return bytes;
}
break;
case XSYBVARBINARY:
case XSYBBINARY:
len = in.readShort();
if (len != -1) {
byte[] bytes = new byte[len];
in.read(bytes);
return bytes;
}
break;
case SYBLONGBINARY:
len = in.readInt();
if (len != 0) {
if (ci.sqlType.equals("unichar") ||
ci.sqlType.equals("univarchar")) {
char[] buf = new char[len / 2];
in.read(buf);
if ((len & 1) != 0) {
// Bad length should be divisible by 2
in.skip(1); // Deal with it anyway.
}
if (len == 2 && buf[0] == ' ') {
return "";
} else {
return new String(buf);
}
} else {
byte[] bytes = new byte[len];
in.read(bytes);
return bytes;
}
}
break;
case SYBMONEY4:
case SYBMONEY:
case SYBMONEYN:
return getMoneyValue(in, ci.tdsType);
case SYBDATETIME4:
case SYBDATETIMN:
case SYBDATETIME:
return getDatetimeValue(in, ci.tdsType);
case SYBDATEN:
case SYBDATE:
len = (ci.tdsType == SYBDATEN)? in.read(): 4;
if (len == 4) {
return new DateTime(in.readInt(), -1);
} else {
// Invalid length or 0 for null
in.skip(len);
}
break;
case SYBTIMEN:
case SYBTIME:
len = (ci.tdsType == SYBTIMEN)? in.read(): 4;
if (len == 4) {
return new DateTime(-1, in.readInt());
} else {
// Invalid length or 0 for null
in.skip(len);
}
break;
case SYBBIT:
return (in.read() != 0) ? Boolean.TRUE : Boolean.FALSE;
case SYBBITN:
len = in.read();
if (len > 0) {
return (in.read() != 0) ? Boolean.TRUE : Boolean.FALSE;
}
break;
case SYBREAL:
return new Float(Float.intBitsToFloat(in.readInt()));
case SYBFLT8:
return new Double(Double.longBitsToDouble(in.readLong()));
case SYBFLTN:
len = in.read();
if (len == 4) {
return new Float(Float.intBitsToFloat(in.readInt()));
} else if (len == 8) {
return new Double(Double.longBitsToDouble(in.readLong()));
}
break;
case SYBUNIQUE:
len = in.read();
if (len > 0) {
byte[] bytes = new byte[len];
in.read(bytes);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -