You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by my...@apache.org on 2007/01/31 00:27:53 UTC
svn commit: r501639 [2/2] - in
/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system: mailjdbc/
mailjdbc/data/ mailjdbc/schema/ mailjdbc/tasks/ mailjdbc/utils/ sttest/
sttest/data/ sttest/tools/ sttest/utils/
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/Sttest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/Sttest.java?view=auto&rev=501639
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/Sttest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/Sttest.java Tue Jan 30 15:27:51 2007
@@ -0,0 +1,528 @@
+/*
+ *
+ * Derby - Class org.apache.derbyTesting.system.sttest.Sttest
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ */
+
+package org.apache.derbyTesting.system.sttest;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Random;
+
+import org.apache.derby.tools.JDBCDisplayUtil;
+import org.apache.derby.tools.ij;
+import org.apache.derbyTesting.system.sttest.tools.MemCheck;
+import org.apache.derbyTesting.system.sttest.utils.Datatypes;
+import org.apache.derbyTesting.system.sttest.utils.Setup;
+import org.apache.derbyTesting.system.sttest.utils.StStatus;
+
+/*
+ * * Sttest.java * 'Sttest' is short for 'single table test.' Sttest.java
+ * supplies * the main entry point and the top level code for controlling the *
+ * actions of the test, including the ddl for the table and indexes. * The
+ * purpose of the test is to exercise the store code by running * updates on the
+ * single table for an indefinitely long time, with * an indefinitely large
+ * number of user connections, each randomly * executing one of a small number
+ * of update procedures with random * data. The test sets a minimum and maximum
+ * number of rows, builds * the table up to the minimum number of rows, and from
+ * that point * either gradually grows the table to the max size, or gradually *
+ * shrinks it to the min size. Periodically memory use is reported, * and the
+ * table is compressed, to keep performance from deteriorating.
+ */
+public class Sttest extends Thread {
+
+ static int loops = 200;
+
+ static int rowcount = 0;
+
+ static int testcount = 0;
+
+ static int connections_to_make = 250;
+
+ static Random rand;
+
+ static boolean increase = true;
+
+ static boolean not_finished = true;
+
+ static int targetmax = 100000; //build up to 1GB database
+
+ static int targetmin = 90000;
+
+ static int insertsize = 7;
+
+ static int updatesize = 1;
+
+ static int deletesize = 1;
+
+ static boolean fatal = false;
+
+ static int rows = 0;
+
+ static boolean countlock = false;
+
+ static int delete_freq = 1;
+
+ static int locker_id = -1;
+
+ static final int INIT = 0;
+
+ static final int GROW = 1;
+
+ static final int SHRINK = 2;
+
+ static int mode = INIT;
+
+ static int count_timer = 0;
+
+ static int inserts_to_try = 0;
+
+ static final int INITIAL_CONNECTIONS = 2; //initial connections should be
+
+ // low, otherwise deadlock will
+ // happen.
+
+ static boolean startByIJ = false;
+
+ static String dbURL = "jdbc:derby:testDB";
+
+ static String driver = "org.apache.derby.jdbc.EmbeddedDriver";
+
+ static StStatus status = null;
+
+ int thread_id;
+
+ int ind = 0;
+
+ public static void main(String[] args) throws SQLException, IOException,
+ InterruptedException, Exception, Throwable {
+ System.getProperties().put("derby.locks.deadlockTimeout", "60");
+ System.getProperties().put("derby.locks.waitTimeout", "200");
+ System.out.println("Test Sttest starting");
+ System.getProperties().put("derby.infolog.append", "true");
+ System.getProperties().put("derby.stream.error.logSeverityLevel", "0");
+ //get any properties user may have set in Sttest.properties file
+ //these will override any of those set above
+ userProperties();
+ Class.forName(driver).newInstance();
+ if (Setup.doit(dbURL) == false)
+ System.exit(1);
+ status = new StStatus();
+ sttTop();
+ }
+
+ static void userProperties() throws Throwable {
+ FileInputStream fileIn = null;
+ try {
+ fileIn = new FileInputStream("Sttest.properties");
+ } catch (Exception e) {
+ System.out
+ .println("user control file 'Sttest.properties' not found; using defaults");
+ }
+ if (fileIn != null) {
+ Properties props = new Properties();
+ props.load(fileIn);
+ fileIn.close();
+ String prop = null;
+ prop = props.getProperty("connections");
+ if (prop != null)
+ connections_to_make = Integer.parseInt(prop);
+ prop = props.getProperty("dbURL");
+ if (prop != null)
+ dbURL = prop;
+ prop = props.getProperty("driver");
+ if (prop != null)
+ driver = prop;
+ //allows us to get any other properties into the system
+ Properties sysprops = System.getProperties();
+ Enumeration list = props.propertyNames();
+ String s = null;
+ while (list.hasMoreElements()) {
+ s = (String) list.nextElement();
+ sysprops.put(s, props.getProperty(s));
+ }
+ }
+ System.out.println("driver = " + driver);
+ System.out.println("dbURL = " + dbURL);
+ System.out.println("connections = " + connections_to_make);
+ }
+
+ public static void sttTop() throws SQLException, IOException,
+ InterruptedException, Exception, Throwable {
+ rand = new Random();
+ Datatypes.rand = rand;
+ //harder to actually delete rows when there are
+ //more connections, so repeat operation more often
+ delete_freq = 1 + connections_to_make % 5;
+ initial_data();
+ Date d = new Date();
+ System.out.println("updates starting, loop " + loops + " " + d);
+ status.firstMessage(connections_to_make, d);
+ // check memory in separate thread-- allows us to monitor
+ // usage during database calls
+ // 200,000 msec = 3min, 20 sec delay between checks
+ MemCheck mc = new MemCheck(200000);
+ mc.start();
+ Sttest testsessions[] = new Sttest[connections_to_make];
+ for (int i = 0; i < connections_to_make; i++) {
+ testsessions[i] = new Sttest(i);
+ testsessions[i].start();
+ sleep(3000);
+ }
+ for (int i = 0; i < connections_to_make; i++) {
+ testsessions[i].join();
+ }
+ try {
+ mc.stopNow = true;
+ mc.join();
+ } catch (Throwable t) {
+ throw (t);
+ }
+ }
+
+ Sttest(int num) throws SQLException {
+ this.thread_id = num;
+ }
+
+ static synchronized void reset_loops(int myloopcount) {
+ if (myloopcount == loops)
+ loops--;
+ // otherwise some other thread got there first and reset it
+ }
+
+ // available to force synchronization of get_countlock(), ...
+ static synchronized void locksync() {
+ return;
+ }
+
+ static synchronized boolean get_countlock() {
+ locksync();
+ return (countlock);
+ }
+
+ static synchronized boolean set_countlock(boolean state) {
+ locksync();
+ if (state == true && countlock == true)
+ return (false);
+ countlock = state;
+ return (true);
+ }
+
+ static synchronized void changerowcount(int in) {
+ rowcount += in;
+ }
+
+ static synchronized void changerowcount2zero() {
+ rowcount = 0;
+ }
+
+ static void initial_data() throws Exception, Throwable {
+ System.out.println("start initial data");
+ Connection conn = null;
+ int rows = 0;
+ try {
+ conn = mystartJBMS();
+ } catch (Throwable t) {
+ throw (t);
+ }
+ // our goal is to get up to minimum table size
+ int x = Datatypes.get_table_count(conn);
+ if (x != -1) {
+ rows = x;
+ }
+ if (conn != null) {
+ conn.commit();
+ conn.close();
+ }
+ System.out.println("initial rowcount = " + rows);
+ rowcount = rows;
+ if (rows >= targetmin) {
+ mode = GROW;
+ System.out.println("initial data not needed");
+ return;
+ }
+ inserts_to_try = targetmin - rows;
+ System.out.println("inserts_to_try: " + inserts_to_try);
+ Sttest testthreads[] = new Sttest[INITIAL_CONNECTIONS];
+ for (int i = 0; i < INITIAL_CONNECTIONS; i++) {
+ testthreads[i] = new Sttest(i);
+ testthreads[i].start();
+ }
+ for (int i = 0; i < INITIAL_CONNECTIONS; i++) {
+ testthreads[i].join();
+ }
+ mode = GROW;
+ System.out.println("complete initial data");
+ return;
+ }
+
+ public void run() {
+ Connection conn = null;
+ Date d = null;
+ try {
+ conn = mystartJBMS();
+ } catch (Throwable t) {
+ return;
+ }
+ Runtime rt = null;
+ int tick = 0;
+ int ind2 = 0;
+ int myloops = loops;
+ while (not_finished) {
+ if (loops <= 0)
+ break;// done
+ // thread-private copy to be checked against global copy
+ // before attempting to update
+ myloops = loops;
+ if (fatal == true)
+ break;
+ if (mode == INIT && inserts_to_try <= 0) {
+ break;
+ }
+ // test rowcount
+ if (mode == GROW && rowcount > targetmax) {
+ System.out.println("hit targetmax with " + rowcount + " " + d);
+ d = new Date();
+ mode = SHRINK;
+ reset_loops(myloops);
+ insertsize = 1;
+ deletesize = 12;
+ if (set_countlock(true) == true) {
+ System.out.println("t" + thread_id + " counting");
+ try {
+ checkrowcount(conn);
+ MemCheck.showmem();
+ status.updateStatus();
+ } catch (Exception e) {
+ System.out.println("unexpected exception in rowcount");
+ set_countlock(false);
+ System.exit(1);
+ }
+ MemCheck.showmem();
+ }
+ set_countlock(false);
+ yield();
+ } else if (mode == GROW && rowcount >= targetmax) {
+ d = new Date();
+ System.out.println("hit targetmax with " + rowcount + " " + d);
+ mode = SHRINK;
+ insertsize = 1;
+ deletesize = 12;
+ } else if (mode == SHRINK && rowcount <= targetmin) {
+ d = new Date();
+ System.out.println("hit targetmin with " + rowcount + " " + d);
+ mode = GROW;
+ reset_loops(myloops);
+ insertsize = 8;
+ deletesize = 1;
+ if (set_countlock(true) == true) {
+ System.out.println("t" + thread_id + " counting");
+ try {
+ checkrowcount(conn);
+ MemCheck.showmem();
+ status.updateStatus();
+ } catch (Exception e) {
+ System.out.println("unexpected exception in rowcount");
+ set_countlock(false);
+ System.exit(1);
+ }
+ MemCheck.showmem();
+ }
+ set_countlock(false);
+ yield();
+ }
+ // don't interfere with count query
+ while (get_countlock() == true) {
+ try {
+ sleep(1000);
+ } catch (java.lang.InterruptedException ex) {
+ System.out.println("unexpected sleep interruption");
+ break;
+ }
+ }
+ try {
+ System.out.println("Thread " + thread_id);
+ if (mode == INIT)
+ ind = 0;
+ else
+ ind = Math.abs(rand.nextInt() % 3);
+ System.out.println("ind=" + ind);
+ switch (ind) {
+ case 0:
+ ind2 = Math.abs(rand.nextInt() % insertsize);
+ System.out.println("t" + thread_id + " insert "
+ + String.valueOf(ind2 + 1));
+ for (int i = 0; i <= ind2; i++) {
+ Datatypes.add_one_row(conn, thread_id);
+ conn.commit();
+ if (mode == INIT) {
+ inserts_to_try--;
+ }
+ yield();
+ changerowcount(1);
+ }
+ break;
+ case 1:
+ ind2 = Math.abs(rand.nextInt() % updatesize);
+ System.out.println("t" + thread_id + " update "
+ + String.valueOf(ind2 + 1));
+ for (int i = 0; i <= ind2; i++) {
+ Datatypes.update_one_row(conn, thread_id);
+ conn.commit();
+ yield();
+ }
+ break;
+ case 2:
+ ind2 = Math.abs(rand.nextInt() % deletesize);
+ System.out.println("t" + thread_id + " delete "
+ + String.valueOf(ind2 + 1));
+ int del_rows = 0;
+ del_rows = Datatypes.delete_some(conn, thread_id, ind2 + 1);
+ System.out.println("del_rows after calling delete_some:"
+ + del_rows);
+ yield();
+ changerowcount(-1 * del_rows);
+ //commits are done inside delete_some()
+ break;
+ } //end switch
+
+ } catch (SQLException se) {
+ if (se.getSQLState() == null)
+ se.printStackTrace();
+ if (se.getSQLState().equals("40001")) {
+ System.out.println("t" + thread_id + " deadlock op = "
+ + ind);
+ continue;
+ }
+ if (se.getSQLState().equals("40XL1")) {
+ System.out
+ .println("t" + thread_id + " timeout op = " + ind);
+ continue;
+ }
+ if (se.getSQLState().equals("23500")) {
+ System.out.println("t" + thread_id
+ + " duplicate key violation\n");
+ continue;
+ }
+ if (se.getSQLState().equals("23505")) {
+ System.out.println("t" + thread_id
+ + " duplicate key violation\n");
+ continue;
+ }
+ System.out.println("t" + thread_id
+ + " FAIL -- unexpected exception:");
+ JDBCDisplayUtil.ShowException(System.out, se);
+ fatal = true;
+ break;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ if (e.getMessage().equals("java.lang.ThreadDeath")) {
+ System.out.println("caught threaddeath and continuing\n");
+ } else {
+ fatal = true;
+ e.printStackTrace();
+ }
+ }
+ }//end while
+ try {
+ conn.close();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ System.out.println("Thread finished: " + thread_id);
+ }
+
+ static synchronized void checkrowcount(Connection conn)
+ throws java.lang.Exception {
+ int x = Datatypes.get_table_count(conn);
+ if (x == -1) { // count timed itself out
+ System.out.println("table count timed out");
+ } else {
+ System.out.println("rowcount by select: " + x
+ + " client rowcount = " + rowcount);
+ changerowcount(x - rowcount);
+ }
+ conn.commit();
+ }
+
+ static public Connection mystartJBMS() throws Throwable {
+ Connection conn = null;
+ if (startByIJ == true) {
+ conn = ij.startJBMS();
+ } else
+ try {
+ conn = DriverManager.getConnection(dbURL + ";create=false");
+ conn.setAutoCommit(false);
+ conn.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ System.out.println("got the connection in question");
+ } catch (SQLException se) {
+ System.out.println("connect failed for " + dbURL);
+ JDBCDisplayUtil.ShowException(System.out, se);
+ }
+ return (conn);
+ }
+
+ static synchronized void compress(Connection conn)
+ throws java.lang.Exception {
+ Statement s = null;
+ int tick = 1;
+ boolean locked = false;
+ while (locked == false) {
+ try {
+ s = conn.createStatement();
+ s.execute("lock table Datatypes in exclusive mode");
+ s.close();
+ locked = true;
+ } catch (SQLException se) {
+ // not now lockable
+ if (se.getSQLState().equals("X0X02")) {
+ Thread.sleep(20000);
+ if (tick++ < 10) {
+ System.out
+ .println("compress: cannot lock table, retrying "
+ + tick + "\n");
+ continue;
+ } else {
+ System.out.println("compress timed out\n");
+ return;
+ }
+ } else
+ JDBCDisplayUtil.ShowException(System.out, se);
+ }
+ }
+ System.out.println("compressing table");
+ try {
+ s = conn.createStatement();
+ s.execute("alter table Datatypes compress");
+ conn.commit();
+ System.out.println("table compressed");
+ } catch (SQLException se) {
+ System.out.println("compress table: FAIL -- unexpected exception:");
+ JDBCDisplayUtil.ShowException(System.out, se);
+ }
+ }
+}
\ No newline at end of file
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/Sttest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/data/Resource.jar
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/data/Resource.jar?view=auto&rev=501639
==============================================================================
Binary file - no diff available.
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/data/Resource.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/tools/MemCheck.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/tools/MemCheck.java?view=auto&rev=501639
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/tools/MemCheck.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/tools/MemCheck.java Tue Jan 30 15:27:51 2007
@@ -0,0 +1,62 @@
+/*
+ *
+ * Derby - Class org.apache.derbyTesting.system.sttest.MemCheck
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ */
+package org.apache.derbyTesting.system.sttest.tools;
+
+import java.util.Date;
+
+public class MemCheck extends Thread {
+ int delay = 200000;
+
+ public boolean stopNow = false;
+
+ public MemCheck() {
+ }
+
+ public MemCheck(int num) {
+ delay = num;
+ }
+
+ public void run() {
+ while (stopNow == false) {
+ try {
+ showmem();
+ sleep(delay);
+ } catch (java.lang.InterruptedException ie) {
+ System.out.println("memcheck: unexpected error in sleep");
+ }
+ }
+ }
+
+ public static void showmem() {
+ Runtime rt = null;
+ Date d = null;
+ rt = Runtime.getRuntime();
+ d = new Date();
+ System.out.println("total memory: " + rt.totalMemory() + " free: "
+ + rt.freeMemory() + " " + d.toString());
+ }
+
+ public static void main(String argv[]) {
+ System.out.println("MemCheck starting");
+ MemCheck mc = new MemCheck();
+ mc.run();
+ }
+}
\ No newline at end of file
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/tools/MemCheck.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/CompressTable.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/CompressTable.java?view=auto&rev=501639
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/CompressTable.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/CompressTable.java Tue Jan 30 15:27:51 2007
@@ -0,0 +1,116 @@
+/*
+ *
+ * Derby - Class org.apache.derbyTesting.system.sttest.CompressTable
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ */
+package org.apache.derbyTesting.system.sttest.utils;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Date;
+
+import org.apache.derby.tools.JDBCDisplayUtil;
+import org.apache.derby.tools.ij;
+import org.apache.derbyTesting.system.sttest.tools.MemCheck;
+
+/**
+ * This class is used to compress the table to retrieve the space after deletion
+ */
+public class CompressTable {
+
+ static boolean startByIJ = false;
+
+ static String dbURL = "jdbc:derby:testDB";
+
+ static String driver = "org.apache.derby.jdbc.EmbeddedDriver";
+
+ public static void main(String[] args) throws SQLException, IOException,
+ InterruptedException, Exception, Throwable {
+ Connection conn = null;
+ Date d = null;
+
+ Class.forName(driver).newInstance();
+
+ try {
+ conn = mystartJBMS();
+ } catch (Throwable t) {
+ return;
+ }
+ MemCheck mc = new MemCheck(200000);
+ mc.start();
+ compress(conn);
+ System.exit(0);
+ }
+
+ static public Connection mystartJBMS() throws Throwable {
+ Connection conn = null;
+ if (startByIJ == true)
+ conn = ij.startJBMS();
+ else
+ try {
+ conn = DriverManager.getConnection(dbURL + ";create=false");
+ conn.setAutoCommit(false);
+ } catch (SQLException se) {
+ System.out.println("connect failed for " + dbURL);
+ JDBCDisplayUtil.ShowException(System.out, se);
+ }
+ return (conn);
+ }
+
+ static synchronized void compress(Connection conn)
+ throws java.lang.Exception {
+ Statement s = null;
+ int tick = 1;
+ boolean locked = false;
+ while (locked == false) {
+ try {
+ s = conn.createStatement();
+ s.execute("lock table Datatypes in exclusive mode");
+ s.close();
+ locked = true;
+ } catch (SQLException se) {
+ // not now lockable
+ if (se.getSQLState().equals("X0X02")) {
+ Thread.sleep(20000);
+ if (tick++ < 10) {
+ System.out
+ .println("compress: cannot lock table, retrying "
+ + tick + "\n");
+ continue;
+ } else {
+ System.out.println("compress timed out\n");
+ return;
+ }
+ } else
+ JDBCDisplayUtil.ShowException(System.out, se);
+ }
+ }
+ System.out.println("compressing table");
+ try {
+ s = conn.createStatement();
+ s.execute("alter table Datatypes compress");
+ System.out.println("table compressed");
+ } catch (SQLException se) {
+ System.out.println("compress table: FAIL -- unexpected exception:");
+ JDBCDisplayUtil.ShowException(System.out, se);
+ }
+ }
+}
\ No newline at end of file
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/CompressTable.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Datatypes.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Datatypes.java?view=auto&rev=501639
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Datatypes.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Datatypes.java Tue Jan 30 15:27:51 2007
@@ -0,0 +1,720 @@
+/*
+
+ Derby - Class org.apache.derbyTesting.system.sttest.Datatypes
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ */
+
+package org.apache.derbyTesting.system.sttest.utils;
+
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Random;
+import java.util.Vector;
+import org.apache.derby.tools.JDBCDisplayUtil;
+
+
+/**
+ * This class is used to insert, delete and updated the rows
+ */
+public class Datatypes {
+
+ public static final int TCHAR = 0;
+
+ public static final int TBLOB = 1;
+
+ public static final int TCLOB = 2;
+
+ public static final int TDATE = 3;
+
+ public static final int TDECIMAL = 4;
+
+ public static final int TDECIMALNN = 5;
+
+ public static final int TDOUBLE = 6;
+
+ public static final int TFLOAT = 7;
+
+ public static final int TINT = 8;
+
+ public static final int TLONGINT = 9;
+
+ public static final int TNUMERICLARGE = 10;
+
+ public static final int TREAL = 11;
+
+ public static final int TSMALLINT = 12;
+
+ public static final int TTIME = 13;
+
+ public static final int TTIMESTAMP = 14;
+
+ public static final int TVARCHAR = 15;
+
+ public static final int NUMTYPES = 15;
+
+ static String[] fileName = new String[35];
+
+ static String[] fileName1 = new String[35];
+
+ static String[] fileName2 = new String[35];
+
+ static long[] fileLength = { 16644, 65949, 65675, 65675, 9894, 26651,
+ 37370, 9676, 32191, 26883, 52817, 34590, 59510, 52063, 19723, 9894,
+ 10937, 12522, 10962, 29815, 13605, 1620, 13800, 14606, 10126,
+ 14430, 21757, 7765, 11431, 14047, 10992, 20141, 11357, 8609, 23259 };
+
+ static long[] fileLength1 = { 6285, 6944, 58937, 28225, 89773, 31076,
+ 11577, 43729, 29501, 14044, 3258, 10590, 0, 2588, 3270, 3433, 4149,
+ 2778, 1529, 6672, 1918, 1308, 1899, 6143, 6554, 15456, 16617, 571,
+ 13657, 5000, 10000, 401, 401, 401, 401 };
+
+ public static String[] colnames = { "t_char", "t_blob", "t_clob", "t_date",
+ "t_decimal", "t_decimal_nn", "t_double", "t_float", "t_int",
+ "t_longint", "t_numeric_large", "t_real", "t_smallint", "t_time",
+ "t_timestamp", "t_varchar"
+
+ };
+
+ public static Random rand;
+
+ public static synchronized void add_one_row(Connection conn, int thread_id)
+ throws Exception {
+ try {
+ //initialize();
+ PreparedStatement ps = conn.prepareStatement(
+ " insert into Datatypes (id,t_char,t_blob," + "t_clob,"
+ + " t_date, t_decimal, t_decimal_nn, t_double, "
+ + " t_float, t_int, t_longint, t_numeric_large,"
+ + " t_real, t_smallint, t_time, t_timestamp,"
+ + " t_varchar) values ("
+ + " ?,?, ?,?, ?, ?,?, ?, ?, ?,?, ?, ?, ?, ?, ?,?)" //autoincrement
+ // feature
+ // added,
+ // so
+ // we
+ // need
+ // to
+ // specify
+ // the
+ // column
+ // name
+ // for prepared statement, otherwise auto increment
+ // column will think
+ // it is trying to update/insert a null value to the column.
+ , Statement.RETURN_GENERATED_KEYS);
+ int ind = rand.nextInt();
+ int id_ind = ind;
+ double x;
+ Date dt = new Date(1);
+ Time tt = new Time(1);
+ Timestamp ts = new Timestamp(1);
+ String cs = "asdf qwerqwer 12341234 ZXCVZXCVZXCV !@#$!@#$ asdfasdf 1 q a z asdf ASDF qwerasdfzxcvasdfqwer1234asd#";
+ boolean bo = false;
+ Vector vec = null;
+ Integer ji = null;
+ ps.setInt(1, ind);
+ // scramble the string
+ int i1 = Math.abs(ind % 100);
+ String cs2 = cs.substring(i1, 99) + cs.substring(0, i1);
+ int i2 = i1 < 89 ? i1 + 10 : i1;
+ ps.setString(2, cs2.substring(0, i2));
+ //"t_blob"
+ int j = (int) (Math.random() * 35);
+ fileName[j] = "p" + j + ".jpg";
+ InputStream fileIn = Datatypes.class
+ .getResourceAsStream(fileName[j]);
+ ps.setBinaryStream(3, fileIn, (int) fileLength[j]);
+ //"t_clob
+ int k = (int) (Math.random() * 35);
+ fileName1[k] = "t" + k + ".txt";
+ InputStream fileIn1 = Datatypes.class
+ .getResourceAsStream(fileName1[k]);
+ ps.setAsciiStream(4, fileIn1, (int) fileLength1[k]);
+ //"t_ndate"
+ dt.setTime(Math.abs(rand.nextLong() / 150000));
+ ps.setDate(5, dt);
+ //"t_decimal"
+ x = Math.abs(rand.nextInt() % 18);
+ if (x > 5)
+ x = 5;
+ ps.setDouble(6, Math.abs(rand.nextDouble() * Math.pow(10, x)));
+ //"t_decimal_nn"
+ ps.setDouble(7, rand.nextDouble());
+ //"t_double"
+ ps.setDouble(8, rand.nextDouble()
+ * Math.pow(10, Math.abs(rand.nextInt() % 300)));
+ //"t_float"
+ ps.setFloat(9, rand.nextFloat()
+ * (float) Math.pow(10, Math.abs(rand.nextInt() % 30)));
+ //"t_int"
+ ps.setInt(10, rand.nextInt());
+ //"t_longint"
+ ps.setLong(11, rand.nextLong());
+ //"t_numeric_large"
+ x = Math.abs(rand.nextInt() % 30);
+ if (x > 30)
+ x = 31;
+ ps.setDouble(12, Math.abs(rand.nextDouble() * Math.pow(10, x)));
+ //"t_real"
+ ps.setFloat(13, rand.nextFloat()
+ * (float) Math.pow(10, Math.abs(rand.nextInt() % 7)));
+ //"t_smallint"
+ ps.setInt(14, rand.nextInt() % (256 * 128));
+ //"t_time"
+ tt.setTime(Math.abs(rand.nextInt()));
+ ps.setTime(15, tt);
+ //"t_timestamp"
+ ts.setTime(Math.abs(rand.nextLong() / 50000));
+ ps.setTimestamp(16, ts);
+ //"t_varchar"
+ ps.setString(17, cs.substring(Math.abs(rand.nextInt() % 100)));
+ int rows = ps.executeUpdate();
+ if (rows == 1) {
+
+ System.out.println("t" + thread_id + " inserted row with id "
+ + id_ind);
+ ResultSet rs = ps.getGeneratedKeys();
+
+ while (rs.next()) {
+ ResultSetMetaData rsmd = rs.getMetaData();
+ int numCols = rsmd.getColumnCount();
+ }
+ } else
+ System.out.println("t" + thread_id + " insert failed");
+
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ }
+
+ //pick quantity number of rows randomly and delete them
+ public static int delete_some(Connection conn, int thread_id, int quantity)
+ throws Exception {
+ PreparedStatement ps = null;
+ int list[] = pick_some(conn, thread_id, quantity);
+ //delete them
+ int rows = 0;
+ try {
+ ps = conn.prepareStatement(" delete from Datatypes where id = ?");
+ for (int i = 0; i < quantity; i++) {
+ ps.setInt(1, list[i]);
+ rows += ps.executeUpdate();
+ System.out.println("t" + thread_id + " deleted "
+ + " row with id " + list[i]);
+ }
+ if (ps != null)
+ ps.close();
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ return (rows);
+ }
+ // all deletes in a single transaction, to force some overlap of
+ // transactions
+ // by different threads
+ conn.commit();
+ return (rows);
+ }
+
+ //get a random set of row ids
+ public static int[] pick_some(Connection conn, int thread_id, int quantity)
+ throws Exception {
+ System.out.println("quantity in pick_some is: " + quantity);
+ int ind = 0;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ //pick the rows
+ try {
+ ps = conn
+ .prepareStatement(" select id from Datatypes where id = ?");
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ return (null);
+ }
+ int list[] = new int[quantity];
+ int j = 0;
+ for (int i = 0; i < quantity; i++) {
+ ind = rand.nextInt();
+ try {
+ ps.setInt(1, ind);
+ rs = ps.executeQuery();
+ if (rs.next()) {
+ //keep trying till we get a good one
+ j = rs.getInt(1);
+ if (rs.wasNull()) {
+ System.out.println("rs.wasNull() ind is " + ind);
+ i--;
+ continue;
+ }
+ list[i] = j;
+
+ System.out.println("list[1] in picksome=:" + list[i]);
+ } else {
+ System.out.println("thread " + thread_id
+ + ", select for delete: no row found");
+ }
+ //don't worry about consistency; if row with this id
+ //gets changed by another thread we will just forge ahead;
+ //otherwise we gets lots of deadlocks
+ conn.commit();
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ return (null);
+ }
+ }
+ if (rs != null)
+ rs.close();
+ if (ps != null)
+ ps.close();
+ return (list);
+ }
+
+ public static void delete_one_row(Connection conn, int thread_id)
+ throws Exception {
+
+ PreparedStatement ps = null;
+ PreparedStatement ps2 = null;
+ String column = null;
+ int ind = 0;
+ ResultSet rs = null;
+ ind = Math.abs(rand.nextInt());
+ while (ind % NUMTYPES == TDECIMAL || ind % NUMTYPES == TVARCHAR
+ || ind % NUMTYPES == TCHAR)
+ ind = Math.abs(rand.nextInt());
+ column = colnames[ind % NUMTYPES];
+ try {
+ ps = conn.prepareStatement(" select cast (max (" + column + ") as "
+ + " char(120)) from Datatypes where " + column + " <= ? ");
+ ps2 = conn.prepareStatement(" delete from Datatypes where "
+ + column + " = ?");
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ return;
+ }
+ String ds = null;
+ String cs = "asdf qwerqwer 12341234 ZXCVZXCVZXCV !@#$!@#$ asdfasdf 1 q a z asdf ASDF qwerasdfzxcvasdfqwer1234asd#";
+ double d = 0.0;
+ float f = 0;
+ BigDecimal bdec = null;
+ switch (ind % NUMTYPES) {
+ case TCHAR:
+ ds = cs.substring(Math.abs(rand.nextInt() % 100));
+ ps.setString(1, ds);
+ break;
+ case TDATE:
+ Date dt = new Date(1);
+ dt.setTime(Math.abs(rand.nextLong() / 150000));
+ ps.setString(1, dt.toString());
+ ds = dt.toString();
+ break;
+ case TDECIMAL:
+ d = rand.nextDouble() * Math.pow(10, rand.nextInt() % 18);
+ bdec = new BigDecimal(d);
+ ps.setString(1, String.valueOf(bdec));
+ ds = String.valueOf(d);
+ break;
+ case TDECIMALNN:
+ d = rand.nextDouble();
+ bdec = new BigDecimal(d);
+ ps.setString(1, String.valueOf(bdec));
+ ds = String.valueOf(d);
+ break;
+ case TDOUBLE:
+ d = rand.nextDouble() * Math.pow(10, rand.nextInt() % 300);
+ ps.setString(1, String.valueOf(d));
+ ds = String.valueOf(d);
+ break;
+ case TFLOAT:
+ f = rand.nextFloat() * (float) Math.pow(10, rand.nextInt() % 30);
+ ps.setString(1, String.valueOf(f));
+ ds = String.valueOf(f);
+ break;
+ case TINT:
+ ps.setString(1, String.valueOf(rand.nextInt()));
+ ds = String.valueOf(rand.nextInt());
+ break;
+ case TLONGINT:
+ ps.setString(1, String.valueOf(rand.nextLong()));
+ ds = String.valueOf(rand.nextLong());
+ break;
+ case TNUMERICLARGE:
+ d = rand.nextDouble() * Math.pow(10, rand.nextInt() % 50);
+ bdec = new BigDecimal(d);
+ ps.setString(1, String.valueOf(bdec));
+ ds = String.valueOf(d);
+ break;
+ case TREAL:
+ f = rand.nextFloat() * (float) Math.pow(10, rand.nextInt() % 7);
+ ps.setString(1, String.valueOf(f));
+ ds = String.valueOf(f);
+ break;
+ case TSMALLINT:
+ int i = rand.nextInt() % (256 * 128);
+ ps.setString(1, String.valueOf(i));
+ ds = String.valueOf(i);
+ break;
+ case TTIME:
+ Time tt = new Time(1);
+ tt.setTime(Math.abs(rand.nextInt()));
+ ps.setString(1, "time'" + tt.toString() + "'");
+ ds = "time'" + tt.toString() + "'";
+ break;
+ case TTIMESTAMP:
+ Timestamp ts = new Timestamp(1);
+ ts.setTime(Math.abs(rand.nextLong() / 50000));
+ ps.setString(1, "timestamp'" + ts.toString() + "'");
+ ds = "timestamp'" + ts.toString() + "'";
+ break;
+ case TVARCHAR:
+ ds = cs.substring(Math.abs(rand.nextInt() % 100));
+ ps.setString(1, ds);
+ break;
+ }
+ System.out.println("t" + thread_id + " delete " + column
+ + " select seed " + ds);
+ String ds3 = null;
+ String ds4 = null;
+ int rows = 0;
+ boolean cleanuponly = false;
+ try {
+ rs = ps.executeQuery();
+ if (rs.next()) {
+ ds3 = rs.getString(1);
+ if (rs.wasNull()) {
+ cleanuponly = true;
+ } else {
+ ds4 = ds3.trim();
+ ds3 = ds4;
+ }
+ }
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ if (ps != null)
+ try {
+ ps.close();
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ if (rs != null)
+ try {
+ rs.close();
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ if (cleanuponly == false) {
+ System.out.println("t" + thread_id + " delete where " + column
+ + " = " + ds3);
+ try {
+ ps2.setString(1, ds3);
+ rows = ps2.executeUpdate();
+
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+
+ if (rows > 0)
+ System.out.println("t" + thread_id + " deleted " + rows
+ + " row(s)");
+ else
+ System.out.println("t" + thread_id + " delete failed.");
+ }
+ if (ps2 != null)
+ try {
+ ps2.close();
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ }
+
+ public static synchronized void update_one_row(Connection conn,
+ int thread_id) throws Exception {
+ PreparedStatement ps2 = null;
+ Statement stmt = conn.createStatement();
+ ResultSet rs;
+ String column = null;
+ int ind = 0;
+ long max = 0;
+ long min = 0;
+ double x;
+ long id_to_update;
+ rs = stmt.executeQuery("select max(serialkey) from Datatypes");
+ while (rs.next())
+ max = rs.getLong(1);
+ rs = stmt.executeQuery("select min(serialkey) from Datatypes");
+ while (rs.next())
+ min = rs.getLong(1);
+ id_to_update = (min + 1) + (Math.abs(rand.nextLong()) % (max - min));
+ if (id_to_update == 0)
+ id_to_update = 1;
+ ind = Math.abs(rand.nextInt());
+ column = colnames[ind % NUMTYPES];
+ try {
+ conn
+ .setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+ ps2 = conn.prepareStatement(" update Datatypes set " + column
+ + " = ? " + " where serialkey = " + id_to_update);
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ return;
+ }
+ String ds = null;
+ String ds2 = null;
+ String cs = "asdf qwerqwer 12341234 ZXCVZXCVZXCV !@#$!@#$ asdfasdf 1 q a z asdf ASDF qwerasdfzxcvasdfqwer1234asd#";
+ double d = 0.0;
+ float f = 0;
+ BigDecimal bdec = null;
+ int type = (ind % NUMTYPES);
+ int ji = 0;
+ boolean bo = false;
+ switch (type) {
+ case TCHAR:
+ ds2 = cs.substring(Math.abs(rand.nextInt() % 100));
+ ps2.setString(1, ds2);
+ break;
+ case TDATE:
+ Date dt = new Date(1);
+ dt.setTime(Math.abs(rand.nextLong() / 150000));
+ dt.setTime(Math.abs(rand.nextLong() / 150000));
+ ps2.setDate(1, dt);
+ ds2 = dt.toString();
+ break;
+ case TDECIMAL:
+ x = Math.abs(rand.nextInt() % 18);
+ if (x > 5)
+ x = 5;
+ d = rand.nextDouble() * Math.pow(10, x);
+ bdec = new BigDecimal(d);
+ ps2.setBigDecimal(1, bdec);
+ ds2 = String.valueOf(d);
+ break;
+ case TDECIMALNN:
+ ds = String.valueOf(d);
+ d = rand.nextDouble();
+ bdec = new BigDecimal(d);
+ ps2.setBigDecimal(1, bdec);
+ ds2 = String.valueOf(d);
+ break;
+
+ case TDOUBLE:
+ d = rand.nextDouble() * Math.pow(10, rand.nextInt() % 300);
+ ps2.setDouble(1, d);
+ ds2 = String.valueOf(d);
+ break;
+ case TFLOAT:
+ ds = String.valueOf(f);
+ f = rand.nextFloat() * (float) Math.pow(10, rand.nextInt() % 30);
+ ps2.setFloat(1, f);
+ ds2 = String.valueOf(f);
+ break;
+ case TINT:
+ int i = rand.nextInt();
+ ds2 = String.valueOf(i);
+ ps2.setInt(1, i);
+ break;
+ case TLONGINT:
+ long l = rand.nextLong();
+ ds2 = String.valueOf(l);
+ ps2.setLong(1, l);
+ break;
+ case TNUMERICLARGE:
+ ds = String.valueOf(d);
+ x = Math.abs(rand.nextInt() % 30);
+ if (x > 30)
+ x = 31;
+ d = rand.nextDouble() * Math.pow(10, x);
+ bdec = new BigDecimal(d);
+ ps2.setBigDecimal(1, bdec);
+ ds2 = String.valueOf(d);
+ break;
+ case TREAL:
+ ds = String.valueOf(f);
+ f = rand.nextFloat() * (float) Math.pow(10, rand.nextInt() % 7);
+ ps2.setFloat(1, f);
+ ds2 = String.valueOf(f);
+ break;
+ case TSMALLINT:
+ i = rand.nextInt() % (256 * 128);
+ ds = String.valueOf(i);
+ short si = (short) i;
+ ps2.setShort(1, si);
+ ds2 = String.valueOf(si);
+ break;
+ case TTIME:
+ Time tt = new Time(1);
+ tt.setTime(Math.abs(rand.nextInt()));
+ ps2.setTime(1, tt);
+ ds2 = tt.toString();
+ break;
+ case TTIMESTAMP:
+ Timestamp ts = new Timestamp(1);
+ ts.setTime(Math.abs(rand.nextLong() / 50000));
+ ps2.setTimestamp(1, ts);
+ ds2 = ts.toString();
+ break;
+ case TVARCHAR:
+ ds2 = cs.substring(Math.abs(rand.nextInt() % 100));
+ ps2.setString(1, ds2);
+ break;
+ case TBLOB:
+ int j = (int) (Math.random() * 35);
+ fileName[j] = "p" + j + ".jpg";
+ InputStream fileIn = Datatypes.class
+ .getResourceAsStream(fileName[j]);
+ ps2.setBinaryStream(1, fileIn, (int) fileLength[j]);
+ break;
+ case TCLOB:
+ int k = (int) (Math.random() * 35);
+ fileName1[k] = "t" + k + ".txt";
+ InputStream fileIn1 = Datatypes.class
+ .getResourceAsStream(fileName1[k]);
+ ps2.setAsciiStream(1, fileIn1, (int) fileLength1[k]);
+ break;
+ }
+ int rows = 0;
+ boolean cleanuponly = false;
+ if (cleanuponly == false) {
+ System.out.println("t" + thread_id + " update " + column);
+ try {
+ rows = ps2.executeUpdate();
+
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ if (rows > 0)
+ System.out.println("t" + thread_id + " updated 1 row with id "
+ + id_to_update);
+ else
+ System.out.println("t" + thread_id + " update failed.");
+ }
+ if (ps2 != null)
+ try {
+ ps2.close();
+ rs.close();
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ }
+
+ public static synchronized int get_table_count(Connection conn)
+ throws Exception {
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ int rows = 0;
+ boolean locked = false;
+ int tick = 1;
+ while (locked == false) {
+ try {
+ Statement s = conn.createStatement();
+ s.execute("lock table Datatypes in exclusive mode");
+ s.close();
+ locked = true;
+ } catch (SQLException se) {
+ // not now lockable
+ if (se.getSQLState().equals("X0X02")) {
+ Thread.sleep(20000);
+ if (tick++ < 60) {
+ System.out
+ .println("count: cannot lock table, retrying "
+ + tick + "\n");
+ continue;
+ } else {
+ System.out.println("count timed out\n");
+ return (-1);
+ }
+ } else
+ JDBCDisplayUtil.ShowException(System.out, se);
+ }
+ }
+ try {
+ ps = conn.prepareStatement(" select count (*) from Datatypes ");
+ rs = ps.executeQuery();
+ if (rs.next())
+ rows = rs.getInt(1);
+ if (ps != null)
+ ps.close();
+ } catch (SQLException se) {
+ if (se.getNextException() == null)
+ throw se;
+ String m = se.getNextException().getSQLState();
+ System.out.println(se.getNextException().getMessage()
+ + " SQLSTATE: " + m);
+ }
+ System.out.println("rows in calling initial_data()" + rows);
+ locked = true;
+ return (rows);
+ }
+}
\ No newline at end of file
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Datatypes.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Setup.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Setup.java?view=auto&rev=501639
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Setup.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Setup.java Tue Jan 30 15:27:51 2007
@@ -0,0 +1,119 @@
+/*
+
+ Derby - Class org.apache.derbyTesting.system.sttest.Setup
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ */
+package org.apache.derbyTesting.system.sttest.utils;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.apache.derby.tools.JDBCDisplayUtil;
+
+/**
+ * creates database and builds single user table with indexes
+ */
+public class Setup {
+ public static boolean doit(String dbURL) throws Throwable {
+ Connection conn = null;
+ Statement s = null;
+ ResultSet rs = null;
+ boolean finished = false;
+ System.out.println("dbsetup start");
+ try {
+ conn = DriverManager.getConnection(dbURL + ";create=true");
+ conn.setAutoCommit(false);
+ conn.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ } catch (SQLException se) {
+ System.out.println("connect failed for " + dbURL);
+ JDBCDisplayUtil.ShowException(System.out, se);
+ return (false);
+ }
+ try {
+ s = conn.createStatement();
+ rs = s.executeQuery("select tablename from sys.systables "
+ + " where tablename = 'DATATYPES'");
+ if (rs.next()) {
+ rs.close();
+ System.out.println("table 'DATATYPES' already exists");
+ finished = true;
+ }
+ } catch (SQLException se) {
+ System.out.println("create table: FAIL -- unexpected exception:");
+ JDBCDisplayUtil.ShowException(System.out, se);
+ return (false);
+ }
+ if (finished == false)
+ try {
+ System.out.println("creating table 'DATATYPES'");
+ s
+ .execute("create table Datatypes ("
+ + "id int not null,"
+ + "t_char char(100),"
+ + "t_blob blob(100K),"
+ + "t_clob clob(100K),"
+ + "t_date date,"
+ + "t_decimal decimal,"
+ + "t_decimal_nn decimal(10,10),"
+ + "t_double double precision,"
+ + "t_float float,"
+ + "t_int int,"
+ + "t_longint bigint,"
+ + "t_numeric_large numeric(31,0),"
+ + "t_real real,"
+ + "t_smallint smallint,"
+ + "t_time time,"
+ + "t_timestamp timestamp,"
+ + "t_varchar varchar(100),"
+ + "serialkey bigint generated always as identity (start with 1,increment by 1),"
+ + "unique (serialkey), " + "unique (id))");
+ s.execute("create index t_char_ind on Datatypes ( t_char)");
+ s.execute("create index t_date_ind on Datatypes ( t_date)");
+ s
+ .execute("create index t_decimal_ind on Datatypes ( t_decimal)");
+ s
+ .execute("create index t_decimal_nn_ind on Datatypes ( t_decimal_nn)");
+ s.execute("create index t_double_ind on Datatypes ( t_double)");
+ s.execute("create index t_float_ind on Datatypes ( t_float)");
+ s.execute("create index t_int_ind on Datatypes ( t_int)");
+ s
+ .execute("create index t_longint_ind on Datatypes ( t_longint)");
+ s
+ .execute("create index t_numeric_larg_ind on Datatypes ( t_numeric_large)");
+ s.execute("create index t_real_ind on Datatypes ( t_real)");
+ s
+ .execute("create index t_smallint_ind on Datatypes ( t_smallint)");
+ s.execute("create index t_time_ind on Datatypes ( t_time)");
+ s
+ .execute("create index t_timestamp_ind on Datatypes ( t_timestamp)");
+ s
+ .execute("create index t_varchar_ind on Datatypes ( t_varchar)");
+ conn.commit();
+ conn.close();
+ } catch (SQLException se) {
+ System.out
+ .println("create table: FAIL -- unexpected exception:");
+ JDBCDisplayUtil.ShowException(System.out, se);
+ return (false);
+ }
+ return (true);
+ }
+}
\ No newline at end of file
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/Setup.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/StStatus.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/StStatus.java?view=auto&rev=501639
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/StStatus.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/StStatus.java Tue Jan 30 15:27:51 2007
@@ -0,0 +1,72 @@
+/*
+ *
+ * Derby - Class org.apache.derbyTesting.system.sttest.StStatus
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ */
+package org.apache.derbyTesting.system.sttest.utils;
+
+/**
+ * This class is used to give the information about the memory status
+ */
+import java.util.Date;
+import java.io.*;
+
+public class StStatus {
+ static final int messageCount = 20;
+
+ int cycles = 0;
+
+ int currentThreads = 0;
+
+ int currentMessage = 0;
+
+ public String firstMessage = null;
+
+ public String[] messages;
+
+ public StStatus() {
+ messages = new String[messageCount];
+ }
+
+ public void firstMessage(int Threadcount, Date d) {
+ currentThreads = Threadcount;
+ firstMessage = "starting: " + d.toString() + " threads: "
+ + currentThreads;
+ }
+
+ public void updateStatus() throws IOException {
+ Date d = new Date();
+ cycles++;
+ int counter = currentMessage % messageCount;
+ Runtime rt = Runtime.getRuntime();
+ messages[counter] = "Total memory: " + rt.totalMemory()
+ + " free memory: " + rt.freeMemory() + " cycles: " + cycles
+ + " threads: " + currentThreads + " " + d;
+ currentMessage++;
+ //overwrite messages file with current set of messages
+ PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(
+ "Sttest.log")));
+ out.println(firstMessage);
+ for (int i = 0; i < messageCount; i++) {
+ if (messages[i] != null)
+ out.println(messages[i]);
+ }
+ out.flush();
+ out.close();
+ }
+}
\ No newline at end of file
Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/sttest/utils/StStatus.java
------------------------------------------------------------------------------
svn:eol-style = native