Search in sources :

Example 76 with User

use of org.h2.engine.User in project h2database by h2database.

the class TriggerObject method fireRow.

/**
 * Call the fire method of the user-defined trigger class if required. This
 * method does nothing if the trigger is not defined for the given action.
 * This method is called before or after a row is processed, possibly many
 * times for each statement.
 *
 * @param session the session
 * @param table the table
 * @param oldRow the old row
 * @param newRow the new row
 * @param beforeAction true if this method is called before the operation is
 *            applied
 * @param rollback when the operation occurred within a rollback
 * @return true if no further action is required (for 'instead of' triggers)
 */
public boolean fireRow(Session session, Table table, Row oldRow, Row newRow, boolean beforeAction, boolean rollback) {
    if (!rowBased || before != beforeAction) {
        return false;
    }
    if (rollback && !onRollback) {
        return false;
    }
    load();
    Object[] oldList;
    Object[] newList;
    boolean fire = false;
    if ((typeMask & Trigger.INSERT) != 0) {
        if (oldRow == null && newRow != null) {
            fire = true;
        }
    }
    if ((typeMask & Trigger.UPDATE) != 0) {
        if (oldRow != null && newRow != null) {
            fire = true;
        }
    }
    if ((typeMask & Trigger.DELETE) != 0) {
        if (oldRow != null && newRow == null) {
            fire = true;
        }
    }
    if (!fire) {
        return false;
    }
    oldList = convertToObjectList(oldRow);
    newList = convertToObjectList(newRow);
    Object[] newListBackup;
    if (before && newList != null) {
        newListBackup = Arrays.copyOf(newList, newList.length);
    } else {
        newListBackup = null;
    }
    Connection c2 = session.createConnection(false);
    boolean old = session.getAutoCommit();
    boolean oldDisabled = session.setCommitOrRollbackDisabled(true);
    Value identity = session.getLastScopeIdentity();
    try {
        session.setAutoCommit(false);
        triggerCallback.fire(c2, oldList, newList);
        if (newListBackup != null) {
            for (int i = 0; i < newList.length; i++) {
                Object o = newList[i];
                if (o != newListBackup[i]) {
                    Value v = DataType.convertToValue(session, o, Value.UNKNOWN);
                    session.getGeneratedKeys().add(table.getColumn(i));
                    newRow.setValue(i, v);
                }
            }
        }
    } catch (Exception e) {
        if (onRollback) {
        // ignore
        } else {
            throw DbException.convert(e);
        }
    } finally {
        if (session.getLastTriggerIdentity() != null) {
            session.setLastScopeIdentity(session.getLastTriggerIdentity());
            session.setLastTriggerIdentity(null);
        } else {
            session.setLastScopeIdentity(identity);
        }
        session.setCommitOrRollbackDisabled(oldDisabled);
        session.setAutoCommit(old);
    }
    return insteadOf;
}
Also used : Connection(java.sql.Connection) Value(org.h2.value.Value) DbObject(org.h2.engine.DbObject) DbException(org.h2.message.DbException) SQLException(java.sql.SQLException)

Example 77 with User

use of org.h2.engine.User in project h2database by h2database.

the class TestCluster method testCreateClusterAtRuntime.

private void testCreateClusterAtRuntime() throws SQLException {
    if (config.memory || config.networked || config.cipher != null) {
        return;
    }
    deleteFiles();
    org.h2.Driver.load();
    String user = getUser(), password = getPassword();
    Connection conn;
    Statement stat;
    int len = 10;
    // initialize the database
    Server n1 = org.h2.tools.Server.createTcpServer("-baseDir", getBaseDir() + "/node1").start();
    int port1 = n1.getPort();
    String url1 = getURL("jdbc:h2:tcp://localhost:" + port1 + "/test", false);
    conn = getConnection(url1, user, password);
    stat = conn.createStatement();
    stat.execute("create table test(id int primary key, name varchar) as " + "select x, 'Data' || x from system_range(0, " + (len - 1) + ")");
    stat.execute("create user test password 'test'");
    stat.execute("grant all on test to test");
    // start the second server
    Server n2 = org.h2.tools.Server.createTcpServer("-baseDir", getBaseDir() + "/node2").start();
    int port2 = n2.getPort();
    String url2 = getURL("jdbc:h2:tcp://localhost:" + port2 + "/test", false);
    // copy the database and initialize the cluster
    String serverList = "localhost:" + port1 + ",localhost:" + port2;
    CreateCluster.main("-urlSource", url1, "-urlTarget", url2, "-user", user, "-password", password, "-serverList", serverList);
    // check the original connection is closed
    assertThrows(ErrorCode.CONNECTION_BROKEN_1, stat).execute("select * from test");
    JdbcUtils.closeSilently(conn);
    // test the cluster connection
    String urlCluster = getURL("jdbc:h2:tcp://" + serverList + "/test", false);
    Connection connApp = getConnection(urlCluster + ";AUTO_RECONNECT=TRUE", user, password);
    check(connApp, len, "'" + serverList + "'");
    // delete the rows, but don't commit
    connApp.setAutoCommit(false);
    connApp.createStatement().execute("delete from test");
    // stop server 2, and test if only one server is available
    n2.stop();
    // rollback the transaction
    connApp.createStatement().executeQuery("select count(*) from test");
    connApp.rollback();
    check(connApp, len, "''");
    connApp.setAutoCommit(true);
    // re-create the cluster
    n2 = org.h2.tools.Server.createTcpServer("-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2").start();
    CreateCluster.main("-urlSource", url1, "-urlTarget", url2, "-user", user, "-password", password, "-serverList", serverList);
    // test the cluster connection
    check(connApp, len, "'" + serverList + "'");
    connApp.close();
    // test a non-admin user
    String user2 = "test", password2 = getPassword("test");
    connApp = getConnection(urlCluster, user2, password2);
    check(connApp, len, "'" + serverList + "'");
    connApp.close();
    n1.stop();
    // test non-admin cluster connection if only one server runs
    Connection connApp2 = getConnection(urlCluster + ";AUTO_RECONNECT=TRUE", user2, password2);
    check(connApp2, len, "''");
    connApp2.close();
    // test non-admin cluster connection if only one server runs
    connApp2 = getConnection(urlCluster + ";AUTO_RECONNECT=TRUE", user2, password2);
    check(connApp2, len, "''");
    connApp2.close();
    n2.stop();
    deleteFiles();
}
Also used : Server(org.h2.tools.Server) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) Connection(java.sql.Connection)

Example 78 with User

use of org.h2.engine.User in project h2database by h2database.

the class TestCluster method testStartStopCluster.

private void testStartStopCluster() throws SQLException {
    if (config.memory || config.networked || config.cipher != null) {
        return;
    }
    int port1 = 9193, port2 = 9194;
    String serverList = "localhost:" + port1 + ",localhost:" + port2;
    deleteFiles();
    // initialize the database
    Connection conn;
    org.h2.Driver.load();
    String urlNode1 = getURL("node1/test", true);
    String urlNode2 = getURL("node2/test", true);
    String user = getUser(), password = getPassword();
    conn = getConnection(urlNode1, user, password);
    Statement stat;
    stat = conn.createStatement();
    stat.execute("DROP TABLE IF EXISTS TEST");
    stat.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))");
    PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, ?)");
    int len = getSize(10, 1000);
    for (int i = 0; i < len; i++) {
        prep.setInt(1, i);
        prep.setString(2, "Data" + i);
        prep.executeUpdate();
    }
    check(conn, len, "''");
    conn.close();
    // copy the database and initialize the cluster
    CreateCluster.main("-urlSource", urlNode1, "-urlTarget", urlNode2, "-user", user, "-password", password, "-serverList", serverList);
    // start both servers
    Server n1 = org.h2.tools.Server.createTcpServer("-tcpPort", "" + port1, "-baseDir", getBaseDir() + "/node1").start();
    Server n2 = org.h2.tools.Server.createTcpServer("-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2").start();
    // try to connect in standalone mode - should fail
    // should not be able to connect in standalone mode
    assertThrows(ErrorCode.CLUSTER_ERROR_DATABASE_RUNS_CLUSTERED_1, this).getConnection("jdbc:h2:tcp://localhost:" + port1 + "/test", user, password);
    assertThrows(ErrorCode.CLUSTER_ERROR_DATABASE_RUNS_CLUSTERED_1, this).getConnection("jdbc:h2:tcp://localhost:" + port2 + "/test", user, password);
    // test a cluster connection
    conn = getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password);
    check(conn, len, "'" + serverList + "'");
    conn.close();
    // stop server 2, and test if only one server is available
    n2.stop();
    conn = getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password);
    check(conn, len, "''");
    conn.close();
    conn = getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password);
    check(conn, len, "''");
    conn.close();
    // disable the cluster
    conn = getConnection("jdbc:h2:tcp://localhost:" + port1 + "/test;CLUSTER=''", user, password);
    conn.close();
    n1.stop();
    // re-create the cluster
    DeleteDbFiles.main("-dir", getBaseDir() + "/node2", "-quiet");
    CreateCluster.main("-urlSource", urlNode1, "-urlTarget", urlNode2, "-user", user, "-password", password, "-serverList", serverList);
    n1 = org.h2.tools.Server.createTcpServer("-tcpPort", "" + port1, "-baseDir", getBaseDir() + "/node1").start();
    n2 = org.h2.tools.Server.createTcpServer("-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2").start();
    conn = getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password);
    stat = conn.createStatement();
    stat.execute("CREATE TABLE BOTH(ID INT)");
    n1.stop();
    stat.execute("CREATE TABLE A(ID INT)");
    conn.close();
    n2.stop();
    n1 = org.h2.tools.Server.createTcpServer("-tcpPort", "" + port1, "-baseDir", getBaseDir() + "/node1").start();
    conn = getConnection("jdbc:h2:tcp://localhost:" + port1 + "/test;CLUSTER=''", user, password);
    check(conn, len, "''");
    conn.close();
    n1.stop();
    n2 = org.h2.tools.Server.createTcpServer("-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2").start();
    conn = getConnection("jdbc:h2:tcp://localhost:" + port2 + "/test;CLUSTER=''", user, password);
    check(conn, len, "''");
    conn.createStatement().execute("SELECT * FROM A");
    conn.close();
    n2.stop();
    deleteFiles();
}
Also used : Server(org.h2.tools.Server) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement)

Example 79 with User

use of org.h2.engine.User in project h2database by h2database.

the class TestCluster method testRollback.

private void testRollback() throws SQLException {
    if (config.memory || config.networked || config.cipher != null) {
        return;
    }
    deleteFiles();
    org.h2.Driver.load();
    String user = getUser(), password = getPassword();
    Connection conn;
    Statement stat;
    ResultSet rs;
    Server n1 = org.h2.tools.Server.createTcpServer("-baseDir", getBaseDir() + "/node1").start();
    int port1 = n1.getPort();
    Server n2 = org.h2.tools.Server.createTcpServer("-baseDir", getBaseDir() + "/node2").start();
    int port2 = n2.getPort();
    String url1 = getURL("jdbc:h2:tcp://localhost:" + port1 + "/test", true);
    String url2 = getURL("jdbc:h2:tcp://localhost:" + port2 + "/test", true);
    String serverList = "localhost:" + port1 + ",localhost:" + port2;
    String urlCluster = getURL("jdbc:h2:tcp://" + serverList + "/test", true);
    CreateCluster.main("-urlSource", url1, "-urlTarget", url2, "-user", user, "-password", password, "-serverList", serverList);
    conn = getConnection(urlCluster, user, password);
    stat = conn.createStatement();
    assertTrue(conn.getAutoCommit());
    stat.execute("create table test(id int, name varchar)");
    assertTrue(conn.getAutoCommit());
    stat.execute("set autocommit false");
    // issue 259
    // assertFalse(conn.getAutoCommit());
    conn.setAutoCommit(false);
    assertFalse(conn.getAutoCommit());
    stat.execute("insert into test values(1, 'Hello')");
    stat.execute("rollback");
    rs = stat.executeQuery("select * from test order by id");
    assertFalse(rs.next());
    conn.close();
    n1.stop();
    n2.stop();
    deleteFiles();
}
Also used : Server(org.h2.tools.Server) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) Connection(java.sql.Connection) ResultSet(java.sql.ResultSet)

Example 80 with User

use of org.h2.engine.User in project h2database by h2database.

the class TestPgServer method testPrepareWithUnspecifiedType.

private void testPrepareWithUnspecifiedType() throws Exception {
    if (!getPgJdbcDriver()) {
        return;
    }
    Server server = createPgServer("-pgPort", "5535", "-pgDaemon", "-key", "pgserver", "mem:pgserver");
    try {
        Properties props = new Properties();
        props.setProperty("user", "sa");
        props.setProperty("password", "sa");
        // force server side prepare
        props.setProperty("prepareThreshold", "1");
        Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5535/pgserver", props);
        Statement stmt = conn.createStatement();
        stmt.executeUpdate("create table t1 (id integer, value timestamp)");
        stmt.close();
        PreparedStatement pstmt = conn.prepareStatement("insert into t1 values(100500, ?)");
        // assertTrue(((PGStatement) pstmt).isUseServerPrepare());
        assertEquals(Types.TIMESTAMP, pstmt.getParameterMetaData().getParameterType(1));
        Timestamp t = new Timestamp(System.currentTimeMillis());
        pstmt.setObject(1, t);
        assertEquals(1, pstmt.executeUpdate());
        pstmt.close();
        pstmt = conn.prepareStatement("SELECT * FROM t1 WHERE value = ?");
        assertEquals(Types.TIMESTAMP, pstmt.getParameterMetaData().getParameterType(1));
        pstmt.setObject(1, t);
        ResultSet rs = pstmt.executeQuery();
        assertTrue(rs.next());
        assertEquals(100500, rs.getInt(1));
        rs.close();
        pstmt.close();
        conn.close();
    } finally {
        server.stop();
    }
}
Also used : Server(org.h2.tools.Server) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) Connection(java.sql.Connection) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) Properties(java.util.Properties) Timestamp(java.sql.Timestamp)

Aggregations

Connection (java.sql.Connection)36 SQLException (java.sql.SQLException)21 PreparedStatement (java.sql.PreparedStatement)17 Statement (java.sql.Statement)17 ResultSet (java.sql.ResultSet)16 Server (org.h2.tools.Server)15 DbException (org.h2.message.DbException)14 Column (org.h2.table.Column)12 ValueString (org.h2.value.ValueString)12 Properties (java.util.Properties)10 Database (org.h2.engine.Database)10 Schema (org.h2.schema.Schema)8 IOException (java.io.IOException)7 User (org.h2.engine.User)7 JdbcDataSource (org.h2.jdbcx.JdbcDataSource)7 SimpleResultSet (org.h2.tools.SimpleResultSet)7 Value (org.h2.value.Value)7 PrintStream (java.io.PrintStream)6 Timestamp (java.sql.Timestamp)6 GridH2Table (org.apache.ignite.internal.processors.query.h2.opt.GridH2Table)6