Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * $Id: FBBlobField.java 58108 2013-05-28 18:48:18Z mrotteveel $
   *
   * Firebird Open Source J2ee connector - jdbc driver
   *
   * Distributable under LGPL license.
   * You may obtain a copy of the License at http://www.gnu.org/copyleft/lgpl.html
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * LGPL License for more details.
  *
  * This file was created by members of the firebird development team.
  * All individual contributions remain the Copyright (C) of those
  * individuals.  Contributors to this file are either listed here or
  * can be obtained from a CVS history command.
  *
  * All rights reserved.
  */
 package org.firebirdsql.jdbc.field;
 
 import java.io.*;
 import java.sql.Blob;
 import java.sql.Clob;
 
Describe class FBBlobField here.

Author(s):
Roman Rokytskyy
Version:
1.0
 
 public class FBBlobField extends FBField implements FBFlushableField {
     private FBBlob blob;
 
 	// Rather then hold cached data in the XSQLDAVar we will hold it in here.
 	private int length;
     private Reader characterStream;
     private byte[] bytes;
 
     FBBlobField(XSQLVAR fieldFieldDataProvider dataProviderint requiredTypethrows SQLException {
         super(fielddataProviderrequiredType);
     }
     
     public void close() throws SQLException {
         try {
             if ( != null.close();
         } catch(IOException ioex) {
             throw new FBSQLException(ioex);
         } finally {       
             // forget this blob instance, resource waste
             // but simplifies our life. BLOB handle will be
             // released by a server automatically later
             
              = null;
              = null;
              = null;
              = null;
              = 0;
         }
     }
 
     public Blob getBlob() throws SQLException {
         if ( != nullreturn ;
         final byte[] bytes = getFieldData();
         if (bytes == nullreturn ;
 
         /*@todo convert this into a method of FirebirdConnection */
          = new FBBlob(.decodeLongbytes ));
 
         return ;
     }
     
     public Clob getClob() throws SQLException {
     	FBBlob blob = (FBBlobgetBlob();
     	if (blob == return ;
     	return new FBClob(blob);
     }
 
     public InputStream getAsciiStream() throws SQLException {
         return getBinaryStream();
     }
 
     public InputStream getBinaryStream() throws SQLException {
         // getBinaryStream() is not defined for BLOB types, only for BINARY
         if (. < 0)
             throw (SQLException)createException(
                 ).fillInStackTrace();
         
         Blob blob = getBlob();
         if (blob == return ;
 
         return blob.getBinaryStream();
     }
    public byte[] getBytes() throws SQLException {
        // getBytes() is not defined for BLOB types, only for BINARY
//        if (field.sqlsubtype < 0)
//            throw (SQLException)createException(
//                BYTES_CONVERSION_ERROR);
        return getBytesInternal();
    }
    
    public byte[] getBytesInternal() throws SQLException {
        final byte[] blobIdBuffer = getFieldData();
        if (blobIdBuffer == nullreturn ;
        
        final long blobId = .decodeLong(blobIdBuffer);
        Object syncObject = ((Synchronizable)getBlob()).getSynchronizationObject();
        synchronized (syncObject) {
            try {
                final IscBlobHandle blobHandle = .openBlob(blobId.);
                
                try {
                    final int blobLength = .getBlobLength(blobHandle);
                    final int bufferLength = .getBlobBufferLength();
                    final byte[] resultBuffer = new byte[blobLength];
                    
                    int offset = 0;
                    
                    while (offset < blobLength) {
                        final byte[] segmentBuffer = .getBlobSegment(blobHandlebufferLength);
                        
                        if (segmentBuffer.length == 0) {
                            // unexpected EOF
                            throw (SQLExceptioncreateException();
                        }
                        
                        System.arraycopy(segmentBuffer, 0, resultBufferoffsetsegmentBuffer.length);
                        offset += segmentBuffer.length;
                    }
                    
                    return resultBuffer;
                    
                } finally {
                    .closeBlob(blobHandle);
                }
            } catch (GDSException e) {
                throw new FBSQLException(e);
            }
        }
    }
    public byte[] getCachedData() throws SQLException {
        if (getFieldData() != null) {
            return getBytesInternal();
        } else if ( != null) {
            return ;
        } else {
            return ;
        }
    }
    
        if (getFieldData() == null
            return new FBFlushableField.CachedObject();
        final byte[] bytesInternal = getBytesInternal();
        return new CachedObject(bytesInternalnullnullbytesInternal.length);
    }
    
    public void setCachedObject(FBFlushableField.CachedObject cachedObjectthrows SQLException {
        // setNull() to reset field to empty state
        setNull();
         = cachedObject.bytes;
         = cachedObject.binaryStream;
         = cachedObject.characterStream;
         = cachedObject.length;
    }
    public String getString() throws SQLException {
        // getString() is not defined for BLOB fields, only for BINARY
        if (. < 0)
        Blob blob = getBlob();
        if (blob == return ;
        return .decodeString(getBytes(), );
    }
    public InputStream getUnicodeStream() throws SQLException {
        return getBinaryStream();
    }
    //--- setXXX methods
    public void setAsciiStream(InputStream inint lengththrows SQLException {
        setBinaryStream(inlength);
    }
    public void setCharacterStream(Reader inint lengththrows SQLException {
        // setNull() to reset field to empty state
        setNull();
        if (in != ) {
             = in;
            this. = length;
        }
    }
    public void setBinaryStream(InputStream inint lengththrows SQLException {
        // setNull() to reset field to empty state
        setNull();
        if (in != ) {
             = in;
            this. = length;
        }
    }
    
    public void flushCachedData() throws SQLException {
        if ( != null)
            copyBinaryStream();
        else if ( != null)
        else if ( != null)
            copyBytes();
        else if ( == null)
            setNull();
        
        this. = null;
        this. = null;
        this. = null;
        this. = 0;
    }
    
    private void copyBinaryStream(InputStream inint lengththrows SQLException {
        FBBlob blob =  new FBBlob();
        blob.copyStream(inlength);
        setFieldData(.encodeLong(blob.getBlobId()));
    }
    private void copyCharacterStream(Reader inint lengthString encodingthrows SQLException {
        FBBlob blob =  new FBBlob();
        blob.copyCharacterStream(inlengthencoding);
        setFieldData(.encodeLong(blob.getBlobId()));
    }
    
    private void copyBytes(byte[] bytesint lengththrows SQLException {
        FBBlob blob = new FBBlob();
        blob.copyBytes(bytes, 0, length);
        setFieldData(.encodeLong(blob.getBlobId()));
    }
    
    public void setBytes(byte[] valuethrows SQLException {
        // setNull() to reset field to empty state
        setNull();
        if (value != ) {
             = value;
             = value.length;
        }
    }
    public void setString(String valuethrows SQLException {
        if (value == ) {
            setNull();
            return;
        }
        
    }
    public void setUnicodeStream(InputStream inint lengththrows SQLException {
        setBinaryStream(inlength);
    }
    public void setBlob(FBBlob blobthrows SQLException {
        // setNull() to reset field to empty state
        setNull();
        setFieldData(.encodeLong(blob.getBlobId()));
        this. = blob;
    }
    
    public void setClob(FBClob clobthrows SQLException {
    	FBBlob blob = clob.getWrappedBlob();
    	setBlob(blob);
    }
    public void setNull() {
        super.setNull();
        try {
            if ( != null.close();
        } catch (IOException e) {
            //ignore
        }
         = null;
         = null;
         = null;
         = null;
         = 0;
    }
New to GrepCode? Check out our FAQ X