/* * 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.unit; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.h2.api.DatabaseEventListener; import org.h2.constant.ErrorCode; import org.h2.test.TestBase; import org.h2.tools.Server; /** * Tests automatic embedded/server mode. */ public class TestAutoReconnect extends TestBase implements DatabaseEventListener { private String url; private boolean autoServer; private Server server; private Connection connServer; private Connection conn; /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase.createCaller().init().test(); } private void restart() throws SQLException { if (autoServer) { if (connServer != null) { connServer.createStatement().execute("SHUTDOWN"); connServer.close(); } org.h2.Driver.load(); connServer = DriverManager.getConnection(url); } else { server.stop(); server.start(); } } public void test() throws Exception { testWrongUrl(); autoServer = true; testReconnect(); autoServer = false; testReconnect(); deleteDb("autoReconnect"); } private void testWrongUrl() throws Exception { deleteDb("autoReconnect"); Server tcp = Server.createTcpServer().start(); try { conn = getConnection("jdbc:h2:" + getBaseDir() + "/autoReconnect;AUTO_SERVER=TRUE"); assertThrows(ErrorCode.DATABASE_ALREADY_OPEN_1, this). getConnection("jdbc:h2:" + getBaseDir() + "/autoReconnect;OPEN_NEW=TRUE"); assertThrows(ErrorCode.DATABASE_ALREADY_OPEN_1, this). getConnection("jdbc:h2:" + getBaseDir() + "/autoReconnect;OPEN_NEW=TRUE"); conn.close(); conn = getConnection("jdbc:h2:tcp://localhost/" + getBaseDir() + "/autoReconnect"); assertThrows(ErrorCode.DATABASE_ALREADY_OPEN_1, this). getConnection("jdbc:h2:" + getBaseDir() + "/autoReconnect;AUTO_SERVER=TRUE;OPEN_NEW=TRUE"); conn.close(); } finally { tcp.stop(); } } private void testReconnect() throws Exception { deleteDb("autoReconnect"); if (autoServer) { url = "jdbc:h2:" + getBaseDir() + "/autoReconnect;" + "FILE_LOCK=SOCKET;" + "AUTO_SERVER=TRUE;OPEN_NEW=TRUE"; restart(); } else { server = Server.createTcpServer("-tcpPort", "8181").start(); url = "jdbc:h2:tcp://localhost:8181/" + getBaseDir() + "/autoReconnect;" + "FILE_LOCK=SOCKET;AUTO_RECONNECT=TRUE"; } // test the database event listener conn = DriverManager.getConnection(url + ";DATABASE_EVENT_LISTENER='" + getClass().getName() + "'"); conn.close(); Statement stat; conn = DriverManager.getConnection(url); restart(); stat = conn.createStatement(); restart(); stat.execute("create table test(id identity, name varchar)"); restart(); PreparedStatement prep = conn.prepareStatement("insert into test values(null, ?)"); restart(); prep.setString(1, "Hello"); restart(); prep.execute(); restart(); prep.setString(1, "World"); restart(); prep.execute(); restart(); ResultSet rs = stat.executeQuery("select * from test order by id"); restart(); assertTrue(rs.next()); restart(); assertEquals(1, rs.getInt(1)); restart(); assertEquals("Hello", rs.getString(2)); restart(); assertTrue(rs.next()); restart(); assertEquals(2, rs.getInt(1)); restart(); assertEquals("World", rs.getString(2)); restart(); assertFalse(rs.next()); restart(); stat.execute("SET @TEST 10"); restart(); rs = stat.executeQuery("CALL @TEST"); rs.next(); assertEquals(10, rs.getInt(1)); stat.setFetchSize(10); restart(); rs = stat.executeQuery("select * from system_range(1, 20)"); restart(); for (int i = 0;; i++) { try { boolean more = rs.next(); if (!more) { assertEquals(i, 20); break; } restart(); int x = rs.getInt(1); assertEquals(x, i + 1); if (i > 10) { fail(); } } catch (SQLException e) { if (i < 10) { throw e; } } } restart(); rs.close(); conn.setAutoCommit(false); restart(); assertThrows(ErrorCode.CONNECTION_BROKEN_1, conn.createStatement()). execute("select * from test"); conn.close(); if (autoServer) { connServer.close(); } else { server.stop(); } } public void closingDatabase() { // ignore } public void exceptionThrown(SQLException e, String sql) { // ignore } public void init(String u) { // ignore } public void opened() { // ignore } public void setProgress(int state, String name, int x, int max) { // ignore } }