/[A3C]/lib/A3C/SQL.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /lib/A3C/SQL.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 82 by dpavlin, Sat Apr 12 10:28:38 2008 UTC revision 233 by dpavlin, Mon Sep 1 18:44:33 2008 UTC
# Line 3  package A3C::SQL; Line 3  package A3C::SQL;
3  use strict;  use strict;
4  use warnings;  use warnings;
5    
6    use base qw(Jifty::Object Class::Accessor::Fast);
7    __PACKAGE__->mk_accessors( qw(query arguments dbh encoding duration) );
8    
9    use Data::Dump qw/dump/;
10    use Time::HiRes qw/time/;
11    
12  =head1 NAME  =head1 NAME
13    
14  A3C::SQL  A3C::SQL
# Line 17  Issue SQL queries Line 23  Issue SQL queries
23    
24    my $sql = A3C::SQL->new({ query => 'select now()' });    my $sql = A3C::SQL->new({ query => 'select now()' });
25    
26  =cut  As a alternative, if you don't want to use Jifty's database handle,
27    specify it like this:
28    
29  use base qw(Jifty::Object Class::Accessor::Fast);    my $sql = A3C::SQL->new({
30  __PACKAGE__->mk_accessors( qw(query arguments) );          query => 'select now()',
31            dbh => $my_dbh,
32            encoding => 'UTF-8',
33      });
34    
35  use Data::Dump qw/dump/;  Mungling with C<encoding> is rearly needed, especially if using recent C<DBD::Pg> as driver.
36    
37  =head2 sth  =head2 sth
38    
# Line 33  Execute query and return statement handl Line 43  Execute query and return statement handl
43  sub sth {  sub sth {
44          my $self = shift;          my $self = shift;
45          if ( ! $self->{_sth} ) {          if ( ! $self->{_sth} ) {
46                  my $dbh = Jifty->handle->dbh;                  my $dbh = $self->dbh || Jifty->handle->dbh;
47                  my $sth = $dbh->prepare( $self->query ) or $dbh->errstr;                  my $sth = $dbh->prepare( $self->query ) or $dbh->errstr;
48                    my $t = time();
49                  if ( $self->arguments ) {                  if ( $self->arguments ) {
50                          Jifty->log->debug( $self->sql . ' arguments: ' . dump( $self->arguments ) );                          Jifty->log->debug( $self->sql . ' arguments: ' . dump( $self->arguments ) );
51                          $sth->execute( $self->arguments ) or $dbh->errstr;                          $sth->execute( $self->arguments ) or die $dbh->errstr;
52                  } else {                  } else {
53                          $sth->execute or $dbh->errstr;                          $sth->execute or die $dbh->errstr;
54                  }                  }
55                    $self->duration( time() - $t );
56                  $self->{_sth} = $sth;                  $self->{_sth} = $sth;
57          }          }
58    
# Line 59  sub next { Line 71  sub next {
71          my $self = shift;          my $self = shift;
72          my $row = $self->sth->fetchrow_hashref;          my $row = $self->sth->fetchrow_hashref;
73          return unless defined $row;          return unless defined $row;
74          return A3C::SQL::row->new( $row );  #       $self->log->debug( dump( $row ) );
75            return A3C::SQL::row->new( $row, $self->encoding );
76  }  }
77    
78  =head2 count  =head2 count
# Line 73  sub count { Line 86  sub count {
86          return $self->sth->rows;          return $self->sth->rows;
87  }  }
88    
89    =head1 HELPERS
90    
91    This helpers are accessor to L<DBI>
92    
93    =head2 _column_names
94    
95      my @columns = $sql->_column_names;
96    
97    =cut
98    
99    sub _column_names {
100            my $self = shift;
101            return @{ $self->sth->{NAME} };
102    }
103    
104  package A3C::SQL::row;  package A3C::SQL::row;
105    
106  use Encode qw/decode/;  use Encode qw/decode/;
107  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
108    use base qw/Jifty::Object/;
109    
110  our $AUTOLOAD;  our $AUTOLOAD;
111    
# Line 85  sub new { Line 114  sub new {
114          my $class = ref($that) || $that;          my $class = ref($that) || $that;
115          my $self = shift;          my $self = shift;
116          bless $self, $class;          bless $self, $class;
117            $self->{__encoding} = shift || 'UTF-8';
118          return $self;          return $self;
119  }    }  
120    
121  sub AUTOLOAD {  sub AUTOLOAD {
122          my $self = shift;          my $self = shift;
123          my $type = ref($self) or die "$self is not an object";          my $type = ref($self) or die "$self is not an object";
124          my $name = $AUTOLOAD;          my $name = lc($AUTOLOAD);       # DBI lowercase columns so we do same for accessors
125          $name =~ s/.*://;          $name =~ s/.*://;
126  #       warn "SQL: $name doesn't exist" unless defined($self->{$name});          my $v = $self->{$name};
127          return decode('UTF-8', $self->{$name});          Jifty->log->error("SQL: $name doesn't exist") unless defined $v;
128            if ( ! Encode::is_utf8( $v ) ) {
129                    eval { $v = decode( $self->{__encoding}, $self->{$name} ) };
130                    if ( $@ ) {
131                            warn "## column $name can't decode ",dump( $self->{$name} );
132                            $v = $self->{$name};
133                    }
134            }
135            return $v;
136  }  }
137    
138  sub DESTROY {}  sub DESTROY {}

Legend:
Removed from v.82  
changed lines
  Added in v.233

  ViewVC Help
Powered by ViewVC 1.1.26