001: // jTDS JDBC Driver for Microsoft SQL Server and Sybase
002: // Copyright (C) 2004 The jTDS Project
003: //
004: // This library is free software; you can redistribute it and/or
005: // modify it under the terms of the GNU Lesser General Public
006: // License as published by the Free Software Foundation; either
007: // version 2.1 of the License, or (at your option) any later version.
008: //
009: // This library is distributed in the hope that it will be useful,
010: // but WITHOUT ANY WARRANTY; without even the implied warranty of
011: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: // Lesser General Public License for more details.
013: //
014: // You should have received a copy of the GNU Lesser General Public
015: // License along with this library; if not, write to the Free Software
016: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: //
018: package net.sourceforge.jtds.jdbc;
019:
020: import java.io.InputStream;
021: import java.io.OutputStream;
022: import java.sql.Blob;
023: import java.sql.SQLException;
024:
025: import net.sourceforge.jtds.util.BlobBuffer;
026:
027: /**
028: * An in-memory or disk based representation of binary data.
029: *
030: * @author Brian Heineman
031: * @author Mike Hutchinson
032: * @version $Id: BlobImpl.java,v 1.31 2007/07/08 21:38:13 bheineman Exp $
033: */
034: public class BlobImpl implements Blob {
035: /**
036: * 0 length <code>byte[]</code> as initial value for empty
037: * <code>Blob</code>s.
038: */
039: private static final byte[] EMPTY_BLOB = new byte[0];
040:
041: /** The underlying <code>BlobBuffer</code>. */
042: private final BlobBuffer blobBuffer;
043:
044: /**
045: * Constructs a new empty <code>Blob</code> instance.
046: *
047: * @param connection a reference to the parent connection object
048: */
049: BlobImpl(ConnectionJDBC2 connection) {
050: this (connection, EMPTY_BLOB);
051: }
052:
053: /**
054: * Constructs a new <code>Blob</code> instance initialized with data.
055: *
056: * @param connection a reference to the parent connection object
057: * @param bytes the blob object to encapsulate
058: */
059: BlobImpl(ConnectionJDBC2 connection, byte[] bytes) {
060: if (bytes == null) {
061: throw new IllegalArgumentException("bytes cannot be null");
062: }
063:
064: blobBuffer = new BlobBuffer(connection.getBufferDir(),
065: connection.getLobBuffer());
066: blobBuffer.setBuffer(bytes, false);
067: }
068:
069: //
070: // ------ java.sql.Blob interface methods from here -------
071: //
072:
073: public InputStream getBinaryStream() throws SQLException {
074: return blobBuffer.getBinaryStream(false);
075: }
076:
077: public byte[] getBytes(long pos, int length) throws SQLException {
078: return blobBuffer.getBytes(pos, length);
079: }
080:
081: public long length() throws SQLException {
082: return blobBuffer.getLength();
083: }
084:
085: public long position(byte[] pattern, long start)
086: throws SQLException {
087: return blobBuffer.position(pattern, start);
088: }
089:
090: public long position(Blob pattern, long start) throws SQLException {
091: if (pattern == null) {
092: throw new SQLException(Messages
093: .get("error.blob.badpattern"), "HY009");
094: }
095: return blobBuffer.position(pattern.getBytes(1, (int) pattern
096: .length()), start);
097: }
098:
099: public OutputStream setBinaryStream(final long pos)
100: throws SQLException {
101: return blobBuffer.setBinaryStream(pos, false);
102: }
103:
104: public int setBytes(long pos, byte[] bytes) throws SQLException {
105: if (bytes == null) {
106: throw new SQLException(
107: Messages.get("error.blob.bytesnull"), "HY009");
108: }
109: return setBytes(pos, bytes, 0, bytes.length);
110: }
111:
112: public int setBytes(long pos, byte[] bytes, int offset, int len)
113: throws SQLException {
114: if (bytes == null) {
115: throw new SQLException(
116: Messages.get("error.blob.bytesnull"), "HY009");
117: }
118: // Force BlobBuffer to take a copy of the byte array
119: // In many cases this is wasteful but the user may
120: // reuse the byte buffer corrupting the original set
121: return blobBuffer.setBytes(pos, bytes, offset, len, true);
122: }
123:
124: public void truncate(long len) throws SQLException {
125: blobBuffer.truncate(len);
126: }
127: }
|