さきほど Client-side database storage について書きましたが
そこで、
Client-side database storage は今は Safari からしか使うことができません
Safari 3.1 に実装された「Client-side database storage (SQL API)」とは何か? - IT戦記
しかし、 Google Gears を使ってすべてのブラウザに実装することは可能だと思います。(すでにある?)
その辺りも少し調べてみたいです。
と書いてから、少しだけ Google Gears が持っているクライアントサイドデータベースについて調べてみました。
Google Gears とは
まず、 Google Gears について少し触れておきます。
Google Gears はブラウザの機能を拡張するためのもので、以下の機能を提供します。
- オフライン時にアクセスできるようにローカルにサーバのリソースをキャッシュする
- クライアントサイドデータベースを持つ
- スレッド機能
このような機能を提供しています。
また、 Google Gears は Flash 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 と比較してみる
コードの比較
以下に、同じことをする HTML5 と Google 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 Gears の HTML5 ラッパーみたいなものがないか調べてみた。
すごくいいのがあった
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 Gears で HTML5 Client-side database storage が使えて、
待っていれば Google Gears 本家の正式な API として HTML5 Client-side database storage 実装されそう。。ということである。
これは、かなり未来があるんじゃないか。という気がしてきました。
みなさんも Client-side DB を触ってみてはいかがでしょうか?