[Dbix-class] How to find updated fields

RA Jones ra.jones at dpw.clara.co.uk
Sat Mar 24 10:09:43 GMT 2007


Guillermo Roditi wrote:
> yeah, that's my distribution. and really, its not that hard. just make
> the file and overload the appropriate subs, load the component and
> ta-da
So I created a very simple overloaded insert() method as described in 
DBIx::Class::Manual::Component, in a new module called DBIx::Class::CRUD

package DBIx::Class::CRUD;
use base qw/DBIx::Class/;

sub update {
  my $self = shift;

  my %dirty_cols = $self->get_dirty_columns;
  use Data::Dumper; # open $fh here
  print $fh Dumper %dirty_cols;
  return $self->next::method( @_ );
}

And in MyApp::Schema::MyClass:
__PACKAGE__->load_components(qw/PK::Auto CRUD Core/);

But %dirty_cols is empty. The DBIC::CRUD::insert method *is* being 
called as a) I can dump $self to output, where there is no entry for 
anything resembling get_dirty_columns, and b) entry confirmed with 
$c->log->info( join "\n" => Class::C3::calculateMRO('Schema::MyClass') ):

Schema::Location, DBIx::Class::CRUD, DBIx::Class::Core, <a few more>, 
DBIx::Class::PK::Auto, etc.

I'm obviously *still* doing something wrong :-(
> 
> On 3/23/07, RA Jones <ra.jones at dpw.clara.co.uk> wrote:
>> Guillermo Roditi wrote:
>> > That's the code I would recommend using for a DBIx::Class component,
>> > which you would have to build, then load. this is a lot simpler than
>> > it seems. see DBIx::Class::DigestColumns on the 'pan for an example of
>> > how to build a DBIC component.
>> This is a module you assisted in development? Are you suggesting I have
>> to write my own module to be able to use the get_dirty_columns method?
>>
>> > I can't really go through this exercise with you, but I assure you
>> > it's not ThatHard. it just takes some diving in.
>> I'm quite prepared to 'dive in' if that is what is necessary. But I feel
>> sure it *will* be ThatHard!
>>
>> > On 3/23/07, RA Jones <ra.jones at dpw.clara.co.uk> wrote:
>> >> Guillermo Roditi wrote:
>> >> > I think you could possibly implement this as a component that wraps
>> >> > update, delete, or insert and the use get_dirty_columns et al.
>> >> >
>> >> > eg
>> >> >
>> >> > sub update{
>> >> >    my ( $self, $upd, @rest ) = @_;
>> >> >    my %cols = $obj->get_dirty_columns;
>> >> >    %cols = (%cols, %$upd) if( ref $upd );
>> >> >    warn( "Updated: ". join(", ", keys %cols)  );
>> >> >    $self->next::method($upd, @rest);
>> >> > }
>> >>
>> >> Well I cannot get this to work. I'm using catalyst and formbuilder, 
>> and
>> >> doing the update like:
>> >>
>> >> $form->update($fields);
>> >>
>> >> That works OK, but if I try to capture the result of the action:
>> >>
>> >> my $r = $form->update($fields);
>> >>
>> >> and dump $r to file, get_dirty_columns does not exist, the closest is
>> >> _dirty_columns which is an undefined hashref:
>> >>
>> >> $VAR1 = bless( {
>> >>    'related_resultsets' => {},
>> >>    '_orig_ident' => undef,
>> >>    '_dirty_columns' => {},
>> >>    etc,
>> >>
>> >> Am I missing something obvious here?
>> >>
>> >> > On 3/22/07, RA Jones <ra.jones at dpw.clara.co.uk> wrote:
>> >> >> Rob Kinyon wrote:
>> >> >> > On 3/22/07, RA Jones <ra.jones at dpw.clara.co.uk> wrote:
>> >> >> >> In my applications I frequently record in a log file which 
>> fields
>> >> >> >> were updated by which users. Is there an easy way in DBIC to 
>> find
>> >> >> >> out which fields got updated during an update() or
>> >> >> >> update_or_insert() action? Thanks.
>> >> >> >
>> >> >> > Look for the get_dirty_columns() method on the Row object.
>> >> >> Thanks, I had just scanned the DBIC::Row manual, and managed to 
>> miss
>> >> >> that one - is_changed() looked promising, but it appears to be only
>> >> for
>> >> >> uncommitted changes.
>> >> >> --
>> >> --
>> >> Richard Jones
>> >> Leeds, UK
>> >> ra.jones(at)dpw.clara.co.uk
-- 
Richard Jones
Leeds, UK
ra.jones(at)dpw.clara.co.uk



More information about the Dbix-class mailing list