[Dbix-class] counter handling

Jim Spath jspath at pangeamedia.com
Mon Feb 26 20:46:12 GMT 2007


I have a MySQL table of counter values.  Without using DBIx::Class, I 
would use MySQL's handy "ON DUPLICATE KEY UPDATE" functionality to 
easily and safely increment these counter values.

Since I am using DBIx::Class, I cannot use this functionality, and have 
to handle the incrementing functionality myself:
http://www.mail-archive.com/dbix-class@lists.rawmode.org/msg01010.html

I am somewhat new to DBIx::Class and was wondering if the following 
method is the best way to handle counter values.  I've tested it, and it 
works, but wasn't sure if there was a better way.

==================================================
(all model, table, and column names are made up)
(I'm using DBIx::Class under Catalyst, hence the $c)
==================================================

my $rows = $c->model('SomeDB::Counter')->search({
   counter_name => $counter_name,
})->update({
   counter => \'counter + 1',
});

if ($rows eq '0E0') {

   eval {
     $c->model('SomeDB::Counter')->create({
       counter_name => $counter_name,
       counter      => 1,
     });
   };

   if ($@) {
     if ($@ =~ /duplicate entry/i) {

       $rows = $c->model('SomeDB::Counter')->search({
         counter_name => $counter_name,
       })->update({
         counter => \'counter + 1',
       });

       if ($rows eq '0E0') {
         # couldn't update or insert counter
       }

     } else {
       # unknown error on attempted insert
     }
   }
}




More information about the Dbix-class mailing list