001: // jTDS JDBC Driver for Microsoft SQL Server and Sybase
002: // Copyright (C) 2004 The jTDS Project
003: //
004: // This library is free software; you can redistribute it and/or
005: // modify it under the terms of the GNU Lesser General Public
006: // License as published by the Free Software Foundation; either
007: // version 2.1 of the License, or (at your option) any later version.
008: //
009: // This library is distributed in the hope that it will be useful,
010: // but WITHOUT ANY WARRANTY; without even the implied warranty of
011: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: // Lesser General Public License for more details.
013: //
014: // You should have received a copy of the GNU Lesser General Public
015: // License along with this library; if not, write to the Free Software
016: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: //
018: package net.sourceforge.jtds.test;
019:
020: import java.sql.*;
021: import java.io.*;
022:
023: /**
024: * Test case to illustrate use of READTEXT for text and image columns.
025: *
026: * @version 1.0
027: */
028: public class ReadTextTest extends TestBase {
029: public ReadTextTest(String name) {
030: super (name);
031: }
032:
033: public void testReadText() throws Exception {
034: byte[] byteBuf = new byte[5000]; // Just enough to require more than one READTEXT
035:
036: for (int i = 0; i < byteBuf.length; i++) {
037: byteBuf[i] = (byte) i;
038: }
039:
040: StringBuffer strBuf = new StringBuffer(5000);
041:
042: for (int i = 0; i < 100; i++) {
043: strBuf
044: .append("This is a test line of text that is 50 chars ");
045:
046: if (i < 10) {
047: strBuf.append('0');
048: }
049:
050: strBuf.append(i);
051: }
052:
053: String data = strBuf.toString();
054:
055: Statement stmt = con.createStatement();
056: stmt
057: .execute("CREATE TABLE #TEST (id int, t1 text, t2 ntext, t3 image)");
058:
059: PreparedStatement pstmt = con
060: .prepareStatement("INSERT INTO #TEST (id, t1, t2, t3) VALUES (?, ?, ?, ?)");
061:
062: pstmt.setInt(1, 1);
063:
064: try {
065: pstmt.setAsciiStream(2, new ByteArrayInputStream(strBuf
066: .toString().getBytes("US-ASCII")), strBuf.length());
067: pstmt.setCharacterStream(3, new StringReader(strBuf
068: .toString()), strBuf.length());
069: pstmt.setBinaryStream(4, new ByteArrayInputStream(byteBuf),
070: byteBuf.length);
071: } catch (UnsupportedEncodingException e) {
072: // Should never happen
073: }
074:
075: assertEquals("First insert failed", 1, pstmt.executeUpdate());
076: pstmt.setInt(1, 2);
077:
078: try {
079: pstmt.setCharacterStream(2, new StringReader(strBuf
080: .toString()), strBuf.length());
081: pstmt.setAsciiStream(3, new ByteArrayInputStream(strBuf
082: .toString().getBytes("US-ASCII")), strBuf.length());
083: pstmt.setBinaryStream(4, new ByteArrayInputStream(byteBuf),
084: byteBuf.length);
085: } catch (UnsupportedEncodingException e) {
086: // Should never happen
087: }
088:
089: assertEquals("Second insert failed", 1, pstmt.executeUpdate());
090:
091: // Read back the normal way
092: ResultSet rs = stmt.executeQuery("SELECT * FROM #TEST");
093: validateReadTextResult(rs, data, byteBuf);
094:
095: // Read back using READTEXT
096: // FIXME - Trigger use of READTEXT
097: rs = stmt.executeQuery("SELECT * FROM #TEST");
098: validateReadTextResult(rs, data, byteBuf);
099:
100: pstmt.close();
101: stmt.close();
102: }
103:
104: private void validateReadTextResult(ResultSet rs, String data,
105: byte[] byteBuf) throws Exception {
106: assertNotNull(rs);
107:
108: while (rs.next()) {
109: switch (rs.getInt(1)) {
110: case 1:
111: InputStream in = rs.getAsciiStream(2);
112: compareInputStreams(new ByteArrayInputStream(data
113: .getBytes("ASCII")), in);
114:
115: Clob clob = rs.getClob(2);
116:
117: // Check the clob stream 3 times to ensure the stream is being
118: // reset properly
119: for (int count = 0; count < 3; count++) {
120: in = clob.getAsciiStream();
121: compareInputStreams(new ByteArrayInputStream(data
122: .getBytes("ASCII")), in);
123: }
124:
125: Reader rin = rs.getCharacterStream(3);
126: compareReaders(new StringReader(data), rin);
127:
128: clob = rs.getClob(3);
129:
130: // Check the clob stream 3 times to ensure the stream is being
131: // reset properly
132: for (int count = 0; count < 3; count++) {
133: rin = clob.getCharacterStream();
134: compareReaders(new StringReader(data), rin);
135: }
136:
137: in = rs.getBinaryStream(4);
138: compareInputStreams(new ByteArrayInputStream(byteBuf),
139: in);
140:
141: Blob blob = rs.getBlob(4);
142:
143: // Check the blob stream 3 times to ensure the stream is being
144: // reset properly
145: for (int count = 0; count < 3; count++) {
146: in = blob.getBinaryStream();
147: compareInputStreams(new ByteArrayInputStream(
148: byteBuf), in);
149: }
150:
151: break;
152: case 2:
153: rin = rs.getCharacterStream(2);
154: compareReaders(new StringReader(data), rin);
155:
156: clob = rs.getClob(2);
157:
158: // Check the clob stream 3 times to ensure the stream is being
159: // reset properly
160: for (int count = 0; count < 3; count++) {
161: rin = clob.getCharacterStream();
162: compareReaders(new StringReader(data), rin);
163: }
164:
165: in = rs.getAsciiStream(3);
166: compareInputStreams(new ByteArrayInputStream(data
167: .getBytes("ASCII")), in);
168:
169: clob = rs.getClob(3);
170:
171: // Check the clob stream 3 times to ensure the stream is being
172: // reset properly
173: for (int count = 0; count < 3; count++) {
174: in = clob.getAsciiStream();
175: compareInputStreams(new ByteArrayInputStream(data
176: .getBytes("ASCII")), in);
177: }
178:
179: in = rs.getBinaryStream(4);
180: compareInputStreams(new ByteArrayInputStream(byteBuf),
181: in);
182:
183: blob = rs.getBlob(4);
184:
185: // Check the blob stream 3 times to ensure the stream is being
186: // reset properly
187: for (int count = 0; count < 3; count++) {
188: in = blob.getBinaryStream();
189: compareInputStreams(new ByteArrayInputStream(
190: byteBuf), in);
191: }
192:
193: break;
194: }
195: }
196:
197: rs.close();
198: }
199:
200: public static void main(String[] args) {
201: junit.textui.TestRunner.run(ReadTextTest.class);
202: }
203: }
|