Google Gearsをおさらい
5月31日のGoogle Developer Dayで発表された新技術「Google Gears(以下、Gears)」。皆さんは既にお試しになっただろうか。ブラウザのプラグインというかたちでまったく新しいJavaScriptのAPIを提供するという発想に、今や世界中のギーク達が魅了されており、その可能性を追求すべく各地で熱心な研究が続けられている。
Gearsについて軽く触れておくと、Gearsの実体はIE(Microsoft Internet Explorer)、Firefoxで動作するブラウザのプラグインだ(将来的にはMac OS XのSafariもサポートされる)。以下のようなJavaScript APIを提供し、オフラインでも動作するWebアプリケーションの構築をサポートする。
- ローカルサーバ - Webページに関する様々なリソース(HTML、JavaScriptファイル、画像など)のキャッシュ
- データベース - 組み込みのリレーショナルデータベース
- ワーカプール - JavaScriptコードをバックグラウンドで非同期に実行するためのAPI
このうち、ローカルサーバについては、こちらの記事で解説しているので参照していただきたい。Gearsのインストール方法や概要などは、こちらの記事が参考になるだろう。
今回はGearsの機能のうち、データベースモジュールを解説する。
Gearsの持つ組み込みデータベース
では、ここからGearsが持つデータベースモジュールを詳しく解説したい。
Gearsは、内部にSQLiteというデータベースを同梱している。SQLiteは、通常のデータベースとは異なり、アプリケーションに組み込まれることを最初から想定したライブラリだ。非常にコンパクトながら、SQL92が持つ機能の多くが実装済みで、トランザクションは勿論のこと、ビューやトリガーもサポートしている。
Gearsをインストール済みのブラウザ上では、JavaScriptを用いてSQLiteにアクセスすることができる。つまり、JavaScriptコードからSQLを発行して、データベースの操作を行えるということだ。Gearsでは、ほんの少しの例外を除いて、SQLiteで使用できるクエリをほぼ全て使用することができる。SQLiteが持つSQLのシンタックスは、こちらのリファレンス(英語)を参照するとよい。
Gearsによるデータベースアクセス方法は、JDBCなどによく似ているため習得するのは容易だ。以下に、そのほとんどを網羅した疑似的なコードを掲載するので参考にしてほしい。
<!-- (1) gears_init.jsを読み込んで、Gearsのセットアップ -->
<script type="text/javascript" src="gears_init.js"></script>
<script type="text/javascript">
// (2) データベースオブジェクトの作成
var db = google.gears.factory.create('beta.database', '1.0');
// (3) DBのオープン
db.open("DB名");
// (4) SQLの実行。create table文なども可能
db.execute("insert into test ...");
// (5) SELECTクエリの実行。
var rs = db.execute("select * from test where id = ?", [1]);
try {
// (6) 検索結果をループし、処理を行う
while (rs.isValidRow()) {
// (7) 結果セットから値を取得
var indexedField = rs.field(0);
var namedField = rs.fieldByName("named");
...
// (8) ResultSetのカーソルを進める
rs.next();
}
} finally {
if (rs) rs.close(); // (9) 結果セットのクローズ
}
db.close(); // DBのクローズ。別に行わなくとも良い
</script>
ポイントを簡単におさらいしておこう。
(1) gears_init.jsの読み込みは、Gearsを使用するWebアプリケーション全てが行わねばならない。このJavaScriptの入手方法などは後述する。
(2) データベースに限らず、GearsのAPIはコアとなるオブジェクトをgoogle.gears.factory.create("識別子", "バージョン")
というAPIで作成するところから始まる。このコードにより、Databaseクラスのインスタンスを取得できる。
(3) データベースのオープンはDatabase#open("データベース名")
を使用する。任意の文字列をデータベースの名前として指定することができる。
(4) Database#execute
メソッドを用いてSQLを発行している。Gearsでは、検索クエリ(select)も、データ操作文(insert、update、delete)も同じくexecute
メソッドを用いて発行する。
(5) Database#execute
メソッドを用いて、プレースホルダ(「?」)付きのSQLを発行している。JDBCにおけるPreparedStatementと同様の考え方だ。executeメソッドのシグネチャは、Database#execute("SQL", [プレースホルダに対応する引数])
となっており、第二引数は配列で指定する。SQLインジェクションというセキュリティホールを回避するためにも、プレースホルダの使用は推奨される。selectクエリを実行した場合は、戻り値はResultSet
クラスのインスタンスだ。
(6) 検索結果をループする処理は、ResultSet#isValidRow()
メソッドがtrueを返す間、という条件式を用いる。JDBCにおけるjava.sql.ResultSet
とはAPIが異なる。
(7) ResultSet#field(int)
を用いると、結果セット内の列インデックスを指定して値を取得できる。ResultSet#fieldByName(String)
は、結果セット内の列名を指定して値を取得する。
(8) ResultSet#next()
を呼び出して、結果セット内のカーソルを進める。このメソッドを呼び忘れると、whileループが無限ループになってしまうので要注意だ。
(9) ResultSet#close()
メソッドを用いて結果セットをクローズしている。この例のように、finally
節を用いてクローズするのが順当な方法だろう。