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節を用いてクローズするのが順当な方法だろう。