IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Google Gears の機能のおさらいと HTML5「Client-side DB」の相互運用を考える。Client-side DB に未来はあるか?

さきほど Client-side database storage について書きましたが

そこで、

Client-side database storage は今は Safari からしか使うことができません
しかし、 Google Gears を使ってすべてのブラウザに実装することは可能だと思います。(すでにある?)
その辺りも少し調べてみたいです。

Safari 3.1 に実装された「Client-side database storage (SQL API)」とは何か? - IT戦記

と書いてから、少しだけ Google Gears が持っているクライアントサイドデータベースについて調べてみました。

Google Gears とは

まず、 Google Gears について少し触れておきます。
Google Gears はブラウザの機能を拡張するためのもので、以下の機能を提供します。

  • オフライン時にアクセスできるようにローカルにサーバのリソースをキャッシュする
  • クライアントサイドデータベースを持つ
  • スレッド機能

このような機能を提供しています。
また、 Google GearsFlash Player のようにユーザにインストールさせる必要があります。

Google Gears はオフラインアプリケーションのためのもの?

Google Gears はオフライン時にウェブアプリケーションを使うためのもの」と言われていたりします。
しかし、今回改めて Google Gears の機能を調べてみて、この認識は間違っているのではないかと思い直しました。

Google Gears は普通のウェブアプリケーションに対してもかなり有効

今まではソーシャルでないウェブアプリケーションであってもサーバがストレージを持たなければなりませんでした。
Google Gears を使うことでローカルのデータはローカルに保存する、という当たり前のことができるようになります。
さらにいうと、サーバで一切動的な処理をしない html と js だけで完結したウェブアプリケーションを作ることができるようになります。
とくに、帯域の限られているモバイルの分野で真価を発揮しそうな気がしています。
(でも、正直いうとマルチでバイスの時代なのでストレージはサーバにあったほうが便利だとは思うのですが、帯域の問題、容量の問題があるので、過渡的なものとして使えるのではないかというのが正直なところだったりします。)

Google Gears のクライアントサイドデータベースの機能

と、いろいろ書きましたが、そんなことはどうでもいいですね。
とりあえず、 Google Gears のクライアントサイドデータベース機能をみていきましょう。

データベースを作る、開く

var db = google.gears.factory.create('beta.database');
db.open('database-test');

SQL を実行する

以下のような感じです

取得系
var rs = db.execute('SELECT * FROM hoge');

// result set を next 関数と isValidRow 関数で回す
var rows = [];
while(rs.isValidRow()) {
  var row = {};
  for (var i = 0; i < rs.fieldCount(); i ++) {
    row[rs.fieldName(i)] = rs.field(i);
  }
  rs.next();
}
rs.close();

rs.fieldByName というのもある。

更新系
// プレースホルダはこんな感じ
db.execute('INSERT INTO hoge VALUES(NULL, ?, ?)', ['hoge', 'hogehoge']);

// database で last insert id を取る
var id = db.lastInsertRowId;

rows affected は取れないっぽい?

データベースを閉じる

db.close();

ドキュメントには not require と書いてある。

トランザクション

db.execute('BEGIN');
try {
  // ここに処理を書く
}
catch(e) {
  db.execute('ROLLBACK');
  throw e;
}
db.execute('COMMIT');

HTML5 と比較してみる

コードの比較

以下に、同じことをする HTML5Google Gears を書いてみた

// HTM5
var db = openDatabase()

// Gears
var db = google.gears.factory.create('beta.database');
db.open('database-test');

// ----

// HTML5
db.transaction(function(tx) {
  tx.executeSql('SELECT * FROM hoge', [], function(tx, rs) {
    for (var i = 0; i < rs.rows.length; i ++) {
      var row = rs.rows.item(i);
      for (var n in row) {
        row[n]
      }
    }
  });
});

// Gears
db.execute('BEGIN');
try {
  try {
    var rs = db.execute('SELECT * FROM hoge');
    var rows = [];
    while(rs.isValidRow()) {
      for (var i = 0; i < rs.fieldCount(); i ++) {
        rs.field(i);
      }
      rs.next();
    }
  }
  finally {
    rs.close();
  }
}
catch(e) {
  db.execute('ROLLBACK');
  throw e;
}
db.execute('COMMIT');

// ----

// HTML5
db.transaction(function(tx) {
  tx.executeSql('INSERT INTO hoge VALUES(NULL, ?, ?)', ['hoge', 'hogehoge'], function(tx, rs) {
    var id = rs.insertId;
  });
});

// Gears
db.execute('BEGIN');
try {
  db.execute('INSERT INTO hoge VALUES(NULL, ?, ?)', ['hoge', 'hogehoge']);
  var id = db.lastInsertRowId;
}
catch(e) {
  db.execute('ROLLBACK');
  throw e;
}
db.execute('COMMIT');

うん、ほとんど同じことができる。

セキュリティポリシーの比較

Google Gears のドキュメントを見ると、ここにも「same origin security policy」と書かれている。
つまり、 HTML5 の「Client-side database storage」と同じポリシーであることが分かる。
ということは、データベースの有効範囲も同じということである。

どうやら、

相互運用は可能そうである。

というわけで

Google GearsHTML5 ラッパーみたいなものがないか調べてみた。

すごくいいのがあった

http://attic.glazkov.com/player/
しかし、ここのページはものすごく不親切で、ソースへのリンクも使い方も何もないです。
で、いろいろ調べてソースを発見しました。
ソース
ソースを読んだ感想ですが、すごくよくできていると思います。
しかし、これを使うには結構めんどくさい手順が必要そうだったので、また今度エントリーにします。

さらに調べてみると

なんと Google Gears 本家でも HTML5 のほうの API に合わせようという動きがあるようです!
Google Code Archive - Long-term storage for Google Code Project Hosting.
ということは、待っていればそのうち Google Gears をインストールするだけで HTML5 Client-side database storage が使えるようになる!
ということですね!すばらしい!

まとめ

とにかく、現状ラッパーをかませば Google GearsHTML5 Client-side database storage が使えて、
待っていれば Google Gears 本家の正式な API として HTML5 Client-side database storage 実装されそう。。ということである。
これは、かなり未来があるんじゃないか。という気がしてきました。
みなさんも Client-side DB を触ってみてはいかがでしょうか?