Google Gears を「滑らかに」使うためのライブラリ、Grease for Gears を公開しました
- 2008-10-11
- カテゴリ: Client Side
- タグ: JavaScript Gears ライブラリ
表題の通り、Google Gears を「滑らかに」使うためのライブラリ、Grease for Gears を公開しました!
最近、Gears を使っていろいろといじっていたんだけど、Gears の API がどうにも使いづらい><JavaScript に慣れた身にはやたらと冗長に感じたり、フレームワークに慣れた身にはやたらと低機能に感じたり><
ということで、LL 脳でフレームワーク脳の僕でも、Gears を滑らかに使えるようになるためのライブラリを書いてみました!ソースは CodeRepos に置いてあります。
root/lang/javascript/Grease - CodeRepos
使い方とか API とか詳しいことは続きで!
できること
Gears のドキュメントを見てみると、LocalServer モジュールとか Database モジュールとか WorkerPool モジュールとか、いろいろなモジュールがあることがわかるんだけど、僕が使ったのは LocalServer モジュールの Managed Resource Store と Database モジュールだけだったので、Grease for Gears ライブラリも今のところその二つに関する機能しか実装されていません。で、現時点で実装されている機能は↓の通り。
- 1. Managed Resource Store を簡潔に
- これは大した機能ではないです><
-
Managed Resource Store を使うために、デフォルトでは↓のような面倒なステップを踏まなければいけないところを、
var localServer = google.gears.factory.create('beta.localserver'); var store = localServer.createManagedStore('my-store'); store.manifestUrl = 'manifest.json'; store.checkForUpdate();
↓のようにワンラインに縮めることができます!単に、定型処理に四行もとられたくなかったから作っただけの機能です。
Grease.ManagedStore.create('my-store').update('manifest.json');
- 2. データベースアクセスを簡潔に
- こっちがメインの機能!
-
Gears で用意されているデータベース API はとても貧弱なので、↓のようにテーブルからデータを読み込むだけでも疲れてしまいます。
// Data テーブルのデータを読み込む処理 var db = google.gears.factory.create('beta.database'); db.open('my-database'); var rows = [], rs = db.execute('SELECT * FROM Data'); while (rs.isValidRow()) { var row = {}, len = rs.fieldCount(); for (var i = 0; i < len; i++) { row[rs.fieldName(i)] = rs.field(i); } rows.push(row); rs.next(); } rs.close(); // required
↑の処理が、Grease for Gears を使えば↓の二行で済みます!
var db = Grease.Db.create('my-database'); var rows = db.query('SELECT * FROM Data').fetchAll();
これだけだったら、LL 脳の僕にも簡単です!
さらに、PHP の Zend_Db_Table をパクった Grease.Db.Table クラスを使えば、↓のような書き方もできてしまいます!
var Data = new Grease.Db.Table('my-database', 'Data', 'NameOfPrimaryKeyColumn'); var rows = Data.select().fetchAll();
もちろん、INSERT 文や UPDATE 文も簡単に実行可能!
Data.insert({name: 'foo', age: 42}); Data.update({age: 24}, 'name = ?', ['foo']);
これなら、フレームワーク脳の僕にも簡単にデータベース操作ができますね!
致命的なバグ
こんな便利な Grease for Gears なんだけど、実は IE では動かないっていう致命的な弱点があるよ!
Grease for Gears では、普通の Gears オブジェクトに便利な関数をコピーすることでいろいろな機能を実装しているんだけど、IE の ActiveX オブジェクトには、プロパティをコピーするってことができないみたいだね!
これ、実は知ってたんだけど、面倒だから IE は切り捨てちゃったんだよね。各オブジェクトを拡張するときは、extend()
っていうメソッドを使って、_methods
っていうオブジェクトをコピーしているから、この二つをいじれば最小限の変更で IE にも対応できるんだけど、今は時間がないし、僕個人としては IE に対応する必要がなかったから放置しとくよ!
使い方
Grease for Gears を使うために必要なのは、gears_init.js をロードしてから、grease.js をロードするだけ。
<script type="text/javascript" src="gears_init.js"></script> <script type="text/javascript" src="grease.js"></script>
gears_init.js は Gears を使うために必要なもので、Gears のデベロッパーサイトで手に入るよ!
API リファレンス
すごく見づらいけどたぶんないよりはまし><
こういうのは CodeRepos の Wiki で書いた方がいいかもね。
Grease.ManagedStore
返り値 | 拡張された GearsManagedResourceStore |
---|---|
引数 | GearsLocalServer#createManagedStore() と同じ |
説明 | 拡張された GearsManagedResourceStore オブジェクトを生成する |
返り値 | void |
---|---|
引数 | GearsLocalServer#removeManagedStore() と同じ |
説明 | GearsLocalServer#removeManagedStore() のショートカット |
拡張された GearsManagedResourceStore
通常の GearsManagedResourceStore
オブジェクトのメソッドのほかに、以下のメソッドを使えます。
返り値 | 引数を渡さない場合は manifestUrl の値、引数を渡した場合は this を返す |
---|---|
引数 | url - manifestUrl の値 |
説明 | jQuery 風の getter/setter メソッド; 引数を渡さない場合は manifestUrl の値を返し、引数を渡した場合は manifestUrl に値をセットして this を返す |
返り値 | this の値を返す |
---|---|
引数 | url - manifestUrl の値 |
options - コールバック関数を指定するための連想配列options.oncomplete = function({ "newVersion": string }) {} - アップデート成功時のコールバック関数options.onerror = function({ "message": string }) {} - アップデート失敗時のコールバック関数 |
|
説明 | manifestUrl を指定した後に checkForUpdate() を呼び出す処理をショートカット; ついでに、バグがあって使えない oncomplete イベントと onerror イベントをエミュレート |
使用例 (ManagedStore)
// manifest.json に列挙されたファイルをローカルサーバーに保存する Grease.ManagedStore.create('mystore').update('manifest.json', { oncomplete: function(details) { if (details.newVersion) { window.alert('Updated! The new version is ' + details.newVersion); } } });
Grease.Db
返り値 | 拡張された GearsDatabase |
---|---|
引数 | name - 開くデータベースの名前 |
説明 | 拡張された GearsDatabase オブジェクトを生成して、データベースを開く |
拡張された GearsDatabase
返り値 | 拡張された GearsResultSet オブジェクト |
---|---|
引数 | sql - 実行する SQL 文 |
args - プレースホルダ ('?') に代入する値の配列 |
|
説明 | GearsDatabase#execute() のラッパー; 拡張された GearsResultSet オブジェクトを返す |
返り値 | 変更された行数 |
---|---|
引数 | table - 挿入対象のテーブル名 |
data - 挿入するデータ (カラム名 - カラム値のペア) |
|
説明 | INSERT 文を実行する |
返り値 | 変更された行数 |
---|---|
引数 | table - 更新対象のテーブル名 |
data - 更新するデータ (カラム名 - カラム値のペア) |
|
where - 更新対象を指定する WHERE 句 |
|
extra - WHERE 句に含まれるプレースホルダ ('?') に代入する値の配列 |
|
説明 | UPDATE 文を実行する |
返り値 | 変更された行数 |
---|---|
引数 | table - 削除対象のテーブル名 |
where - 削除対象を指定する WHERE 句 |
|
extra - WHERE 句に含まれるプレースホルダ ('?') に代入する値の配列 |
|
説明 | DELETE 文を実行する |
拡張された GearsResultSet
返り値 | 現在の行データの連想配列 |
---|---|
説明 | 現在の行を連想配列として取り出して、ポインターを次へ進める |
返り値 | 現在の行データのうち、col で指定したカラム番号の値 |
---|---|
引数 | col - 取り出したいカラムの番号 |
説明 | 現在の行から、一カラムの値を取り出してポインターを次へ進める |
返り値 | 行セットに残ったデータの配列 (col が指定されない場合は連想配列の配列、指定された場合は単一の値の配列) |
---|---|
引数 | col - 取り出したいカラムの番号 |
説明 | 行セットに残ったデータを配列として取り出す; col を指定しない場合は、fetch() の結果の配列を返し、col が指定された場合は、fetchColumn(col) の結果の配列を返す |
使用例 (Db)
// DB オブジェクト生成 + テーブル作成 var db = Grease.Db.create('mydatabase'); db.execute('CREATE TABLE IF NOT EXISTS Data (id INTEGER PRIMARY KEY, name TEXT, age INT)'); // データ挿入 db.insert('Data', { name: 'Fannie', age: 20}); db.insert('Data', { name: 'Freddie', age: 30}); // データ更新 + 削除 db.update('Data', { age: 25 }, 'name = ?', ['Fannie']); db.remove('Data', 'id = ?', [10]); // データの取り出し var rows = db.query('SELECT * FROM Data').fetchAll(); var names = db.query('SELECT * FROM Data').fetchAll(1);
Grease.Db.Table
返り値 | Grease.Db.Table オブジェクト |
---|---|
引数 | db - データベース名 or GearsDatabase オブジェクト |
table - テーブル名 |
|
primary - 主キーカラムの名前 |
|
説明 | Grease.Db.Table オブジェクトを生成する |
返り値 | 行データ (連想配列) or null |
---|---|
引数 | id - 主キーカラムの値 |
説明 | 主キーカラムの値でデータを検索する (見つからない場合は null を返す) |
返り値 | 拡張された GearsResultSet オブジェクト |
---|---|
引数 | cond - WHERE 句、ORDER BY 句など |
args - cond の中で使われているプレースホルダに代入する値の配列 |
|
説明 | 指定した条件でテーブル内を検索する ('SELECT * FROM TableName' に cond を結合して実行する) |
返り値 | 変更された行数 |
---|---|
引数 | data - 挿入するデータ (カラム名 - カラム値のペア) |
説明 | INSERT 文を実行する (GreasedDatabase#insert() のテーブル名を束縛したもの) |
返り値 | 変更された行数 |
---|---|
引数 | data - 更新するデータ (カラム名 - カラム値のペア) |
where - 更新対象を指定する WHERE 句 |
|
extra - WHERE 句に含まれるプレースホルダ ('?') に代入する値の配列 |
|
説明 | UPDATE 文を実行する (GreasedDatabase#update() のテーブル名を束縛したもの) |
返り値 | 変更された行数 |
---|---|
引数 | where - 削除対象を指定する WHERE 句 |
extra - WHERE 句に含まれるプレースホルダ ('?') に代入する値の配列 |
|
説明 | DELETE 文を実行する (GreasedDatabase#remove() のテーブル名を束縛したもの) |
使用例 (Db.Table)
// テーブルオブジェクト生成 + テーブル作成 var Data = new Grease.Db.Table('mydatabase', 'Data', 'id'); Data.db.execute('CREATE TABLE IF NOT EXISTS Data (id INTEGER PRIMARY KEY, name TEXT, age INT)'); // データ挿入 Data.insert({ name: 'Fannie', age: 20}); Data.insert({ name: 'Freddie', age: 30}); // データ更新 + 削除 Data.update({ age: 25 }, 'name = ?', ['Fannie']); Data.remove('id = ?', [10]); // データの取り出し var item = Data.find(1); var rows = Data.select().fetchAll(); var names = Data.select('WHERE age < ? ORDER BY age', [30]).fetchAll(1);
関連記事
- [JavaScript] サロゲートペアの扱い方をわかりやすくメモっておく
- [JavaScript] サロゲート・ペアに対応した文字列操作関数を書いてみた
- Google Gears を「滑らかに」使うためのライブラリ、Grease for Gears を公開しました
- [JavaScript] Gears オブジェクトをプロトタイプ継承すると Firefox が即死する件
- UUID.js を CodeRepos に放流しました
トラックバック URL
- http://liosk.blog103.fc2.com/tb.php/159-7bdb93e5