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/[email protected]/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
    }
  }
}


_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to