Clob.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:7k
源码类别:

数据库编程

开发平台:

Java

  1. /*
  2.    Copyright (C) 2002 MySQL AB
  3.       This program is free software; you can redistribute it and/or modify
  4.       it under the terms of the GNU General Public License as published by
  5.       the Free Software Foundation; either version 2 of the License, or
  6.       (at your option) any later version.
  7.       This program is distributed in the hope that it will be useful,
  8.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.       GNU General Public License for more details.
  11.       You should have received a copy of the GNU General Public License
  12.       along with this program; if not, write to the Free Software
  13.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14.  */
  15. package com.mysql.jdbc;
  16. import java.io.ByteArrayInputStream;
  17. import java.io.InputStream;
  18. import java.io.OutputStream;
  19. import java.io.Reader;
  20. import java.io.StringReader;
  21. import java.io.Writer;
  22. import java.sql.SQLException;
  23. /**
  24.  * Simplistic implementation of java.sql.Clob for MySQL Connector/J
  25.  *
  26.  * @version $Id: Clob.java,v 1.5.2.3 2003/12/24 05:16:25 mmatthew Exp $
  27.  * @author Mark Matthews
  28.  */
  29. public class Clob implements java.sql.Clob, OutputStreamWatcher, WriterWatcher {
  30.     private String charData;
  31.     Clob(String charData) {
  32.         this.charData = charData;
  33.     }
  34.     /**
  35.      * @see java.sql.Clob#setAsciiStream(long)
  36.      */
  37.     public OutputStream setAsciiStream(long indexToWriteAt)
  38.         throws SQLException {
  39.         if (indexToWriteAt < 1) {
  40.             throw new SQLException("indexToWriteAt must be >= 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  41.         }
  42.         WatchableOutputStream bytesOut = new WatchableOutputStream();
  43.         bytesOut.setWatcher(this);
  44.         if (indexToWriteAt > 0) {
  45.             bytesOut.write(this.charData.getBytes(), 0,
  46.                 (int) (indexToWriteAt - 1));
  47.         }
  48.         return bytesOut;
  49.     }
  50.     /**
  51.      * @see java.sql.Clob#getAsciiStream()
  52.      */
  53.     public InputStream getAsciiStream() throws SQLException {
  54.         if (this.charData != null) {
  55.             return new ByteArrayInputStream(this.charData.getBytes());
  56.         } else {
  57.             return null;
  58.         }
  59.     }
  60.     /**
  61.      * @see java.sql.Clob#setCharacterStream(long)
  62.      */
  63.     public Writer setCharacterStream(long indexToWriteAt)
  64.         throws SQLException {
  65.         if (indexToWriteAt < 1) {
  66.             throw new SQLException("indexToWriteAt must be >= 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  67.         }
  68.         WatchableWriter writer = new WatchableWriter();
  69.         writer.setWatcher(this);
  70. //
  71. // Don't call write() if nothing to write...
  72. //
  73.         if (indexToWriteAt > 1) {
  74.             writer.write(this.charData, 0, (int) (indexToWriteAt - 1));
  75.         }
  76.         return writer;
  77.     }
  78.     /**
  79.      * @see java.sql.Clob#getCharacterStream()
  80.      */
  81.     public Reader getCharacterStream() throws SQLException {
  82.         if (this.charData != null) {
  83.             return new StringReader(this.charData);
  84.         } else {
  85.             return null;
  86.         }
  87.     }
  88.     /**
  89.      * @see java.sql.Clob#setString(long, String)
  90.      */
  91.     public int setString(long pos, String str) throws SQLException {
  92.         if (pos < 1) {
  93.             throw new SQLException("Starting position can not be < 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  94.         }
  95.         if (str == null) {
  96.             throw new SQLException("String to set can not be NULL", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  97.         }
  98.         StringBuffer charBuf = new StringBuffer(this.charData);
  99.         pos--;
  100.         int strLength = str.length();
  101.         charBuf.replace((int) pos, (int) (pos + strLength), str);
  102.         this.charData = charBuf.toString();
  103.         return strLength;
  104.     }
  105.     /**
  106.      * @see java.sql.Clob#setString(long, String, int, int)
  107.      */
  108.     public int setString(long pos, String str, int offset, int len)
  109.         throws SQLException {
  110.         if (pos < 1) {
  111.             throw new SQLException("Starting position can not be < 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  112.         }
  113.         if (str == null) {
  114.             throw new SQLException("String to set can not be NULL", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  115.         }
  116.         StringBuffer charBuf = new StringBuffer(this.charData);
  117.         pos--;
  118.         String replaceString = str.substring(offset, len);
  119.         charBuf.replace((int) pos, (int) (pos + replaceString.length()),
  120.             replaceString);
  121.         this.charData = charBuf.toString();
  122.         return len;
  123.     }
  124.     /**
  125.      * @see java.sql.Clob#getSubString(long, int)
  126.      */
  127.     public String getSubString(long startPos, int length)
  128.         throws SQLException {
  129.         if (startPos < 1) {
  130.             throw new SQLException("CLOB start position can not be < 1", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  131.         }
  132.         if (this.charData != null) {
  133.             if (((startPos - 1) + length) > charData.length()) {
  134.                 throw new SQLException("CLOB start position + length can not be > length of CLOB",
  135.                     SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  136.             }
  137.             return this.charData.substring((int) (startPos - 1), length);
  138.         } else {
  139.             return null;
  140.         }
  141.     }
  142.     /**
  143.      * @see java.sql.Clob#length()
  144.      */
  145.     public long length() throws SQLException {
  146.         if (this.charData != null) {
  147.             return this.charData.length();
  148.         } else {
  149.             return 0;
  150.         }
  151.     }
  152.     /**
  153.      * @see java.sql.Clob#position(String, long)
  154.      */
  155.     public long position(String stringToFind, long startPos)
  156.         throws SQLException {
  157.         if (startPos < 1) {
  158.             throw new SQLException("Illegal starting position for search, '"
  159.                 + startPos + "'", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  160.         }
  161.         if (this.charData != null) {
  162.             if ((startPos - 1) > this.charData.length()) {
  163.                 throw new SQLException("Starting position for search is past end of CLOB",
  164.                     SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
  165.             }
  166.             int pos = this.charData.indexOf(stringToFind, (int) (startPos - 1));
  167.             return (pos == -1) ? (-1) : (pos + 1);
  168.         } else {
  169.             return -1;
  170.         }
  171.     }
  172.     /**
  173.      * @see java.sql.Clob#position(Clob, long)
  174.      */
  175.     public long position(java.sql.Clob arg0, long arg1)
  176.         throws SQLException {
  177.         return position(arg0.getSubString(0L, (int) arg0.length()), arg1);
  178.     }
  179.     /**
  180.      * @see com.mysql.jdbc.OutputStreamWatcher#streamClosed(byte[])
  181.      */
  182.     public void streamClosed(byte[] byteData) {
  183.         this.charData = StringUtils.toAsciiString(byteData);
  184.     }
  185.     /**
  186.      * @see java.sql.Clob#truncate(long)
  187.      */
  188.     public void truncate(long length) throws SQLException {
  189.      if (length > this.charData.length()) {
  190.      throw new SQLException("Cannot truncate CLOB of length " 
  191.      + this.charData.length() 
  192. + " to length of " 
  193. + length 
  194. + ".");
  195.      }
  196.     
  197.         this.charData = this.charData.substring(0, (int) length);
  198.     }
  199.     /**
  200.      * @see com.mysql.jdbc.WriterWatcher#writerClosed(char[])
  201.      */
  202.     public void writerClosed(char[] charData) {
  203.         this.charData = new String(charData);
  204.     }
  205. }