DataMapper用のDataStoreアダプター、dm-datastore-adapter-0.2.2をリリースしました。

今回のリリースで以下のような機能がサポートされます。

  • トランザクション
  • OR条件
    ruby>>
    Post.all(:id => [1,2,3])
    <<--
    のような事が出来るようになりました。
  • NOT条件
    ruby>>
    Post.all(:updated_at.not => nil)
    Post.all(:id.not => 3)
    <<--
    などが出来るようになりました。

DataMapperのアダプタとして主に必要な機能はだいたい揃ってきました。

デモサイトであるWatchMe!もアップデートしています。

まだ実用的なサービスになってないですが、登録したサイトをクローリングして全てのページの監視を行い、エラーが発生したらメールで知らせるサービスになる予定です。

posted by genki genki on Fri 17 Apr 2009 at 04:29 with 8 comments
taigou taigou 08/14 02:39
はじめまして。dm-datastore-adapter-0.2.4のtransactionに関して質問させてください。下記クラスメソッドにモデルオブジェクトを更新するブロックを渡して実行させた際、NoMethodError: undefined method primitive_for for DataMapper::Adapters::DataStoreAdapter::Transaction:0x707730b7となりました。datastore-adapter.rbのds_service_getメソッドでcurrent_transactionを取得した後、呼び出そうとしています。下記の記述に誤り等ありますでしょうか?

class GaeTransaction
def self.transaction
begin
txn = DataMapper.repository(:datastore).adapter.transaction_primitive
txn.begin
DataMapper.repository(:datastore).adapter.push_transaction(txn)
yield
DataMapper.repository(:datastore).adapter.pop_transaction
txn.commit
rescue
pp $@
p $!
txn.rollback
ensure
txn.close
end
end
end
瀧内元気 瀧内元気 08/14 12:09
以下のような使い方でも同じような問題が発生しますでしょうか?

ruby>>
Post.transaction do
# some code goes here
end
<<--
taigou taigou 08/14 22:13
以下のように、defaultのAdapterがセットされていない、とおこられます。
ちなみに、DataMapper.setup(:datastore, :adapter => :datastore, :database => 'gae_sample')を設定しています。また、Rails + DataMapper です。

Adapter not set: default. Did you forget to setup?
--gems/dm-core-0.9.11/lib/dm-core/repository.rb:28:in `adapter'
--gems/dm-core-0.9.11/lib/dm-core/transaction.rb:50:in `link'
--gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:in `each'
--gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:in `link'
--gems/dm-core-0.9.11/lib/dm-core/transaction.rb:52:in `link'
--gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:in `each'
--gems/dm-core-0.9.11/lib/dm-core/transaction.rb:44:in `link'
--gems/dm-core-0.9.11/lib/dm-core/transaction.rb:20:in `initialize'
--gems/dm-core-0.9.11/lib/dm-core/model.rb:510:in `transaction'
--gae-sample-3/app/controllers/products_controller.rb:63:in `update'
瀧内元気 瀧内元気 08/15 03:52
DataStoreAdapter以外のアダプターを使った場合は正常に動作しますか?
taigou taigou 08/16 04:27
Rails + DataMapper + sqlite3で試してみましたが、トランザクションは正常に動作しました。

ちなみに、DataMapper.setup(:datastore,・・・と設定した場合に、モデルクラスのrepositoriesが以下のようになっているのは、正しい姿なのでしょうか?
「@name=:default」があるために「Adapter not set: default」となるのかと。

DataMapper::Repository:0x591431e8 @identity_maps={}, @name=:datastore
DataMapper::Repository:0x32f9286d @identity_maps={}, @name=:default
DataMapper::Repository:0x3cd2640 @identity_maps={}, @name=:datastore

お手数おかけして申し訳ありません。よろしくお願いします。
瀧内元気 瀧内元気 08/16 07:22
:datastoreの指定をせずに、デフォルトとして使ってみるとどうでしょうか?
taigou taigou 08/16 11:42
ご指摘の通り、デフォルト指定で正常に動作しました。ありがとうございます。
しかし、なぜデフォルトでうまくいくのかよく理解できていないので、ソースよく読みます。たびたびお手数おかけして申し訳ございませんでした。
瀧内元気 瀧内元気 08/16 14:20
良かったです :-)