| /* |
| |
| Derby - Class org.apache.derby.impl.load.ImportClob |
| |
| 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.LimitReader; |
| import java.sql.Clob; |
| import java.sql.SQLException; |
| import java.io.Reader; |
| import java.io.IOException; |
| |
| /** |
| * This class implements <code > java.sql.CLOB interface </code>. |
| * Objects created using the <code> ImportClob </code> class are |
| * intended to be be used to create a clob object of the data stored |
| * in an import file. Only the routines that are needed to read the |
| * clob data for the clob columns by the inserts done through the VTI |
| * have real implementations, Other routines are dummy ones to satisfy |
| * <code> java.sql.Clob </code> interface. |
| */ |
| |
| class ImportClob implements java.sql.Clob { |
| |
| private ImportLobFile lobFile; |
| private long position; // postion in the import file in bytes. |
| private long length; // length in bytes |
| private long clobLength; // length of clob in chars. |
| private String clobData = null; |
| |
| |
| /** |
| * Create a import Clob 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 clob column data. |
| * @param length length of this clob object data in bytes. |
| */ |
| public ImportClob(ImportLobFile lobFile, long position, long length) |
| throws IOException |
| { |
| this.lobFile = lobFile; |
| this.position = position; |
| this.length = length; |
| this.clobLength = lobFile.getClobDataLength(position, length); |
| } |
| |
| |
| /** |
| * Create a Clob object, whose value is given as string. |
| * @param data String that contains the clob data. |
| */ |
| public ImportClob(String data) |
| { |
| clobData = data; |
| clobLength = data.length(); |
| } |
| |
| |
| /** |
| * Returns the number of characters in this <code>CLOB</code> object. |
| * @return length of the <code>CLOB</code> in characters |
| * @exception SQLException on any error. |
| */ |
| public long length() throws SQLException { |
| return clobLength; |
| } |
| |
| |
| /** |
| * Returns <code>CLOB</code> value designated by this |
| * <code>Clob</code> object as a <code> Reader </code>. |
| * |
| * @return a Reader containing the <code>CLOB</code> data. |
| * @exception SQLException if any error occurs while setting up |
| * this clob data in the import file as Reader. |
| * @see java.sql.Clob |
| */ |
| public java.io.Reader getCharacterStream() throws SQLException { |
| try { |
| Reader ir; |
| if(clobData != null) { |
| // the data is string is already in the user spefied code set. |
| ir = new java.io.StringReader(clobData); |
| // wrap the Reader with a LimitReader class, |
| // so that only the data of the clob length is read. |
| LimitReader lr = new LimitReader(ir); |
| lr.setLimit((int) clobLength); |
| return lr; |
| } else { |
| return lobFile.getCharacterStream(position, length); |
| } |
| } catch (Exception e) { |
| throw LoadError.unexpectedError(e); |
| } |
| } |
| |
| |
| |
| /** following rotines does not have implmentation because they |
| * 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 |
| * implementation is provided, an exception is thrown if it is |
| * called. |
| * |
| * @see java.sql.Clob |
| */ |
| public String getSubString(long pos, int length) 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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public java.io.InputStream getAsciiStream() 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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public long position(String searchstr, 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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public long position(Clob searchstr, 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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public int setString(long pos, String str) 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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public int setString(long pos, String str, 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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public java.io.OutputStream setAsciiStream(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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public java.io.Writer setCharacterStream(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 it is |
| * called. |
| * @see java.sql.Clob |
| */ |
| public void truncate(long len) throws SQLException { throw methodNotImplemented(); } |
| |
| /** Raise error, not used by import */ |
| public Reader getCharacterStream(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")) ; |
| } |
| } |
| |