sqliteでextensionを作る。growlはWindowsのGNTPにも対応したmattn謹製gntp-sendを使う。
mattn's gntp-send at master - GitHubgntp-sendはコマンドラインプログラムだけど、外部からライブラリとしても使える様にしてあります。
command line program that send to growl using GNTP protocol.
http://github.com/mattn/gntp-send
#include <stdlib.h>
#include <sqlite3ext.h>
#include <growl.h>
SQLITE_EXTENSION_INIT1
static void growl_func(sqlite3_context *context, int argc, sqlite3_value **argv) {
if (argc == 1) {
const char *text = (const char *)sqlite3_value_text(argv[0]);
growl("localhost", "sqlite3", "sqlite3-trigger", "database-update", text, NULL, NULL, NULL);
}
}
__declspec(dllexport) int sqlite3_extension_init(sqlite3 *db, char **errmsg, const sqlite3_api_routines *api) {
SQLITE_EXTENSION_INIT2(api);
return sqlite3_create_function(db, "growl", 1, SQLITE_UTF8, (void*)db, growl_func, NULL, NULL);
}
こんなコード書いて
# gcc -shared -dll -I c:/sqlite3 -I headers growldb.c lib/libgrowl-static.a -lws2_32 -o growldb.dll
こんな風にコンパイル(Windowsの例)。あとはテーブルにトリガー張って
sqlite> create table foo(comment text);
sqlite> select load_extension('growldb.dll');
sqlite> create trigger tri_foo
...> before
...> insert on foo
...> begin
...> select growl(new.comment);
...> end;
試してみよう!
sqlite> insert into foo values('hasegawa! xss xss');
xssキター!
ただしinsertする側は必ずload_extension('growldb.dll')しとかないといけないので、oracleの様には行かない。
真面目な話、この方法をうまく使えばsqliteでネットワークレプリケーションとか出来そう。
えっ?誰得?.......知りません!