Hatena::ブログ(Diary)

IT-Walker on hatena このページをアンテナに追加 RSSフィード

2009-07-28 HTML5 Web Database向けのO/R Mapperを書いてみました。

HTML5 Web Database向けのO/R Mapper「AlexRecord」を書いてみました。

詳しいドキュメントとダウンロードこちらから。

オンラインデモはこちらから(要WebDatabase・・・つまりSafari4で見てください)

AlexRecordってプロダクトをリリースしました。

HTML5 Web DatabaseをベースとしたO/R Mappingフレームワークです。


コーディングに要した作業時間は1.5日くらいなんで、テストは甘甘で、ソースは汚いです。。

が、一応いろいろできるようにはしてあります。



AlexRecordを用いると、文字列操作をガリガリ行ってSQLを組み立てる手間が必要なくなり、オブジェクト指向的なプログラミングが促進されます。以下の例では書籍テーブル(Book)に一対一で対応するクラスを作成しています。


var Book = alex.record.Class({
  tableName: "Book",
  columns: [
    {name: "title", type: "string", notNull: true},
    {name: "price", type: "integer", notNull: true},
    {name: "ISBN", type: "string"}
  ]

このBookクラスを用いて、書籍テーブルにレコードを一件作成するには、以下のようにコーディングすることができます。

// レコードのインスタンスを作成
// 初期化と同時にプロパティに値を設定できる
var book = new Book({title: "Google Gearsスタートガイド"});

// 初期化後は、setterメソッドを用いて値を設定できる
book.setPrice(2000);

// レコードの保存。結果は非同期で取得
book.save(function(result, error) {
  if (error) {
    // エラー処理
  }
  alert("データの保存に成功しました!");
});

一番の特徴はやはりWeb Databaseへの対応です。Web Databaseにおける基本的なDB操作は全て非同期なため、AlexRecordのAPIは非同期処理が基本です。なので、上のコードでもsave()の結果は非同期コールバックによって受け取ります。

Web Database仕様においては、ワーカ内でのみ使用できる同期処理API(openDatabaseSync())も存在しますが、現時点においては実装しているブラウザが存在しないため、alex.recordでも実装を見送っています(将来的にはサポートを予定しています)。

他にはこんなことができます。

// テーブル作成
Book.createTable();

// レコードをIDで取得
Book.find(1, function(book, error) {
  ...
});

// 条件を指定して書籍を検索。結果はResultSetで取得
Book.filter("price > ?", 1000).fetch(resultSet, error) {
  resultSet.each(function() {
    var book = resultSet.record(Book);
    ...
  });
});

// 条件やorder by、limitを指定して書籍を検索。結果はBook型で取得。
Book.filter("price > ?", 1000).orderBy("rowid").limit(100).fetchRecords(books, error) {
  for (var i = 0; i < books.length; i++) {
    ...
  }
});

詳しいドキュメントとダウンロードこちらから。

まだまだ始まったばかりのプロジェクトなんで、足りない機能やバグがいっぱいありますが、興味があったら触ってみてください。

フィードバック大歓迎です。


あと、このフレームワークのアイデアはUriel KatzさんのJStORMから得ています。

フレームワークは開発が終了したのか、プロジェクトページにアクセスできません。

また、Gears前提なので同期APIしかありませんでしたので、AlexRecordを作るに至りました。

着想を与えてくれたUrielに深く感謝します。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。