⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selftest.java

📁 Java写的含有一个jdbc驱动的小型数据库数据库引擎
💻 JAVA
字号:
/*
 * SelfTest.java
 *
 * Copyright (c) 2001, The HSQL Development Group
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 *
 * Neither the name of the HSQL Development Group nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This package is based on HypersonicSQL, originally developed by Thomas Mueller.
 *
 */
package org.hsqldb.util;

import org.hsqldb.*;
import java.sql.*;
import java.io.*;

/**
 * Class declaration
 *
 *
 * @version 1.0.0.1
 */
class SelfTest {

    /**
     * Method declaration
     *
     *
     * @param argv
     */
    public static void main(String argv[]) {
	print("Usage: SelfTest [records [-m]] (-m means in-memory only)");

	int max = 500;

	if (argv.length >= 1) {
	    max = Integer.parseInt(argv[0]);
	}

	boolean persistent = true;
	boolean update = false;

	if (argv.length >= 2) {
	    String a1 = argv[1];

	    if (a1.equals("-m")) {
		persistent = false;
	    }
	}

	test(max, persistent);
    }

    /**
     * Method declaration
     *
     *
     * @param max
     * @param persistent
     */
    static void test(int max, boolean persistent) {

	// DriverManager.setLogStream(System.out);
	try {
	    DriverManager.registerDriver(new org.hsqldb.jdbcDriver());

	    if (persistent) {
		delete("test2.backup");
		delete("test2.properties");
		delete("test2.script");
		delete("test2.data");
		test("Persistent", "jdbc:hsqldb:test2", "sa", "", max,
		     true);
	    }

	    test("In-Memory", "jdbc:hsqldb:.", "sa", "", max, false);
	    Profile.listUnvisited();
	} catch (Exception e) {
	    print("SelfTest error: " + e.getMessage());
	    e.printStackTrace();
	}
    }

    /**
     * Method declaration
     *
     *
     * @param file
     */
    static void delete(String file) {
	try {
	    new File(file).delete();
	} catch (Exception e) {}
    }

    /**
     * Method declaration
     *
     *
     * @param name
     * @param url
     * @param user
     * @param password
     * @param max
     * @param persistent
     *
     * @throws Exception
     */
    static void test(String name, String url, String user, String password,
		     int max, boolean persistent) throws Exception {
	print(name);

	Statement  sStatement = null;
	Connection cConnection = null;

	try {
	    cConnection = DriverManager.getConnection(url, user, password);
	    sStatement = cConnection.createStatement();
	} catch (Exception e) {
	    e.printStackTrace();
	    print("SelfTest init error: " + e.getMessage());
	}

	LineNumberReader read =
	    new LineNumberReader(new FileReader("SelfTest.txt"));
	String		 s = "";

	while (true) {
	    String line = read.readLine();

	    if (line == null) {
		break;
	    }

	    if (line.startsWith(" ")) {
		s += line;
	    } else {
		test(sStatement, s);

		s = line;
	    }
	}

	long      start;
	boolean   bDropError = false;
	ResultSet r;

	try {

	    // test duplicate keys & small transaction rollback
	    s = "CREATE TABLE marotest (id int PRIMARY KEY, dat int);"
		+ "INSERT INTO marotest VALUES (1,0);"
		+ "INSERT INTO marotest VALUES (2,0);"
		+ "INSERT INTO marotest VALUES (2,0);";

	    try {
		sStatement.execute(s);

		s = "";
	    } catch (Exception e) {}

	    if (s.equals("")) {
		throw new Exception("Duplicate key gave no error on insert");
	    }

	    try {
		s = "UPDATE marotest SET id=1, dat=-1 WHERE dat=0";

		sStatement.execute(s);

		s = "";
	    } catch (Exception e) {}

	    if (s.equals("")) {
		throw new Exception("Duplicate key gave no error on update");
	    }

	    int count = 0;

	    s = "SELECT *, id as marotest_id FROM marotest";
	    r = sStatement.executeQuery(s);

	    while (r.next()) {
		r.getFloat(1);
		r.getString("id");
		r.getInt("DaT");
		r.getInt("marotest_id");

		if (r.getShort("dat") != 0) {
		    throw new Exception("Bad update worked");
		}

		r.getLong("DAT");
		r.getString(2);
		r.getObject("ID");
		r.clearWarnings();

		try {

		    // this must throw an error
		    r.getTimestamp("Timestamp?");

		    count = 99;
		} catch (Exception e) {}

		count++;
	    }

	    r.close();

	    if (count != 2) {
		throw new Exception("Should have 2 but has " + count
				    + " rows");
	    }

	    // test database meta data
	    DatabaseMetaData dbMeta = cConnection.getMetaData();

	    r = dbMeta.getColumns(null, "dbo", "MAROTEST", "%");

	    while (r.next()) {
		s = r.getString(4).trim();    // COLUMN_NAME

		int i = r.getInt(5);	      // DATA_TYPE

		s += i + r.getString("TYPE_NAME");
		i = r.getInt(7);	      // COLUMN_SIZE
		i = r.getInt(9);	      // "Decimal_Digits"
		i = r.getInt(11);	      // NULLABLE
		s = s.toUpperCase();

		if (!s.equals("ID4INTEGER") &&!s.equals("DAT4INTEGER")) {
		    throw new Exception("Wrong database meta data");
		}
	    }

	    s = "DROP TABLE marotest";

	    sStatement.execute(s);

	    // prepared statements
	    {
		s = "create table TabProfile(id int primary key,"
		    + "car char,won bit,licence varbinary,"
		    + "name char,sex char,chance double,birthday date)";

		sStatement.execute(s);

		s = "insert into TabProfile values ( ?, ?, ?, ?,"
		    + "'\"John\" the bird''s best friend', 'M',?,?);";

		PreparedStatement p = cConnection.prepareStatement(s);

		p.clearParameters();
		p.setInt(1, 10);
		p.setString(2, "Matchcartoon");
		p.setBoolean(3, true);

		byte[] b1 = {
		    0, 1, -128, 44, 12
		};

		p.setBytes(4, b1);
		p.setDouble(5, 50.5);
		p.setNull(6, Types.DATE);
		p.executeUpdate();
		p.clearParameters();
		p.setInt(1, -2);
		p.setString(2, "\"Birdie\"'s car ?");
		p.setBoolean(3, false);

		byte b2[] = {
		    10, 127
		};

		p.setBytes(4, b2);
		p.setDouble(5, -3.1415e-20);
		p.setDate(6, new Date(100, 1, 29));    // strange, but 2000-02-29
		p.executeUpdate();

		s = "select * from TabProfile where id=-2";
		r = sStatement.executeQuery(s);

		r.next();

		if (!r.getString(2).equals("\"Birdie\"'s car ?")) {
		    throw new Exception("Unicode error.");
		}

		r.close();

		s = "drop table TabProfile";

		sStatement.execute(s);

		s = "create table obj(id int,o object)";

		sStatement.execute(s);

		s = "insert into obj values(?,?)";
		p = cConnection.prepareStatement(s);

		p.setInt(1, 1);

		int ia1[] = {
		    1, 2, 3
		};

		p.setObject(2, ia1);
		p.executeUpdate();
		p.clearParameters();
		p.setInt(1, 2);

		java.awt.Rectangle r1 = new java.awt.Rectangle(10, 11, 12,
			13);

		p.setObject(2, r1);
		p.executeUpdate();

		r = sStatement.executeQuery("SELECT o FROM obj ORDER BY id DESC");

		r.next();

		java.awt.Rectangle r2 = (java.awt.Rectangle) r.getObject(1);

		if (r2.x != 10 || r2.y != 11 || r2.width != 12
			|| r2.height != 13) {
		    throw new Exception("Object data error: Rectangle");
		}

		r.next();

		int ia2[] = (int[]) (r.getObject(1));

		if (ia2[0] != 1 || ia2[1] != 2 || ia2[2] != 3
			|| ia2.length != 3) {
		    throw new Exception("Object data error: int[]");
		}

		s = "drop table obj";

		sStatement.execute(s);
	    }

	    // cache, index and performance tests
	    s = "CREATE CACHED TABLE Addr(ID INT PRIMARY KEY,First CHAR,"
		+ "Name CHAR,ZIP INT)";

	    sStatement.execute(s);

	    s = "CREATE INDEX iName ON Addr(Name)";

	    sStatement.execute(s);

	    s = "SET WRITE_DELAY TRUE";

	    sStatement.execute(s);

	    start = System.currentTimeMillis();

	    for (int i = 0; i < max; i++) {
		s = "INSERT INTO Addr VALUES(" + i + ",'Marcel" + i + "',"
		    + "'Renggli" + (max - i - (i % 31)) + "',"
		    + (3000 + i % 100) + ")";

		if (sStatement.executeUpdate(s) != 1) {
		    throw new Exception("Insert failed");
		}

		if (i % 100 == 0) {
		    printStatus("insert   ", i, max, start);
		}
	    }

	    printStatus("insert   ", max, max, start);
	    print("");

	    s = "SELECT COUNT(*) FROM Addr";
	    r = sStatement.executeQuery(s);

	    r.next();

	    int c = r.getInt(1);

	    if (c != max) {
		throw new Exception("Count should be " + (max) + " but is "
				    + c);
	    }

	    if (persistent) {

		// close & reopen to test backup
		cConnection.close();

		cConnection = DriverManager.getConnection(url, user,
							  password);
		sStatement = cConnection.createStatement();
	    }

	    start = System.currentTimeMillis();

	    for (int i = 0; i < max; i++) {
		s = "UPDATE Addr SET Name='Robert" + (i + (i % 31))
		    + "' WHERE ID=" + i;

		if (sStatement.executeUpdate(s) != 1) {
		    throw new Exception("Update failed");
		}

		if (i % 100 == 0) {
		    printStatus("updated  ", i, max, start);

		    // s="SELECT COUNT(*) FROM Addr";
		    // r=sStatement.executeQuery(s);
		    // r.next();
		    // int c=r.getInt(1);
		    // if(c!=max) {
		    // throw new Exception("Count should be "+max+" but is "+c);
		    // }
		}
	    }

	    printStatus("update   ", max, max, start);
	    print("");

	    if (persistent) {
		s = "SHUTDOWN IMMEDIATELY";

		sStatement.execute(s);

		// open the database; it must be restored after shutdown
		cConnection.close();

		cConnection = DriverManager.getConnection(url, user,
							  password);
		sStatement = cConnection.createStatement();
	    }

	    start = System.currentTimeMillis();

	    for (int i = 0; i < max; i++) {
		s = "DELETE FROM Addr WHERE ID=" + (max - 1 - i);

		if (sStatement.executeUpdate(s) != 1) {
		    throw new Exception("Delete failed");
		}

		if (i % 100 == 0) {
		    printStatus("deleting ", i, max, start);

		    // s="SELECT COUNT(*) FROM Addr";
		    // r=sStatement.executeQuery(s);
		    // r.next();
		    // int c=r.getInt(1);
		    // if(c!=max-i-1) {
		    // throw new Exception("Count should be "+(max-i-1)+" but is "+c);
		    // }
		}
	    }

	    printStatus("delete   ", max, max, start);
	    print("");
	    sStatement.execute("DROP TABLE Addr");
	} catch (Exception e) {
	    print("");
	    print("SelfTest error: " + e);
	    print("with SQL command: " + s);
	    e.printStackTrace();
	}

	cConnection.close();
	print("Test finished");
    }

    /**
     * Method declaration
     *
     *
     * @param stat
     * @param s
     *
     * @throws Exception
     */
    static void test(Statement stat, String s) throws Exception {
	String result = "";
	char   type = ' ';

	if (s.startsWith("/*")) {
	    type = s.charAt(2);

	    int end = s.indexOf("*/");

	    result = s.substring(3, end);
	}

	try {
	    stat.execute(s);

	    int       u = stat.getUpdateCount();
	    int       i = 0;
	    ResultSet r;

	    switch (type) {

	    case ' ':
		break;

	    case 'u':
		if (u != Integer.parseInt(result)) {
		    throw new Exception("Expected update count=" + result
					+ " but update count was " + u
					+ " / " + s);
		}

		break;

	    case 'r':
		if (u != -1) {
		    throw new Exception("Expected ResultSet"
					+ " but update count was " + u
					+ " / " + s);
		}

		r = stat.getResultSet();

		r.next();

		String col = r.getString(1);

		if (r.wasNull() || col == null) {
		    if (!result.equals("")) {
			throw new Exception("Expected " + result
					    + " but got null / " + s);
		    }
		} else if (!col.equals(result)) {
		    throw new Exception("Expected >" + result + "<"
					+ " but got >" + col + "< / " + s);
		}

		break;

	    case 'c':
		if (u != -1) {
		    throw new Exception("Expected ResultSet"
					+ " but update count was " + u
					+ " / " + s);
		}

		r = stat.getResultSet();

		while (r.next()) {
		    i++;
		}

		if (i != Integer.parseInt(result)) {
		    throw new Exception("Expected " + result + " rows "
					+ " but got " + i + " rows / " + s);
		}

		break;

	    case 'e':
		throw new Exception("Expected error " + "but got no error / "
				    + s);
	    }
	} catch (SQLException e) {
	    if (type != 'e') {
		throw new Exception("Expected " + type + "/" + result
				    + " but got error " + e.getMessage()
				    + " / " + s);
	    }
	}
    }

    /**
     * Method declaration
     *
     *
     * @param s
     * @param i
     * @param max
     * @param start
     */
    static void printStatus(String s, int i, int max, long start) {
	System.out.print(s + ": " + i + "/" + max + " " + (100 * i / max)
			 + "% ");

	long now = System.currentTimeMillis();

	if (now > start) {
	    System.out.print((i * 1000 / (now - start)));
	}

	System.out.print(" rows/s                \r");
    }

    /**
     * Method declaration
     *
     *
     * @param s
     */
    private static void print(String s) {
	System.out.println(s);
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -