Clob.java
上传用户:tanyanyong
上传日期:2013-06-23
资源大小:1355k
文件大小:7k
- /*
- Copyright (C) 2002 MySQL AB
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- 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
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- package com.mysql.jdbc;
- import java.io.ByteArrayInputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.Reader;
- import java.io.StringReader;
- import java.io.Writer;
- import java.sql.SQLException;
- /**
- * Simplistic implementation of java.sql.Clob for MySQL Connector/J
- *
- * @version $Id: Clob.java,v 1.5.2.3 2003/12/24 05:16:25 mmatthew Exp $
- * @author Mark Matthews
- */
- public class Clob implements java.sql.Clob, OutputStreamWatcher, WriterWatcher {
- private String charData;
- Clob(String charData) {
- this.charData = charData;
- }
- /**
- * @see java.sql.Clob#setAsciiStream(long)
- */
- public OutputStream setAsciiStream(long indexToWriteAt)
- throws SQLException {
- if (indexToWriteAt < 1) {
- throw new SQLException("indexToWriteAt must be >= 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- WatchableOutputStream bytesOut = new WatchableOutputStream();
- bytesOut.setWatcher(this);
- if (indexToWriteAt > 0) {
- bytesOut.write(this.charData.getBytes(), 0,
- (int) (indexToWriteAt - 1));
- }
- return bytesOut;
- }
- /**
- * @see java.sql.Clob#getAsciiStream()
- */
- public InputStream getAsciiStream() throws SQLException {
- if (this.charData != null) {
- return new ByteArrayInputStream(this.charData.getBytes());
- } else {
- return null;
- }
- }
- /**
- * @see java.sql.Clob#setCharacterStream(long)
- */
- public Writer setCharacterStream(long indexToWriteAt)
- throws SQLException {
- if (indexToWriteAt < 1) {
- throw new SQLException("indexToWriteAt must be >= 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- WatchableWriter writer = new WatchableWriter();
- writer.setWatcher(this);
- //
- // Don't call write() if nothing to write...
- //
-
- if (indexToWriteAt > 1) {
- writer.write(this.charData, 0, (int) (indexToWriteAt - 1));
- }
- return writer;
- }
- /**
- * @see java.sql.Clob#getCharacterStream()
- */
- public Reader getCharacterStream() throws SQLException {
- if (this.charData != null) {
- return new StringReader(this.charData);
- } else {
- return null;
- }
- }
- /**
- * @see java.sql.Clob#setString(long, String)
- */
- public int setString(long pos, String str) throws SQLException {
- if (pos < 1) {
- throw new SQLException("Starting position can not be < 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- if (str == null) {
- throw new SQLException("String to set can not be NULL", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- StringBuffer charBuf = new StringBuffer(this.charData);
- pos--;
- int strLength = str.length();
- charBuf.replace((int) pos, (int) (pos + strLength), str);
- this.charData = charBuf.toString();
- return strLength;
- }
- /**
- * @see java.sql.Clob#setString(long, String, int, int)
- */
- public int setString(long pos, String str, int offset, int len)
- throws SQLException {
- if (pos < 1) {
- throw new SQLException("Starting position can not be < 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- if (str == null) {
- throw new SQLException("String to set can not be NULL", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- StringBuffer charBuf = new StringBuffer(this.charData);
- pos--;
- String replaceString = str.substring(offset, len);
- charBuf.replace((int) pos, (int) (pos + replaceString.length()),
- replaceString);
- this.charData = charBuf.toString();
- return len;
- }
- /**
- * @see java.sql.Clob#getSubString(long, int)
- */
- public String getSubString(long startPos, int length)
- throws SQLException {
- if (startPos < 1) {
- throw new SQLException("CLOB start position can not be < 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- if (this.charData != null) {
- if (((startPos - 1) + length) > charData.length()) {
- throw new SQLException("CLOB start position + length can not be > length of CLOB",
- SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- return this.charData.substring((int) (startPos - 1), length);
- } else {
- return null;
- }
- }
- /**
- * @see java.sql.Clob#length()
- */
- public long length() throws SQLException {
- if (this.charData != null) {
- return this.charData.length();
- } else {
- return 0;
- }
- }
- /**
- * @see java.sql.Clob#position(String, long)
- */
- public long position(String stringToFind, long startPos)
- throws SQLException {
- if (startPos < 1) {
- throw new SQLException("Illegal starting position for search, '"
- + startPos + "'", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- if (this.charData != null) {
- if ((startPos - 1) > this.charData.length()) {
- throw new SQLException("Starting position for search is past end of CLOB",
- SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- int pos = this.charData.indexOf(stringToFind, (int) (startPos - 1));
- return (pos == -1) ? (-1) : (pos + 1);
- } else {
- return -1;
- }
- }
- /**
- * @see java.sql.Clob#position(Clob, long)
- */
- public long position(java.sql.Clob arg0, long arg1)
- throws SQLException {
- return position(arg0.getSubString(0L, (int) arg0.length()), arg1);
- }
- /**
- * @see com.mysql.jdbc.OutputStreamWatcher#streamClosed(byte[])
- */
- public void streamClosed(byte[] byteData) {
- this.charData = StringUtils.toAsciiString(byteData);
- }
- /**
- * @see java.sql.Clob#truncate(long)
- */
- public void truncate(long length) throws SQLException {
- if (length > this.charData.length()) {
- throw new SQLException("Cannot truncate CLOB of length "
- + this.charData.length()
- + " to length of "
- + length
- + ".");
- }
-
- this.charData = this.charData.substring(0, (int) length);
- }
- /**
- * @see com.mysql.jdbc.WriterWatcher#writerClosed(char[])
- */
- public void writerClosed(char[] charData) {
- this.charData = new String(charData);
- }
- }