Google Gears を「滑らかに」使うためのライブラリ、Grease for Gears を公開しました

Google Gears を「滑らかに」使うためのライブラリ、Grease for 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
Grease.ManagedStore.create(string name [, string requiredCookie])
返り値拡張された GearsManagedResourceStore
引数GearsLocalServer#createManagedStore() と同じ
説明拡張された GearsManagedResourceStore オブジェクトを生成する
Grease.ManagedStore.remove(string name [, string requiredCookie])
返り値void
引数GearsLocalServer#removeManagedStore() と同じ
説明GearsLocalServer#removeManagedStore() のショートカット
拡張された GearsManagedResourceStore

通常の GearsManagedResourceStore オブジェクトのメソッドのほかに、以下のメソッドを使えます。

GreasedManagedResourceStore.manifest([string url])
返り値引数を渡さない場合は manifestUrl の値、引数を渡した場合は this を返す
引数url - manifestUrl の値
説明jQuery 風の getter/setter メソッド; 引数を渡さない場合は manifestUrl の値を返し、引数を渡した場合は manifestUrl に値をセットして this を返す
GreasedManagedResourceStore.update([string url [, object options]])
返り値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
Grease.Db.create(string name)
返り値拡張された GearsDatabase
引数name - 開くデータベースの名前
説明拡張された GearsDatabase オブジェクトを生成して、データベースを開く
拡張された GearsDatabase
GreasedDatabase.query(string sql [, Array args])
返り値拡張された GearsResultSet オブジェクト
引数sql - 実行する SQL 文
args - プレースホルダ ('?') に代入する値の配列
説明GearsDatabase#execute() のラッパー; 拡張された GearsResultSet オブジェクトを返す
GreasedDatabase.insert(string table, object data)
返り値変更された行数
引数table - 挿入対象のテーブル名
data - 挿入するデータ (カラム名 - カラム値のペア)
説明INSERT 文を実行する
GreasedDatabase.update(string table, object data [, string where [, Array extra]])
返り値変更された行数
引数table - 更新対象のテーブル名
data - 更新するデータ (カラム名 - カラム値のペア)
where - 更新対象を指定する WHERE 句
extra - WHERE 句に含まれるプレースホルダ ('?') に代入する値の配列
説明UPDATE 文を実行する
GreasedDatabase.remove(string table [, string where [, Array extra]])
返り値変更された行数
引数table - 削除対象のテーブル名
where - 削除対象を指定する WHERE 句
extra - WHERE 句に含まれるプレースホルダ ('?') に代入する値の配列
説明DELETE 文を実行する
拡張された GearsResultSet
GreasedResultSet.fetch()
返り値現在の行データの連想配列
説明現在の行を連想配列として取り出して、ポインターを次へ進める
GreasedResultSet.fetchColumn(int col)
返り値現在の行データのうち、col で指定したカラム番号の値
引数col - 取り出したいカラムの番号
説明現在の行から、一カラムの値を取り出してポインターを次へ進める
GreasedResultSet.fetchAll([int 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
new Grease.Db.Table(string|GearsDatabase db, string table, string primary)
返り値Grease.Db.Table オブジェクト
引数db - データベース名 or GearsDatabase オブジェクト
table - テーブル名
primary - 主キーカラムの名前
説明Grease.Db.Table オブジェクトを生成する
Grease.Db.Table.find(string id)
返り値行データ (連想配列) or null
引数id - 主キーカラムの値
説明主キーカラムの値でデータを検索する (見つからない場合は null を返す)
Grease.Db.Table.select(string cond [, Array args])
返り値拡張された GearsResultSet オブジェクト
引数cond - WHERE 句、ORDER BY 句など
args - cond の中で使われているプレースホルダに代入する値の配列
説明指定した条件でテーブル内を検索する ('SELECT * FROM TableName'cond を結合して実行する)
Grease.Db.Table.insert(object data)
返り値変更された行数
引数data - 挿入するデータ (カラム名 - カラム値のペア)
説明INSERT 文を実行する (GreasedDatabase#insert() のテーブル名を束縛したもの)
Grease.Db.Table.update(object data [, string where [, Array extra]])
返り値変更された行数
引数data - 更新するデータ (カラム名 - カラム値のペア)
where - 更新対象を指定する WHERE 句
extra - WHERE 句に含まれるプレースホルダ ('?') に代入する値の配列
説明UPDATE 文を実行する (GreasedDatabase#update() のテーブル名を束縛したもの)
Grease.Db.Table.remove([string where [, Array extra]])
返り値変更された行数
引数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);
スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/159-7bdb93e5

トラックバック

コメント

コメントの投稿

お名前
コメント
編集キー