blob: e431b0672366925646796b8bd56cd8052b324b8a [file] [log] [blame]
/*
Derby - Class org.apache.derby.impl.load.ImportBlob
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package org.apache.derby.impl.load;
import org.apache.derby.iapi.services.io.LimitInputStream;
import org.apache.derby.iapi.util.StringUtil;
import java.sql.Blob;
import java.sql.SQLException;
import java.io.InputStream;
/**
* This class implements <code > java.sql.BLOB interface </code>.
* Objects created using the <code> ImportBlob </code> class are
* intended to be be used to create a blob object of the data stored
* in an import file or as an hex string. Only the routines that
* are needed read the blob data for the blob columns by the
* inserts done through the VTI have real implementations,
* Other routines are dummy ones to satisfy <code> java.sql.Blob </code>
* interface.
*/
class ImportBlob implements java.sql.Blob {
private ImportLobFile lobFile;
private long blobPosition;
private long blobLength;
private byte[] blobData = null;
/**
* Create a import Blob object, that reads <code> length </code> amount of
* data from an external file, starting at <code> position </code>.
* @param lobFile lob file resource object, using which data is read.
* @param position byte offset in the file, of this blob columb data.
* @param length length of this blob object data.
*/
public ImportBlob(ImportLobFile lobFile, long position, long length)
{
this.lobFile = lobFile;
this.blobPosition = position;
this.blobLength = length;
}
/**
* Create a import Blob object, whose value is the give hex data string.
* @param data byte array that contains the blob data.
*/
public ImportBlob(byte[] data)
{
blobData = data;
blobLength = data.length;
}
/**
* Returns the number of bytes in this <code>BLOB</code> object.
* @return length of the <code>BLOB</code> in bytes
* @exception SQLException on any error.
*/
public long length() throws SQLException {
return blobLength;
}
/**
* Returns <code>BLOB</code> value designated by this
* <code>Blob</code> object as a input stream.
*
* @return a stream containing the <code>BLOB</code> data
* @exception SQLException if any error occurs while setting up
* this blob data in the import file as stream.
*/
public java.io.InputStream getBinaryStream () throws SQLException
{
try {
InputStream fis;
if(blobData != null) {
fis = new java.io.ByteArrayInputStream(blobData);
// wrap the InputStream with a LimitInputStream class,
// only the length of the
LimitInputStream limitIn = new LimitInputStream(fis);
limitIn.setLimit((int) blobLength);
return limitIn;
} else {
return lobFile.getBinaryStream(blobPosition, blobLength);
}
} catch (Exception e) {
throw LoadError.unexpectedError(e);
}
}
/** following rotines does not have implmentation because there are not
* used by the VTI that is used to import the data.
*/
/**
* This routine is not used by the VTI to read the data, so no
* implementatio is provided , an exception is thrown if used.
*
* @see java.sql.Blob
*/
public byte[] getBytes(long pos, int length) throws SQLException { throw methodNotImplemented(); }
/**
* This routine is not used by the VTI to read the data, so no
* implementatio is provided , an exception is thrown if used.
*
* @see java.sql.Blob
*/
public long position(byte pattern[], long start) throws SQLException { throw methodNotImplemented(); }
/**
* This routine is not used by the VTI to read the data, so no
* implementation is provided , an exception is thrown if used.
*
* @see java.sql.Blob
*/
public long position(Blob pattern, long start) throws SQLException { throw methodNotImplemented(); }
/**
* This routine is not used by the VTI to read the data, so no
* implementation is provided , an exception is thrown if used.
*
* @see java.sql.Blob
*/
public int setBytes(long pos, byte[] bytes) throws SQLException { throw methodNotImplemented(); }
/**
* This routine is not used by the VTI to read the data, so no
* implementation is provided , an exception is thrown if used.
*
* @see java.sql.Blob
*/
public int setBytes(long pos, byte[] bytes, int offset, int len) throws SQLException { throw methodNotImplemented(); }
/**
* This routine is not used by the VTI to read the data, so no
* implementation is provided , an exception is thrown if used.
*
* @see java.sql.Blob
*/
public java.io.OutputStream setBinaryStream(long pos) throws SQLException { throw methodNotImplemented(); }
/**
* This routine is not used by the VTI to read the data, so no
* implementation is provided , an exception is thrown if used.
*
* @see java.sql.Blob
*/
public void truncate(long len) throws SQLException { throw methodNotImplemented(); }
/** Raise error, not used by import */
public InputStream getBinaryStream(long pos, long length) throws SQLException { throw methodNotImplemented(); }
/** Raise error, not used by import */
public void free() throws SQLException { throw methodNotImplemented(); }
/** Return an unimplemented feature error */
private SQLException methodNotImplemented()
{
return LoadError.unexpectedError( new Exception("Method not implemented")) ;
}
}