Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2008-06-03><

Statement は close する前に finalize() する

| 17:47 |  Statement は close する前に finalize() する - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Statement は close する前に finalize() する - Ci.nsIZIGOROu

忘れちゃダメだかんね!

finalize()し忘れるとFILEがロックされっぱになってclose()でコケます。

もしwrapper作るならclose, createStatementにそれぞれ wrap して、close()の時にfinalize()してないstatementがあれば全部やるとかやった方がいいっぽぃ。

nsIPropertyBag, nsISimpleEnumerator, nsIProperty

| 14:07 |  nsIPropertyBag, nsISimpleEnumerator, nsIProperty - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsIPropertyBag, nsISimpleEnumerator, nsIProperty - Ci.nsIZIGOROu

nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会 の続き。

キーの列挙は nsIPropertyBag.enumerator を他の変数に使うたびに代入して行う。

コードとしては下記のような感じになるかなと。

var props = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag);
// 中略、ここでキーに色々入れる
var iterator = props.enumerator;
while (iterator.hasMoreElements()) {
  with ({prop: iterator:getNext()}) {
    prop.QueryInterface(Ci.nsIProperty);
    // 以下略
  }
}

hasMoreElements() で確認して getNext() するんだけど、この際にnsISuportsで返ってくるんだけど、nsIProperty を実装したオブジェクトが返ってくるので QueryInterface で型変換する。

name, valueと言うメンバ変数がreadonlyで提供されるので、これで元のhashのキーと値が取れる寸法。

インターフェース操作、要するにQueryInterfaceを何度か駆使しなきゃいけないのは面倒だけど、こうしてJSオブジェクトが突っ込めるハッシュがあると便利だな。


nsIWritablePropertyBag と wrappedJSObject

| 13:30 |  nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu

d:id:fls さんに教えて貰った wrappedJSObject と nsIWritablePropertyBag についてです。

準備

function wrapped(obj) {
  return { wrappedJSObject: obj };
}

とか定義しておく。

実験

var props = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag);
var data = {a: 1, b: 2};
props.setProperty("foo", data);
props.setProperty("bar", wrapped(data));

とした時に、getPropertyしたらどうなるかと言う話。

Fx2
props.getProperty("foo")
[xpconnect wrapped nsISupports]{QueryInterface: function() {}}

となり、props.getProperty("foo").a とか取れません。

一方で wrappedJSObject しておくと、

props.getProperty("bar");
// [xpconnect wrapped nsISupports] — {QueryInterface: function() {…}}
props.getProperty("bar").wrappedJSObject;
// [object Object] — {a: 1, b: 2}

と言う訳で wrappedJSObject プロパティが出来てます。

Fx3

こっちはgetPropertyした時点で生のJSオブジェクトが帰って来ます。つまり

props.getProperty("foo").a; // 1
props.getProperty("bar").wrappedJSObject.a; // 1

便利になったけど、互換性のある書き方としては後者のwrappedJSObjectを使う場合ですね。

まとめ

と言う訳でwrappedJSObject使うと幸せになれます^^


joinした際に重複するカラム名がある場合、区別が出来ない件

| 13:03 |  joinした際に重複するカラム名がある場合、区別が出来ない件 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  joinした際に重複するカラム名がある場合、区別が出来ない件 - Ci.nsIZIGOROu

例えば以下のようなクエリがあるとする。

SELECT * FROM Foo, Bar WHERE Foo.name = Bar.name;

当然両者にnameと言うカラムがあるんだけど、これが Storage だと区別が付けられない。

もちろんそれぞれのカラムインデックスが振ってあるので mozIStorageValueArray の get系メソッドインデックス指定すれば問題無いのですが、意図的に区別しないといけないので厄介過ぎる件。

まぁこのように実際にjoin時のキーになるなら同じ値であるから問題無いんですが、

  • mozIStorageStatementWrapper で
  • joinのキーになってない、つまり同じ値じゃない同じ名前のカラムが複数ある

って場合は mozIStorageStatementWrapper じゃ成り立たない気がする。

明後日以降に試してみる。

ゲスト



トラックバック - http://moz-addon.g.hatena.ne.jp/ZIGOROu/20080603