/*
* 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.samples;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.h2.api.Trigger;
/**
* This sample application shows how to pass data to a trigger. Trigger data can
* be persisted by storing it in the database.
*/
public class TriggerPassData implements Trigger {
private static final Map<String, TriggerPassData> TRIGGERS =
Collections.synchronizedMap(new HashMap<String, TriggerPassData>());
private String triggerData;
/**
* This method is called when executing this sample application from the
* command line.
*
* @param args the command line parameters
*/
public static void main(String... args) throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:h2:mem:test", "sa", "");
Statement stat = conn.createStatement();
stat.execute("CREATE TABLE TEST(ID INT)");
stat.execute("CREATE ALIAS TRIGGER_SET FOR \"" +
TriggerPassData.class.getName() +
".setTriggerData\"");
stat.execute("CREATE TRIGGER T1 " +
"BEFORE INSERT ON TEST " +
"FOR EACH ROW CALL \"" +
TriggerPassData.class.getName() + "\"");
stat.execute("CALL TRIGGER_SET('T1', 'Hello')");
stat.execute("INSERT INTO TEST VALUES(1)");
stat.execute("CALL TRIGGER_SET('T1', 'World')");
stat.execute("INSERT INTO TEST VALUES(2)");
stat.close();
conn.close();
}
public void init(Connection conn, String schemaName,
String triggerName, String tableName, boolean before,
int type) throws SQLException {
TRIGGERS.put(getPrefix(conn) + triggerName, this);
}
public void fire(Connection conn, Object[] old, Object[] row) {
System.out.println(triggerData + ": " + row[0]);
}
public void close() {
// ignore
}
public void remove() {
// ignore
}
/**
* Call this method to change a specific trigger.
*
* @param conn the connection
* @param trigger the trigger name
* @param data the data
*/
public static void setTriggerData(Connection conn, String trigger, String data) throws SQLException {
TRIGGERS.get(getPrefix(conn) + trigger).triggerData = data;
}
private static String getPrefix(Connection conn) throws SQLException {
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("call ifnull(database_path() || '_', '') || database() || '_'");
rs.next();
return rs.getString(1);
}
}