KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > test > db > TestLob


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.test.db;
6
7 import java.io.ByteArrayInputStream JavaDoc;
8 import java.io.CharArrayReader JavaDoc;
9 import java.io.InputStream JavaDoc;
10 import java.io.Reader JavaDoc;
11 import java.io.StringReader JavaDoc;
12 import java.sql.Blob JavaDoc;
13 import java.sql.Clob JavaDoc;
14 import java.sql.Connection JavaDoc;
15 import java.sql.DatabaseMetaData JavaDoc;
16 import java.sql.PreparedStatement JavaDoc;
17 import java.sql.ResultSet JavaDoc;
18 import java.sql.Savepoint JavaDoc;
19 import java.sql.Statement JavaDoc;
20 import java.util.Random JavaDoc;
21
22 import org.h2.test.TestBase;
23 import org.h2.util.IOUtils;
24 import org.h2.util.StringUtils;
25
26 /**
27  * @author Thomas
28  */

29
30 public class TestLob extends TestBase {
31
32     public void test() throws Exception JavaDoc {
33         if(config.memory) {
34             return;
35         }
36         testLobTransactions(10);
37         testLobTransactions(10000);
38         testLobRollbackStop();
39         testLobCopy();
40         testLobHibernate();
41         testLobCopy(false);
42         testLobCopy(true);
43         testLobCompression(false);
44         testLobCompression(true);
45         testManyLobs();
46         testClob();
47         testUpdateLob();
48         testLobReconnect();
49         testLob(false);
50         testLob(true);
51         testJavaObject();
52     }
53     
54     private void testLobTransactions(int spaceLen) throws Exception JavaDoc {
55         if(config.logMode == 0) {
56             return;
57         }
58         deleteDb("lob");
59         Connection JavaDoc conn = reconnect(null);
60         conn.createStatement().execute("CREATE TABLE TEST(ID IDENTITY, DATA CLOB, DATA2 VARCHAR)");
61         conn.setAutoCommit(false);
62         Random JavaDoc random = new Random JavaDoc(0);
63         int rows = 0;
64         Savepoint JavaDoc sp = null;
65         int len = getSize(100, 400);
66         for(int i=0; i<len; i++) {
67             switch(random.nextInt(10)) {
68             case 0:
69                 trace("insert");
70                 conn.createStatement().execute("INSERT INTO TEST(DATA, DATA2) VALUES('"+i+"' || SPACE("+spaceLen+"), '"+i+"')");
71                 rows++;
72                 break;
73             case 1:
74                 if(rows > 0) {
75                     trace("delete");
76                     conn.createStatement().execute("DELETE FROM TEST WHERE ID=" + random.nextInt(rows));
77                 }
78                 break;
79             case 2:
80                 if(rows > 0) {
81                     trace("update");
82                     conn.createStatement().execute("UPDATE TEST SET DATA='x' || DATA, DATA2='x' || DATA2 WHERE ID=" + random.nextInt(rows));
83                 }
84                 break;
85             case 3:
86                 if(rows > 0) {
87                     trace("commit");
88                     conn.commit();
89                     sp = null;
90                 }
91                 break;
92             case 4:
93                 if(rows > 0) {
94                     trace("rollback");
95                     conn.rollback();
96                     sp = null;
97                 }
98                 break;
99             case 5:
100                 trace("savepoint");
101                 sp = conn.setSavepoint();
102                 break;
103             case 6:
104                 if(sp != null) {
105                     trace("rollback to savepoint");
106                     conn.rollback(sp);
107                 }
108                 break;
109             case 7:
110                 if(rows > 0) {
111                     trace("checkpoint");
112                     conn.createStatement().execute("CHECKPOINT");
113                     trace("shutdown immediately");
114                     conn.createStatement().execute("SHUTDOWN IMMEDIATELY");
115                     trace("shutdown done");
116                     conn = reconnect(null);
117                     conn.setAutoCommit(false);
118                     sp = null;
119                 }
120                 break;
121             }
122             ResultSet JavaDoc rs = conn.createStatement().executeQuery("SELECT * FROM TEST");
123             while(rs.next()) {
124                 String JavaDoc d1 = rs.getString("DATA").trim();
125                 String JavaDoc d2 = rs.getString("DATA2").trim();
126                 check(d1, d2);
127             }
128             
129         }
130         conn.close();
131     }
132
133     private void testLobRollbackStop() throws Exception JavaDoc {
134         if(config.logMode == 0) {
135             return;
136         }
137         deleteDb("lob");
138         Connection JavaDoc conn = reconnect(null);
139         conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, DATA CLOB)");
140         conn.createStatement().execute("INSERT INTO TEST VALUES(1, SPACE(10000))");
141         conn.setAutoCommit(false);
142         conn.createStatement().execute("DELETE FROM TEST");
143         conn.createStatement().execute("CHECKPOINT");
144         conn.createStatement().execute("SHUTDOWN IMMEDIATELY");
145         conn = reconnect(null);
146         ResultSet JavaDoc rs = conn.createStatement().executeQuery("SELECT * FROM TEST");
147         check(rs.next());
148         rs.getInt(1);
149         check(rs.getString(2).length(), 10000);
150         conn.close();
151     }
152     
153     private void testLobCopy() throws Exception JavaDoc {
154         deleteDb("lob");
155         Connection JavaDoc conn = reconnect(null);
156         Statement JavaDoc stat = conn.createStatement();
157         stat.execute("create table test(id int, data clob)");
158         stat.execute("insert into test values(1, space(1000));");
159         stat.execute("insert into test values(2, space(1000));");
160         stat.execute("create table test2(id int, data clob);");
161         stat.execute("insert into test2 select * from test;");
162         stat.execute("drop table test;");
163         stat.execute("select * from test2;");
164         stat.execute("update test2 set id=id;");
165         stat.execute("select * from test2;");
166         conn.close();
167     }
168     
169     private void testLobHibernate() throws Exception JavaDoc {
170         deleteDb("lob");
171         Connection JavaDoc conn0 = reconnect(null);
172
173         conn0.getAutoCommit();
174         conn0.setAutoCommit(false);
175         DatabaseMetaData JavaDoc dbMeta0 =
176         conn0.getMetaData();
177         dbMeta0.getDatabaseProductName();
178         dbMeta0.getDatabaseMajorVersion();
179         dbMeta0.getDatabaseProductVersion();
180         dbMeta0.getDriverName();
181         dbMeta0.getDriverVersion();
182         dbMeta0.supportsResultSetType(1004);
183         dbMeta0.supportsBatchUpdates();
184         dbMeta0.dataDefinitionCausesTransactionCommit();
185         dbMeta0.dataDefinitionIgnoredInTransactions();
186         dbMeta0.supportsGetGeneratedKeys();
187         conn0.getAutoCommit();
188         conn0.getAutoCommit();
189         conn0.commit();
190         conn0.setAutoCommit(true);
191         Statement JavaDoc stat0 =
192         conn0.createStatement();
193         stat0.executeUpdate("drop table CLOB_ENTITY if exists");
194         stat0.getWarnings();
195         stat0.executeUpdate("create table CLOB_ENTITY (ID bigint not null, SER_DATA clob, CLOB_DATA clob, primary key (ID))");
196         stat0.getWarnings();
197         stat0.close();
198         conn0.getWarnings();
199         conn0.clearWarnings();
200         conn0.setAutoCommit(false);
201         conn0.getAutoCommit();
202         conn0.getAutoCommit();
203         PreparedStatement JavaDoc prep0 =
204         conn0.prepareStatement("select max(ID) from CLOB_ENTITY");
205         ResultSet JavaDoc rs0 =
206         prep0.executeQuery();
207         rs0.next();
208         rs0.getLong(1);
209         rs0.wasNull();
210         rs0.close();
211         prep0.close();
212         conn0.getAutoCommit();
213         PreparedStatement JavaDoc prep1 =
214         conn0.prepareStatement("insert into CLOB_ENTITY (SER_DATA, CLOB_DATA, ID) values (?, ?, ?)");
215         prep1.setNull(1, 2005);
216         StringBuffer JavaDoc buff = new StringBuffer JavaDoc(10000);
217         for(int i=0; i<10000; i++) {
218             buff.append((char)('0' + (i%10)));
219         }
220         Reader JavaDoc x = new StringReader JavaDoc(buff.toString());
221         prep1.setCharacterStream(2, x, 10000);
222         prep1.setLong(3, 1);
223         prep1.addBatch();
224         prep1.executeBatch();
225         prep1.close();
226         conn0.getAutoCommit();
227         conn0.getAutoCommit();
228         conn0.commit();
229         conn0.isClosed();
230         conn0.getWarnings();
231         conn0.clearWarnings();
232         conn0.getAutoCommit();
233         conn0.getAutoCommit();
234         PreparedStatement JavaDoc prep2 =
235         conn0.prepareStatement("select clobholdin0_.ID as ID0_0_, clobholdin0_.SER_DATA as SER2_0_0_, clobholdin0_.CLOB_DATA as CLOB3_0_0_ from CLOB_ENTITY clobholdin0_ where clobholdin0_.ID=?");
236         prep2.setLong(1, 1);
237         ResultSet JavaDoc rs1 =
238         prep2.executeQuery();
239         rs1.next();
240         rs1.getCharacterStream("SER2_0_0_");
241         Clob JavaDoc clob0 =
242         rs1.getClob("CLOB3_0_0_");
243         rs1.wasNull();
244         rs1.next();
245         rs1.close();
246         prep2.getMaxRows();
247         prep2.getQueryTimeout();
248         prep2.close();
249         conn0.getAutoCommit();
250         Reader JavaDoc r = clob0.getCharacterStream();
251         for(int i=0; i<10000; i++) {
252             int ch = r.read();
253             if(ch != ('0' + (i%10))) {
254                 error("expected "+ (char)('0' + (i%10)) + " got: " + ch + " (" + (char)ch + ")");
255             }
256         }
257         int ch = r.read();
258         if(ch != -1) {
259             error("expected -1 got: " + ch );
260         }
261         conn0.close();
262     }
263
264     private void testLobCopy(boolean compress) throws Exception JavaDoc {
265         deleteDb("lob");
266         Connection JavaDoc conn;
267         conn = reconnect(null);
268         Statement JavaDoc stat = conn.createStatement();
269         if(compress) {
270             conn.createStatement().execute("SET COMPRESS_LOB LZF");
271         } else {
272             conn.createStatement().execute("SET COMPRESS_LOB NO");
273         }
274         conn = reconnect(conn);
275         stat = conn.createStatement();
276         ResultSet JavaDoc rs;
277         rs = stat.executeQuery("select value from information_schema.settings where NAME='COMPRESS_LOB'");
278         rs.next();
279         check(rs.getString(1), compress ? "LZF" : "NO");
280         checkFalse(rs.next());
281         stat.execute("create table test(text clob)");
282         stat.execute("create table test2(text clob)");
283         StringBuffer JavaDoc buff = new StringBuffer JavaDoc();
284         for(int i=0; i<1000; i++) {
285             buff.append(' ');
286         }
287         String JavaDoc spaces = buff.toString();
288         stat.execute("insert into test values('"+spaces+"')");
289         stat.execute("insert into test2 select * from test");
290         rs = stat.executeQuery("select * from test2");
291         rs.next();
292         check(rs.getString(1), spaces);
293         stat.execute("drop table test");
294         rs = stat.executeQuery("select * from test2");
295         rs.next();
296         check(rs.getString(1), spaces);
297         stat.execute("alter table test2 add column id int before text");
298         rs = stat.executeQuery("select * from test2");
299         rs.next();
300         check(rs.getString("text"), spaces);
301         conn.close();
302     }
303     
304     private void testLobCompression(boolean compress) throws Exception JavaDoc {
305         deleteDb("lob");
306         Connection JavaDoc conn;
307         conn = reconnect(null);
308         if(compress) {
309             conn.createStatement().execute("SET COMPRESS_LOB LZF");
310         } else {
311             conn.createStatement().execute("SET COMPRESS_LOB NO");
312         }
313         conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, C CLOB)");
314         PreparedStatement JavaDoc prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, ?)");
315         long time = System.currentTimeMillis();
316         int len = getSize(10, 40);
317         if(config.networked && config.big) {
318             len = 5;
319         }
320         StringBuffer JavaDoc buff = new StringBuffer JavaDoc();
321         for(int i=0; i<100; i++) {
322             buff.append(StringUtils.xmlNode("content", null, "This is a test " + i));
323         }
324         String JavaDoc xml = buff.toString();
325         for(int i=0; i<len; i++) {
326             prep.setInt(1, i);
327             prep.setString(2, xml + i);
328             prep.execute();
329         }
330         for(int i=0; i<len; i++) {
331             ResultSet JavaDoc rs = conn.createStatement().executeQuery("SELECT * FROM TEST");
332             while(rs.next()) {
333                 if(i==0) {
334                     check(xml + rs.getInt(1), rs.getString(2));
335                 } else {
336                     Reader JavaDoc r = rs.getCharacterStream(2);
337                     String JavaDoc result = IOUtils.readStringAndClose(r, -1);
338                     check(xml + rs.getInt(1), result);
339                 }
340             }
341         }
342         time = System.currentTimeMillis() - time;
343         trace("time: " + time +" compress: " + compress);
344         conn.close();
345     }
346     
347     private void testManyLobs() throws Exception JavaDoc {
348         deleteDb("lob");
349         Connection JavaDoc conn;
350         conn = reconnect(null);
351         conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, B BLOB, C CLOB)");
352         int len = getSize(10, 2000);
353         if(config.networked) {
354             len = 100;
355         }
356         
357         int start = 1, increment = 19;
358         
359         PreparedStatement JavaDoc prep = conn.prepareStatement("INSERT INTO TEST(ID, B, C) VALUES(?, ?, ?)");
360         for(int i=start; i<len; i+=increment) {
361             int l = i;
362             prep.setInt(1, i);
363             prep.setBinaryStream(2, getRandomStream(l, i), -1);
364             prep.setCharacterStream(3, getRandomReader(l, i), -1);
365             prep.execute();
366         }
367         
368         conn = reconnect(conn);
369         ResultSet JavaDoc rs = conn.createStatement().executeQuery("SELECT * FROM TEST ORDER BY ID");
370         while(rs.next()) {
371             int i = rs.getInt("ID");
372             Blob JavaDoc b = rs.getBlob("B");
373             Clob JavaDoc c = rs.getClob("C");
374             int l = i;
375             check(b.length(), l);
376             check(c.length(), l);
377             checkStream(b.getBinaryStream(), getRandomStream(l, i), -1);
378             checkReader(c.getCharacterStream(), getRandomReader(l, i), -1);
379         }
380         
381         prep = conn.prepareStatement("UPDATE TEST SET B=?, C=? WHERE ID=?");
382         for(int i=start; i<len; i+=increment) {
383             int l = i;
384             prep.setBinaryStream(1, getRandomStream(l, -i), -1);
385             prep.setCharacterStream(2, getRandomReader(l, -i), -1);
386             prep.setInt(3, i);
387             prep.execute();
388         }
389
390         conn = reconnect(conn);
391         rs = conn.createStatement().executeQuery("SELECT * FROM TEST ORDER BY ID");
392         while(rs.next()) {
393             int i = rs.getInt("ID");
394             Blob JavaDoc b = rs.getBlob("B");
395             Clob JavaDoc c = rs.getClob("C");
396             int l = i;
397             check(b.length(), l);
398             check(c.length(), l);
399             checkStream(b.getBinaryStream(), getRandomStream(l, -i), -1);
400             checkReader(c.getCharacterStream(), getRandomReader(l, -i), -1);
401         }
402         
403         conn.close();
404     }
405     
406     private void testClob() throws Exception JavaDoc {
407         deleteDb("lob");
408         Connection JavaDoc conn;
409         conn = reconnect(null);
410         conn.createStatement().execute("CREATE TABLE TEST(ID IDENTITY, C CLOB)");
411         PreparedStatement JavaDoc prep = conn.prepareStatement("INSERT INTO TEST(C) VALUES(?)");
412         prep.setCharacterStream(1, new CharArrayReader JavaDoc("Bohlen".toCharArray()), "Bohlen".length());
413         prep.execute();
414         prep.setCharacterStream(1, new CharArrayReader JavaDoc("B\u00f6hlen".toCharArray()), "B\u00f6hlen".length());
415         prep.execute();
416         prep.setCharacterStream(1, getRandomReader(501, 1), -1);
417         prep.execute();
418         prep.setCharacterStream(1, getRandomReader(1501, 2), 401);
419         prep.execute();
420         conn = reconnect(conn);
421         ResultSet JavaDoc rs = conn.createStatement().executeQuery("SELECT * FROM TEST ORDER BY ID");
422         rs.next();
423         check("Bohlen", rs.getString("C"));
424         checkReader(new CharArrayReader JavaDoc("Bohlen".toCharArray()), rs.getCharacterStream("C"), -1);
425         rs.next();
426         checkReader(new CharArrayReader JavaDoc("B\u00f6hlen".toCharArray()), rs.getCharacterStream("C"), -1);
427         rs.next();
428         checkReader(getRandomReader(501, 1), rs.getCharacterStream("C"), -1);
429         Clob JavaDoc clob = rs.getClob("C");
430         checkReader(getRandomReader(501, 1), clob.getCharacterStream(), -1);
431         check(clob.length(), 501);
432         rs.next();
433         checkReader(getRandomReader(401, 2), rs.getCharacterStream("C"), -1);
434         checkReader(getRandomReader(1500, 2), rs.getCharacterStream("C"), 401);
435         clob = rs.getClob("C");
436         checkReader(getRandomReader(1501, 2), clob.getCharacterStream(), 401);
437         checkReader(getRandomReader(401, 2), clob.getCharacterStream(), 401);
438         check(clob.length(), 401);
439         checkFalse(rs.next());
440         conn.close();
441     }
442     
443     private Connection JavaDoc reconnect(Connection JavaDoc conn) throws Exception JavaDoc {
444         long time = System.currentTimeMillis();
445         if(conn != null) {
446             conn.close();
447         }
448         conn = getConnection("lob");
449         trace("re-connect="+(System.currentTimeMillis()-time));
450         return conn;
451     }
452     
453     
454     void testUpdateLob() throws Exception JavaDoc {
455         deleteDb("lob");
456         Connection JavaDoc conn;
457         conn = reconnect(null);
458
459         PreparedStatement JavaDoc prep = conn.prepareStatement(
460                 "CREATE TABLE IF NOT EXISTS p( id int primary key, rawbyte BLOB ); ");
461         prep.execute();
462         prep.close();
463
464         prep = conn.prepareStatement("INSERT INTO p(id) VALUES(?);");
465         for (int i = 0; i < 10; i++) {
466             prep.setInt(1, i);
467             prep.execute();
468         }
469         prep.close();
470
471         prep = conn.prepareStatement("UPDATE p set rawbyte=? WHERE id=?");
472         for (int i = 0; i < 8; i++) {
473             prep.setBinaryStream(1, getRandomStream(10000, i), 0);
474             prep.setInt(2, i);
475             prep.execute();
476         }
477         prep.close();
478         conn.commit();
479
480         conn = reconnect(conn);
481
482         conn.setAutoCommit(true);
483         prep = conn.prepareStatement("UPDATE p set rawbyte=? WHERE id=?");
484         for (int i = 8; i < 10; i++) {
485             prep.setBinaryStream(1, getRandomStream(10000, i), 0);
486             prep.setInt(2, i);
487             prep.execute();
488         }
489         prep.close();
490
491         prep = conn.prepareStatement("SELECT * from p");
492         ResultSet JavaDoc rs = prep.executeQuery();
493         while (rs.next()) {
494             for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
495                 rs.getMetaData().getColumnName(i);
496                 rs.getString(i);
497             }
498         }
499         conn.close();
500     }
501     
502     void testLobReconnect() throws Exception JavaDoc {
503         deleteDb("lob");
504         Connection JavaDoc conn = reconnect(null);
505         Statement JavaDoc stat = conn.createStatement();
506         stat.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, TEXT CLOB)");
507         PreparedStatement JavaDoc prep;
508         prep = conn.prepareStatement("INSERT INTO TEST VALUES(1, ?)");
509         String JavaDoc s = new String JavaDoc(getRandomChars(10000, 1));
510         byte[] data = s.getBytes("UTF-8");
511         prep.setBinaryStream(1, new ByteArrayInputStream JavaDoc(data), 0);
512         prep.execute();
513        
514         conn = reconnect(conn);
515         stat = conn.createStatement();
516         ResultSet JavaDoc rs = stat.executeQuery("SELECT * FROM TEST WHERE ID=1");
517         rs.next();
518         checkStream(new ByteArrayInputStream JavaDoc(data), rs.getBinaryStream("TEXT"), -1);
519         
520         
521         prep = conn.prepareStatement("UPDATE TEST SET TEXT = ?");
522         s = new String JavaDoc(getRandomChars(10201, 1));
523         prep.setBinaryStream(1, new ByteArrayInputStream JavaDoc(data), 0);
524         prep.execute();
525
526         conn = reconnect(conn);
527         stat = conn.createStatement();
528         rs = stat.executeQuery("SELECT * FROM TEST WHERE ID=1");
529         rs.next();
530         checkStream(new ByteArrayInputStream JavaDoc(data), rs.getBinaryStream("TEXT"), -1);
531
532         stat.execute("DROP TABLE IF EXISTS TEST");
533         conn.close();
534     }
535     
536     void testLob(boolean clob) throws Exception JavaDoc {
537         deleteDb("lob");
538         Connection JavaDoc conn = reconnect(null);
539         conn = reconnect(conn);
540         Statement JavaDoc stat = conn.createStatement();
541         stat.execute("DROP TABLE IF EXISTS TEST");
542         PreparedStatement JavaDoc prep;
543         ResultSet JavaDoc rs;
544         long time;
545         stat.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, VALUE "+(clob?"CLOB":"BLOB")+")");
546         
547         int len = getSize(1, 1000);
548         if(config.networked && config.big) {
549             len = 100;
550         }
551         
552         time = System.currentTimeMillis();
553         prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, ?)");
554         for(int i=0; i<len; i+=(i+i+1)) {
555             prep.setInt(1, i);
556             int size = i*i;
557             if(clob) {
558                 prep.setCharacterStream(2, getRandomReader(size, i), 0);
559             } else {
560                 prep.setBinaryStream(2, getRandomStream(size, i), 0);
561             }
562             prep.execute();
563         }
564         trace("insert="+(System.currentTimeMillis()-time));
565         traceMemory();
566         conn = reconnect(conn);
567         
568         time = System.currentTimeMillis();
569         prep = conn.prepareStatement("SELECT ID, VALUE FROM TEST");
570         rs = prep.executeQuery();
571         while(rs.next()) {
572             int id = rs.getInt("ID");
573             int size = id*id;
574             if(clob) {
575                 Reader JavaDoc rt = rs.getCharacterStream(2);
576                 checkReader(rt, getRandomReader(size, id), -1);
577                 checkReader((Reader JavaDoc)rs.getObject(2), getRandomReader(size, id), -1);
578             } else {
579                 InputStream JavaDoc in = rs.getBinaryStream(2);
580                 checkStream(in, getRandomStream(size, id), -1);
581                 checkStream((InputStream JavaDoc)rs.getObject(2), getRandomStream(size, id), -1);
582             }
583         }
584         trace("select="+(System.currentTimeMillis()-time));
585         traceMemory();
586         
587         conn = reconnect(conn);
588         
589         time = System.currentTimeMillis();
590         prep = conn.prepareStatement("DELETE FROM TEST WHERE ID=?");
591         for(int i=0; i<len; i++) {
592             prep.setInt(1, i);
593             prep.executeUpdate();
594         }
595         trace("delete="+(System.currentTimeMillis()-time));
596         traceMemory();
597         conn = reconnect(conn);
598         
599         conn.setAutoCommit(false);
600         prep = conn.prepareStatement(
601             "INSERT INTO TEST VALUES(1, ?)");
602         if(clob) {
603             prep.setCharacterStream(1, getRandomReader(0, 0), 0);
604         } else {
605             prep.setBinaryStream(1, getRandomStream(0, 0), 0);
606         }
607         prep.execute();
608         conn.rollback();
609         prep.execute();
610         conn.commit();
611         
612         conn.createStatement().execute("DELETE FROM TEST WHERE ID=1");
613         conn.rollback();
614         conn.createStatement().execute("DELETE FROM TEST WHERE ID=1");
615         conn.commit();
616         
617         conn.createStatement().execute("DROP TABLE TEST");
618         conn.close();
619     }
620
621     void testJavaObject() throws Exception JavaDoc {
622         deleteDb("lob");
623         Connection JavaDoc conn = getConnection("lob");
624         conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, DATA OTHER)");
625         PreparedStatement JavaDoc prep = conn.prepareStatement("INSERT INTO TEST VALUES(1, ?)");
626         prep.setObject(1, new TestLobObject("abc"));
627         prep.execute();
628         ResultSet JavaDoc rs = conn.createStatement().executeQuery("SELECT * FROM TEST");
629         rs.next();
630         Object JavaDoc oa = rs.getObject(2);
631         TestLobObject a = (TestLobObject)oa;
632         Object JavaDoc ob = rs.getObject("DATA");
633         TestLobObject b = (TestLobObject)ob;
634         check(a.data, "abc");
635         check(b.data, "abc");
636         checkFalse(rs.next());
637         conn.close();
638     }
639
640     private void checkStream(InputStream JavaDoc a, InputStream JavaDoc b, int len) throws Exception JavaDoc {
641         // this doesn't actually read anything - just tests reading 0 bytes
642
a.read(new byte[0]);
643         b.read(new byte[0]);
644         a.read(new byte[10], 3, 0);
645         b.read(new byte[10], 0, 0);
646         
647         for(int i=0; len<0 || i<len; i++) {
648             int ca = a.read();
649             a.read(new byte[0]);
650             int cb = b.read();
651             check(ca, cb);
652             if(ca==-1) {
653                 break;
654             }
655         }
656         a.read(new byte[10], 3, 0);
657         b.read(new byte[10], 0, 0);
658         a.read(new byte[0]);
659         b.read(new byte[0]);
660         a.close();
661         b.close();
662     }
663     
664     private void checkReader(Reader JavaDoc a, Reader JavaDoc b, int len) throws Exception JavaDoc {
665         for(int i=0; len<0 || i<len; i++) {
666             int ca = a.read();
667             int cb = b.read();
668             check(ca, cb);
669             if(ca==-1) {
670                 break;
671             }
672         }
673         a.close();
674         b.close();
675     }
676     
677     private Reader JavaDoc getRandomReader(int len, int seed) {
678         return new CharArrayReader JavaDoc(getRandomChars(len, seed));
679     }
680     
681     private char[] getRandomChars(int len, int seed) {
682         Random JavaDoc random = new Random JavaDoc(seed);
683         char[] buff = new char[len];
684         for(int i=0; i<len; i++) {
685             char ch;
686             do {
687                 ch = (char)random.nextInt(Character.MAX_VALUE);
688                 // UTF8: String.getBytes("UTF-8") only returns 1 byte for 0xd800-0xdfff
689
} while(ch >= 0xd800 && ch <= 0xdfff);
690             buff[i] = ch;
691         }
692         return buff;
693     }
694     
695     private InputStream JavaDoc getRandomStream(int len, int seed) {
696         Random JavaDoc random = new Random JavaDoc(seed);
697         byte[] buff = new byte[len];
698         random.nextBytes(buff);
699         return new ByteArrayInputStream JavaDoc(buff);
700     }
701     
702 }
703
Popular Tags