The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# this is of historical interest at best ;) well, actually the
# calls to fancydie are quite nice...

my %_sql_st;

sub sql_exec($;@) {
   my $statement = shift;
   my $st = $_sql_st{$statement};
   unless($st) {
      $st = $db->prepare($statement) or fancydie "unable to prepare statement", $statement;
      $_sql_st{$statement} = $st;
   }
   if (ref $_[0]) {
      my $bind = shift;
      $sql_exec = $st->execute(@_) or fancydie $db->errstr, "Unable to execute statement `$statement` with ".join(":",@_);
      $st->bind_columns(@$bind) or fancydie $db->errstr, "Unable to bind_columns to statement `$statement` with ".join(":",@_);
   } else {
      $sql_exec = $st->execute(@_) or fancydie $db->errstr, "Unable to execute statement `$statement` with ".join(":",@_);
   }
   $st;
}

sub sql_fetch {
   my $r = &sql_exec->fetchrow_arrayref;
   $r ? wantarray ? @{$r}
                  : $r->[0]
      : ();
}

sub sql_fetchall {
   my $r = &sql_exec->fetchall_arrayref;
   ref $r && @$r ? @{$r->[0]}==1 ? map @$_,@$r
                                 : @$r
		 : ();
}

sub sql_exists($;@) {
   my $select = shift;
   my @args = @_;
   $select = "select count(*) > 0 from $select limit 1";
   @_ = ($select, @_);
   goto &sql_fetch;
}