src/share/classes/javax/sql/rowset/serial/SerialClob.java

Print this page

        

*** 58,68 **** /** * Internal Clob representation if SerialClob is initialized with a * Clob. Null if SerialClob is initialized with a char[]. */ ! private final Clob clob; /** * The length in characters of this <code>SerialClob</code> object's * internal array of characters. * --- 58,68 ---- /** * Internal Clob representation if SerialClob is initialized with a * Clob. Null if SerialClob is initialized with a char[]. */ ! private Clob clob; /** * The length in characters of this <code>SerialClob</code> object's * internal array of characters. *
*** 74,84 **** * The original length in characters of this <code>SerialClob</code> * object's internal array of characters. * * @serial */ ! private final long origLen; /** * Constructs a <code>SerialClob</code> object that is a serialized version of * the given <code>char</code> array. * <p> --- 74,86 ---- * The original length in characters of this <code>SerialClob</code> * object's internal array of characters. * * @serial */ ! private long origLen; ! ! private boolean isFree =false; /** * Constructs a <code>SerialClob</code> object that is a serialized version of * the given <code>char</code> array. * <p>
*** 177,189 **** * Retrieves the number of characters in this <code>SerialClob</code> * object's array of characters. * * @return a <code>long</code> indicating the length in characters of this * <code>SerialClob</code> object's array of character ! * @throws SerialException if an error occurs */ public long length() throws SerialException { return len; } /** * Returns this <code>SerialClob</code> object's data as a stream --- 179,193 ---- * Retrieves the number of characters in this <code>SerialClob</code> * object's array of characters. * * @return a <code>long</code> indicating the length in characters of this * <code>SerialClob</code> object's array of character ! * @throws SerialException if an error occurs or ! * called after free() has been called. */ public long length() throws SerialException { + isFreed(); return len; } /** * Returns this <code>SerialClob</code> object's data as a stream
*** 191,203 **** * a stream is produced regardless of whether the <code>SerialClob</code> object * was created with a <code>Clob</code> object or a <code>char</code> array. * * @return a <code>java.io.Reader</code> object containing this * <code>SerialClob</code> object's data ! * @throws SerialException if an error occurs */ public java.io.Reader getCharacterStream() throws SerialException { return (java.io.Reader) new CharArrayReader(buf); } /** * Retrieves the <code>CLOB</code> value designated by this <code>SerialClob</code> --- 195,209 ---- * a stream is produced regardless of whether the <code>SerialClob</code> object * was created with a <code>Clob</code> object or a <code>char</code> array. * * @return a <code>java.io.Reader</code> object containing this * <code>SerialClob</code> object's data ! * @throws SerialException if an error occurs or ! * called after free() has been called. */ public java.io.Reader getCharacterStream() throws SerialException { + isFreed(); return (java.io.Reader) new CharArrayReader(buf); } /** * Retrieves the <code>CLOB</code> value designated by this <code>SerialClob</code>
*** 208,223 **** * a <code>char</code> array, a <code>SerialException</code> object is thrown. * * @return a <code>java.io.InputStream</code> object containing * this <code>SerialClob</code> object's data * @throws SerialException if this <code>SerialClob</code> object was not instantiated ! * with a <code>Clob</code> object ! * @throws SQLException if there is an error accessing the * <code>CLOB</code> value represented by the <code>Clob</code> object that was * used to create this <code>SerialClob</code> object */ public java.io.InputStream getAsciiStream() throws SerialException, SQLException { if (this.clob != null) { return this.clob.getAsciiStream(); } else { throw new SerialException("Unsupported operation. SerialClob cannot " + "return a the CLOB value as an ascii stream, unless instantiated " + --- 214,232 ---- * a <code>char</code> array, a <code>SerialException</code> object is thrown. * * @return a <code>java.io.InputStream</code> object containing * this <code>SerialClob</code> object's data * @throws SerialException if this <code>SerialClob</code> object was not instantiated ! * with a <code>Clob</code> object or called after free() has been ! * called. ! * @throws SQLException ! * if there is an error accessing the * <code>CLOB</code> value represented by the <code>Clob</code> object that was * used to create this <code>SerialClob</code> object */ public java.io.InputStream getAsciiStream() throws SerialException, SQLException { + isFreed(); if (this.clob != null) { return this.clob.getAsciiStream(); } else { throw new SerialException("Unsupported operation. SerialClob cannot " + "return a the CLOB value as an ascii stream, unless instantiated " +
*** 245,257 **** * <code>SerialClob</code> object * @return a <code>String</code> object containing a substring of * this <code>SerialClob</code> object beginning at the * given position and containing the specified number of * consecutive characters ! * @throws SerialException if either of the arguments is out of bounds */ public String getSubString(long pos, int length) throws SerialException { if (pos < 1 || pos > this.length()) { throw new SerialException("Invalid position in BLOB object set"); } --- 254,268 ---- * <code>SerialClob</code> object * @return a <code>String</code> object containing a substring of * this <code>SerialClob</code> object beginning at the * given position and containing the specified number of * consecutive characters ! * @throws SerialException if either of the arguments is out of bounds or called ! * after free() has been called. */ public String getSubString(long pos, int length) throws SerialException { + isFreed(); if (pos < 1 || pos > this.length()) { throw new SerialException("Invalid position in BLOB object set"); }
*** 285,299 **** --- 296,312 ---- * begins, starting the search at the specified position; * <code>-1</code> if the given <code>String</code> object is * not found or the starting position is out of bounds; position * numbering for the return value starts at <code>1</code> * @throws SerialException if an error occurs locating the String signature + * or called after free() has been called. * @throws SQLException if there is an error accessing the Blob value * from the database. */ public long position(String searchStr, long start) throws SerialException, SQLException { + isFreed(); if (start < 1 || start > len) { return -1; }
*** 330,344 **** --- 343,359 ---- * greater than the length of this <code>SerialClob</code> object * @return the position at which the given <code>Clob</code> * object begins in this <code>SerialClob</code> object, * at or after the specified starting position * @throws SerialException if an error occurs locating the Clob signature + * or called after free() has been called. * @throws SQLException if there is an error accessing the Blob value * from the database */ public long position(Clob searchStr, long start) throws SerialException, SQLException { + isFreed(); return position(searchStr.getSubString(1,(int)searchStr.length()), start); } /**
*** 355,367 **** * @return the number of characters written * @throws SerialException if there is an error accessing the * <code>CLOB</code> value; if an invalid position is set; if an * invalid offset value is set; if number of bytes to be written * is greater than the <code>SerialClob</code> length; or the combined ! * values of the length and offset is greater than the Clob buffer */ public int setString(long pos, String str) throws SerialException { return (setString(pos, str, 0, str.length())); } /** * Writes <code>len</code> characters of <code>str</code>, starting --- 370,385 ---- * @return the number of characters written * @throws SerialException if there is an error accessing the * <code>CLOB</code> value; if an invalid position is set; if an * invalid offset value is set; if number of bytes to be written * is greater than the <code>SerialClob</code> length; or the combined ! * values of the length and offset is greater than the Clob buffer or ! * called after free() has been called. */ public int setString(long pos, String str) throws SerialException { + isFreed(); + return (setString(pos, str, 0, str.length())); } /** * Writes <code>len</code> characters of <code>str</code>, starting
*** 380,393 **** * @return the number of characters written * @throws SerialException if there is an error accessing the * <code>CLOB</code> value; if an invalid position is set; if an * invalid offset value is set; if number of bytes to be written * is greater than the <code>SerialClob</code> length; or the combined ! * values of the length and offset is greater than the Clob buffer */ public int setString(long pos, String str, int offset, int length) throws SerialException { String temp = str.substring(offset); char cPattern[] = temp.toCharArray(); if (offset < 0 || offset > str.length()) { throw new SerialException("Invalid offset in byte array set"); --- 398,414 ---- * @return the number of characters written * @throws SerialException if there is an error accessing the * <code>CLOB</code> value; if an invalid position is set; if an * invalid offset value is set; if number of bytes to be written * is greater than the <code>SerialClob</code> length; or the combined ! * values of the length and offset is greater than the Clob buffer or ! * called after free() has been called. */ public int setString(long pos, String str, int offset, int length) throws SerialException { + isFreed(); + String temp = str.substring(offset); char cPattern[] = temp.toCharArray(); if (offset < 0 || offset > str.length()) { throw new SerialException("Invalid offset in byte array set");
*** 427,443 **** * * @param pos the position at which to start writing to the * <code>CLOB</code> object * @return the stream to which ASCII encoded characters can be written * @throws SerialException if SerialClob is not instantiated with a ! * Clob object that supports <code>setAsciiStream</code> * @throws SQLException if there is an error accessing the * <code>CLOB</code> value * @see #getAsciiStream */ public java.io.OutputStream setAsciiStream(long pos) throws SerialException, SQLException { if (this.clob != null) { return this.clob.setAsciiStream(pos); } else { throw new SerialException("Unsupported operation. SerialClob cannot " + "return a writable ascii stream\n unless instantiated with a Clob object " + --- 448,467 ---- * * @param pos the position at which to start writing to the * <code>CLOB</code> object * @return the stream to which ASCII encoded characters can be written * @throws SerialException if SerialClob is not instantiated with a ! * Clob object that supports <code>setAsciiStream</code> or ! * called after free() has been called. * @throws SQLException if there is an error accessing the * <code>CLOB</code> value * @see #getAsciiStream */ public java.io.OutputStream setAsciiStream(long pos) throws SerialException, SQLException { + isFreed(); + if (this.clob != null) { return this.clob.setAsciiStream(pos); } else { throw new SerialException("Unsupported operation. SerialClob cannot " + "return a writable ascii stream\n unless instantiated with a Clob object " +
*** 457,473 **** * @param pos the position at which to start writing to the * <code>CLOB</code> value * * @return a stream to which Unicode encoded characters can be written * @throws SerialException if the SerialClob is not instantiated with ! * a Clob object that supports <code>setCharacterStream</code> * @throws SQLException if there is an error accessing the * <code>CLOB</code> value * @see #getCharacterStream */ public java.io.Writer setCharacterStream(long pos) throws SerialException, SQLException { if (this.clob != null) { return this.clob.setCharacterStream(pos); } else { throw new SerialException("Unsupported operation. SerialClob cannot " + "return a writable character stream\n unless instantiated with a Clob object " + --- 481,500 ---- * @param pos the position at which to start writing to the * <code>CLOB</code> value * * @return a stream to which Unicode encoded characters can be written * @throws SerialException if the SerialClob is not instantiated with ! * a Clob object that supports <code>setCharacterStream</code> or ! * called after free() has been called. * @throws SQLException if there is an error accessing the * <code>CLOB</code> value * @see #getCharacterStream */ public java.io.Writer setCharacterStream(long pos) throws SerialException, SQLException { + isFreed(); + if (this.clob != null) { return this.clob.setCharacterStream(pos); } else { throw new SerialException("Unsupported operation. SerialClob cannot " + "return a writable character stream\n unless instantiated with a Clob object " +
*** 485,519 **** * * @param length the length, in bytes, to which the <code>CLOB</code> * value should be truncated * @throws SQLException if there is an error accessing the * <code>CLOB</code> value */ public void truncate(long length) throws SerialException { if (length > len) { ! throw new SerialException ! ("Length more than what can be truncated"); } else { len = length; // re-size the buffer if (len == 0) { buf = new char[] {}; } else { ! buf = (this.getSubString(1, (int)len)).toCharArray(); } } } ! public Reader getCharacterStream(long pos, long length) throws SQLException { ! throw new java.lang.UnsupportedOperationException("Not supported"); } public void free() throws SQLException { ! throw new java.lang.UnsupportedOperationException("Not supported"); } /** * The identifier that assists in the serialization of this <code>SerialClob</code> * object. --- 512,612 ---- * * @param length the length, in bytes, to which the <code>CLOB</code> * value should be truncated * @throws SQLException if there is an error accessing the * <code>CLOB</code> value + * @throws SerialException if called after free() has been called. */ public void truncate(long length) throws SerialException { + isFreed(); + if (length > len) { ! throw new SerialException("Length more than what can be truncated"); } else { len = length; // re-size the buffer if (len == 0) { buf = new char[] {}; } else { ! buf = (this.getSubString(1, (int) len)).toCharArray(); } } } ! /** ! * Returns a <code>Reader</code> object that contains a partial ! * <code>Clob</code> value, starting with the character specified by ! * pos, which is length characters in length. ! * ! * @param pos ! * the offset to the first character of the partial value ! * to be retrieved. The first character in the ! * <code>Clob</code> is at position 1. ! * @param length ! * the length in characters of the partial value to be ! * retrieved. ! * ! * @return Reader through which the partial <code>Clob</code> value ! * can be read. ! * @throws SQLException ! * if pos is less than 1 or if pos is greater than the ! * number of characters in the <code>Clob</code> or if ! * pos + length is greater than the number of characters ! * in the <code>Clob</code> ! * @throws SQLFeatureNotSupportedException ! * if the JDBC driver does not support this method ! * @throws SerialException if called after free() has been called. ! */ public Reader getCharacterStream(long pos, long length) throws SQLException { ! isFreed(); ! ! if (pos < 1 || pos > len) { ! throw new SerialException("Invalid pos in getCharacterStream"); ! } ! if ((pos - 1) + length > len) { ! throw new SerialException("pos + length greater than total number of bytes"); ! } ! return (java.io.Reader) new CharArrayReader(buf, (int) pos -1, (int)length); } + /** + * This method frees the <code>Clob</code> object and releases the + * resources the resources that it holds. The object is invalid once + * the <code>free</code> method is called. After <code>free</code> + * has been called, any attempt to invoke a method other than + * <code>free</code> will result in a <code>SQLException</code> being + * thrown. If <code>free</code> is called multiple times, the + * subsequent calls to <code>free<c/ode> are treated as a no-op. + * + * @throws SQLException if an error occurs releasing the <code>Clob</code>'s + * resources + * @throws SQLFeatureNotSupportedException if the JDBC driver does + * not support this method + */ public void free() throws SQLException { ! if (isFree == false) { ! len = -1; ! origLen = -1; ! buf = null; ! ! if (clob != null) { ! clob.free(); ! clob = null; ! } ! ! isFree = true; ! } ! } ! ! private void isFreed() throws SerialException { ! if (isFree == true) { ! throw new SerialException( ! "Unsupported operation. SerialClob cannot " ! + "execute this operation when it has already been freed by free()"); ! } } /** * The identifier that assists in the serialization of this <code>SerialClob</code> * object.