/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.synth.thread; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * The operation part of {@link TestMulti}. * Queries and updates a table. */ public class TestMultiNews extends TestMultiThread { private static final String PREFIX_URL = "http://feeds.wizbangblog.com/WizbangFullFeed?m="; private int len = 10000; private Connection conn; TestMultiNews(TestMulti base) throws SQLException { super(base); conn = base.getConnection(); } void operation() throws SQLException { if (random.nextInt(10) == 0) { conn.close(); conn = base.getConnection(); } else if (random.nextInt(10) == 0) { if (random.nextBoolean()) { conn.commit(); } else { conn.rollback(); } } else if (random.nextInt(10) == 0) { conn.setAutoCommit(random.nextBoolean()); } else { if (random.nextBoolean()) { PreparedStatement prep; if (random.nextBoolean()) { prep = conn.prepareStatement("SELECT * FROM NEWS WHERE LINK = ?"); } else { prep = conn.prepareStatement("SELECT * FROM NEWS WHERE VALUE = ?"); } prep.setString(1, PREFIX_URL + random.nextInt(len)); ResultSet rs = prep.executeQuery(); if (!rs.next()) { throw new SQLException("expected one row, got none"); } if (rs.next()) { throw new SQLException("expected one row, got more"); } } else { PreparedStatement prep = conn.prepareStatement("UPDATE NEWS SET STATE = ? WHERE FID = ?"); prep.setInt(1, random.nextInt(100)); prep.setInt(2, random.nextInt(len)); int count = prep.executeUpdate(); if (count != 1) { throw new SQLException("expected one row, got " + count); } } } } void begin() { // nothing to do } void end() throws SQLException { conn.close(); } void finalTest() { // nothing to do } void first() throws SQLException { Connection c = base.getConnection(); Statement stat = c.createStatement(); stat.execute("CREATE TABLE TEST (ID IDENTITY, NAME VARCHAR)"); stat.execute("CREATE TABLE NEWS (FID NUMERIC(19) PRIMARY KEY, COMMENTS LONGVARCHAR, " + "LINK VARCHAR(255), STATE INTEGER, VALUE VARCHAR(255))"); stat.execute("CREATE INDEX IF NOT EXISTS NEWS_GUID_VALUE_INDEX ON NEWS(VALUE)"); stat.execute("CREATE INDEX IF NOT EXISTS NEWS_LINK_INDEX ON NEWS(LINK)"); stat.execute("CREATE INDEX IF NOT EXISTS NEWS_STATE_INDEX ON NEWS(STATE)"); PreparedStatement prep = c.prepareStatement("INSERT INTO NEWS (FID, COMMENTS, LINK, STATE, VALUE) VALUES " + "(?, ?, ?, ?, ?) "); PreparedStatement prep2 = c.prepareStatement("INSERT INTO TEST (NAME) VALUES (?)"); for (int i = 0; i < len; i++) { int x = random.nextInt(10) * 128; StringBuilder buff = new StringBuilder(); while (buff.length() < x) { buff.append("Test "); buff.append(buff.length()); buff.append(' '); } String comment = buff.toString(); // FID prep.setInt(1, i); // COMMENTS prep.setString(2, comment); // LINK prep.setString(3, PREFIX_URL + i); // STATE prep.setInt(4, 0); // VALUE prep.setString(5, PREFIX_URL + i); prep.execute(); prep2.setString(1, comment); prep2.execute(); } } }