Hello,
I discovered an interesting bug/feature, in which a template seems to be
executing an SQL insert without that being intended or even visible in the
code! I think it's worth explaining exactly what's going on so please pardon
the length.
In my Apache/FastCGI/Catalyst/MySQL/TT/DBIx::Class application (called CatMgr)
I have Customer and Transaction objects. An admin portal shows a list of recent
transactions, which are created when an Instant Payment Notification from
PayPal says a payment was made.
Anyway, the transaction table has a field called customer storing the ID of a
record in the customer table. I specify the relation ORMwise in
CatMgrDB/Transaction.pm with:
__PACKAGE__->belongs_to( customer => CatMgrDB::Customer );
I decided to be clever (boom) and get the template, which is only handed a
resultset with rows from the transaction table, to look up the company name of
the associated Customer (r.customer.b_company, where r is a row in the
resultset) and not have to make a more complicated search statement in the
controller.
The thing is, then I decided to let admins add new transactions without an
associated customer, to record in the database transactions that were made
offline. Instead of assigning r.customer to the id of the company running the
system I just say 0 (not using nulls). What happens is, somehow the template
forces Catalyst (DBIx::Class) to create a NEW CUSTOMER if there wasn't one
already. This is bad, bad, bad. Every time an admin views the list of
transactions, it seems I get 4 blank customer records silently added
simultaneously, or maybe even more, depending on what kind of records are shown
on the current page it seems. I discovered this by matching the FastCGI error
log (which is where the -Debug output goes.. all 300MB of it...) against the
modification date of the new customer records.
It seems like I need a cascading_inserts => 0 style attribute here, though I
can hack around it but I would like to know what the right way to deal with
this. If I can leave the code as is and toggle a single attribute (maybe I
should remove that belongs_to or convert it to a might_have?) that would be
nice. It seems to be an easy pitfall. I can't find any documentation about a
relation forcing objects to autovivify, it seems like a bug. Can anyone comment
on this?
Thanks,
Matt
____________________________________________________________________________________
Need a vacation? Get great deals
to amazing places on Yahoo! Travel.
http://travel.yahoo.com/
_______________________________________________
List: [email protected]
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/