⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdsdata.java

📁 第三方的SQL Server and Sybase的jdbc dirver,速度更快
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                    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 + -