RhinoからDBを使う為のラッパーのAPIを決めた。

方針としては
- お手軽に使える事。DBのカラム==JSのプロパティとして扱える。
- 性能は考慮しない。性能が要求される場合はJDBCに逃げる。
- ややこしい SQL はそのまま渡せる。SQL を隠蔽することはしない。
とした。


テーブルの生成はこんな感じ。

var db = new DataBase(dataSource);
db.createTable("table_name", {
pkey: "integer NOT NULL GENERATED ALWAYS AS IDENTITY primary key",
title: "varchar(100)",
genre: "varchar(20)",
making_year: "varchar(20)",
country: "varchar(40)",
avg_point: "integer",
max_point: "integer",
min_point: "integer",
datetime: "timestamp",
description: "varchar(2000)"
});



行の挿入はこんな感じ。
- デフォルトが有る場合は省略可。
- 存在しないカラムは現状はエラー。チェックは重そうなので。

var db = new DataBase(dataSource);
db.insert("table_name", {
title: "ほげほげ",
genre: "hoge",
making_year: "2000",
country: "日本",
datetime: "2009-11-28 10:57:25",
description: "ほげほげーほげほげ"
});
db.close();


行の更新はこんな感じ
- UPDATE table_name SET description="ほげ" WHERE pkey=1

var db = new DataBase(dataSource);
var title_id = 1;
db.update("table_name", {description: "ほげ"}, {pkey: title_id});
db.close();



SELECTはこんな感じ。
- SELECT FROM table_name WHERE genre="hoge" ODER BY datetime ASC

var db = new DataBase(dataSource);
var sel = db.select("table_name", {genre: "hoge"}, {datetime: "ASC"});
var json = sel.getRows(1, 20);
db.close();
/*
json = [
{pkey:1, title:"ほげほげ", genre: "hoge", making_year:"2000", …},
:
];
*/


try-catch-finally で DB接続 -> commit/rollback をするラッパーを用意しておく。
こんな感じ。

EigaDB.addTitle = function(params) {
return DataBase.transaction(DATA_SOURCE, function(db) {
db.insert(TITLES, params);
});
}



その他、細かい関数も追加して実装した。
DBのレコードがそのまんま JavaScript のオブジェクトとして扱えるのはかなり楽だ。
RPJSを経由する事で DBとクライアントがほぼ直通になる。

実装は /lib/DataBase.js になるがリリースは次の版で。