H2Databaseを追っかけていたりしたブログ

H2 database のリリースノートを読んだりとか。

H2でTriggerを試してみる。

H2にもやはりトリガーはあるのですが、PL/SQLやPL/pgSQLのような組み込みの言語がないので、所謂一般的にイメージするトリガーではなく、org.h2.api.Triggerインターフェースを実装したJavaのクラスが呼ばれる、という実装になっています。

面倒だ、というのはまぁ、その通りで、要望としてトリガーをGroovyで書けるようにしてほしい、というのが挙っていました。

とはいえ、Javaで書ける事なら何でも書けるので、やる気になれば大概の事は。

package com.karatebancho;

import java.sql.Connection;
import java.sql.SQLException;

import org.h2.api.Trigger;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

public class TwitterTrigger implements Trigger {
	protected Twitter twitter;
	
	public void close() throws SQLException {
	}

	public void fire(Connection conn, Object[] oldRow, Object[] newRow)
			throws SQLException {
		if(newRow == null){
			return;
		}
		try {
			String message = newRow[0].toString();
			twitter.updateStatus(message);
		} catch (TwitterException e) {
			throw new SQLException(e.getMessage());
		}
	}

	public void init(Connection arg0, String arg1, String arg2, String arg3,
			boolean arg4, int arg5) throws SQLException {
		twitter = new TwitterFactory().getInstance(System.getProperty("twitter.id"),System.getProperty("twitter.password"));
	}

	public void remove() throws SQLException {
	}

}

このようなクラスを作って、クラスパスを通してH2を起動します。

java -cp h2-1.2.132.jar:twitter4j-core-2.1.1.jar:twittertrigger.jar -Dtwitter.id=xxxx -Dtwitter.password=xxxx org.h2.tools.Shell -url jdbc:h2:mem:

テーブルを作って、

create table tweet(message varchar,create_date date);

トリガーを設定します。

create trigger trg_tweet before insert on tweet for each row call "com.karatebancho.TwitterTrigger";

INSERT!

insert into tweet('これが通ったら歯を磨いて寝るんだ←死亡フラグ',current timestamp);

うは。SQLtwitterに投稿できたよ。空のテーブルに上の行インサートするのに1秒以上かかったけどな。

このトリガーさえ作っておけば、JDBCで接続できるデータベースいじるツールがTwitterのクライアントに早変わりなので、会社でもつぶやいていないと死にそうな人には便利かもしれません。